我正在使用CodeIgniter-Bonfire作为一个Web应用程序,让网站管理员验证或取消验证用户的“东西”(如姓名和工作经验)。管理员只需从下拉列表中选择“验证”或“取消验证”即可。当下拉列表的值更改时,将对服务器进行ajax调用。然后服务器向javascript回显一些值,将其插入到视图页面中。
一切正常 - 数据库相应更改,回显值正确 - 但javascript现在也从服务器端捕获错误消息。
错误是:Trying to get property of non-object.
我已经在错误发生之前和之后做了回声,但对象打印出来就好了。我不知所措,因为这不常发生。
真正令人烦恼的是错误似乎是随机发生的。可以是验证从验证到未验证,反之亦然。有时错误会在回显值之前打印出来,有时它会自动消失(但不会在瞬间显示之前。
提前谢谢。
javascript看起来像这样:
$(document).on('change', '.verified', function(event) {
var id = $(this).attr('id');
$.ajax({
type: "POST",
url: 'http://theurl.com/module/controller/verify/100/files/24'
}).done(function(msg) {
$('#timestamp_'+id).text(msg);
});
功能验证如下所示:
public function verify($user_id, $other_table, $other_id)
{
$this->load->model('profile/Verifiable_items_model', 'vi_model');
$item = $this->vi_model->find_by(array(
'user_id' => $user_id,
'other_table' => $other_table,
'other_id' => $other_id
));
$update_date = 0;
if ($item->verified == 0) // ERROR HERE
{
$update_date = date('Y-m-d H:i:s', time());
$data = array('verified' => 1, 'notes_time' => date('Y-m-d H:i:s', time()), 'verified_by' => $this->current_user->username);
}
else
{
$data = array('verified' => !($item->verified), 'notes_time' => NULL); // ERROR HERE
}
$this->vi_model->update($item->id, $data);
echo $update_date;
}
答案 0 :(得分:1)
由于错误行上唯一的对象是$ item对象,因此可能意味着该项未设置或至少不是对象(可能为null或false)。由于find_by方法返回匹配的第一个对象,我的猜测是过滤器根本不匹配任何东西。
然而,你确实说过你之前和之后都做过回声。你对此肯定吗?尝试var_dump'ing或print_r'ing $ item,看看它是什么。如果您没有收到预期的对象,请验证您在find_by函数上传递的参数,看它们是否正确。 (可能由于某种原因,user_id没有正确传递,假设可能是cookie或会话过期的东西或类似的东西)
答案 1 :(得分:1)
$item->verified
是对象表示法,用于访问对象属性和方法。
我的猜测是'已验证'未正确定义,因此它不存在,至少不是您期望它的形式。
你确定吗
$item
不是数组?
如果是这种情况,那么你可以使用数组表示法:
$item['prodname'];
但我想你比我们知道的更好。
基线:已验证可能从未定义过或未定义为对象或对象内。
如果您想要更具体的答案,那么您必须向我们展示其余的代码。
还要考虑使用ajax中的成功和完整功能:
var url = 'page.php';
$.ajax(
{
type : 'post',
url : url,
dataType : 'json',
data :
{
'requesting' : true,
},
success : function(data)
{
var success = '';
for(var i = 0; i < data.length; i++)
{
success = data[i].success;
}
},
complete : function(data)
{
}
});
你也可以输入'错误'功能。
您可以使用json返回警告消息,具体取决于成功和不成功的内容。您还可以使用try catch并返回异常消息,以便您更容易找到不起作用的内容。基本上你想要处理错误,你不希望页面重新加载,所以你必须完全控制你的代码。
您可以返回一个json对象,并在服务器上创建它后将其刷新到客户端:
echo json_encode($json);
flush();
答案 2 :(得分:0)
错误是我的页面中有三个函数以:
开头$(document).on('change', '.verified', function(event) {...});
包含上面javascript的视图中包含选项卡,每个选项卡都执行了一个模块:: run,它调用了不同的模块/控制器/函数。这导致三个不同的视图被排列(并因此加载),如:files |参考|其他
视图基本上做了同样的事情:让管理员验证或取消验证用户的“东西”。在我寻求懒惰的过程中,我将选择标记从一个视图复制并粘贴到其他视图中,以便它们看起来像这样:
<select name='verified' class='verified' id='100'>
<option value=1>Yes</option>
<option value=0 selected = 'selected'>No</option>
</select>
(根据项目,id会有所不同)。请注意班级名称“已验证”。
我还复制了javascript,只进行了一些小调整(比如将网址中的“文件”更改为“文档”或“其他”)。所以现在当我尝试验证id为2000的“引用”项时,显然是这样的:
$(document).on('change', '.verified', function(event) {
被触发,但这是用“文件”选项卡加载的那个。所以现在服务器端代码正在查找id为2000的“文件”,该文件不存在,因此尝试访问非对象的属性时出现PHP错误。