通过ajax访问时,服务器端函数抛出一个php错误
我将CodeIgniter Bonfire用于一个web应用程序,该应用程序允许站点管理员验证或取消验证用户的“资料”(如姓名和工作经验)。管理员可以从下拉列表中选择“验证”或“未验证”。当下拉列表的值更改时,将对服务器进行ajax调用。然后服务器向javascript回显一些值,javascript将其插入到视图页面中 一切正常——数据库也相应地发生了更改,回显的值是正确的——但是javascript现在也捕获了来自服务器端的错误消息 错误是:通过ajax访问时,服务器端函数抛出一个php错误,php,javascript,jquery,ajax,jquery-ui-tabs,Php,Javascript,Jquery,Ajax,Jquery Ui Tabs,我将CodeIgniter Bonfire用于一个web应用程序,该应用程序允许站点管理员验证或取消验证用户的“资料”(如姓名和工作经验)。管理员可以从下拉列表中选择“验证”或“未验证”。当下拉列表的值更改时,将对服务器进行ajax调用。然后服务器向javascript回显一些值,javascript将其插入到视图页面中 一切正常——数据库也相应地发生了更改,回显的值是正确的——但是javascript现在也捕获了来自服务器端的错误消息 错误是:试图获取非对象的属性。 我在错误发生之前和之后都做
试图获取非对象的属性。
我在错误发生之前和之后都做了echo,但是对象打印出来的很好。我不知所措,因为这以前不曾发生过
真正令人讨厌的是,错误似乎是随机发生的。当验证从“已验证”转到“未验证”,或者从“已验证”转到“未验证”。有时错误会在回显值之前打印出来,有时它会自动消失(但不会在一瞬间显示出来)
先谢谢你
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);
});
函数verify如下所示:
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;
}
<select name='verified' class='verified' id='100'>
<option value=1>Yes</option>
<option value=0 selected = 'selected'>No</option>
</select>
由于错误行上唯一的对象是$item对象,这可能意味着该项未设置或至少不是一个对象(可能为null或false)。由于find_by方法返回第一个匹配的对象,我猜筛选器根本不匹配任何内容 但是,您确实说您在前后都做了回音。您确实确定吗?尝试对$item进行var_dump'ing或print_r'ing,看看结果如何。如果您没有收到预期的对象,请验证您传递给find_by函数的参数是否正确。(可能由于某些原因,用户_id没有正确传递,假设可能是某个cookie或会话传递的内容已过期或类似的内容) 是对象表示法,用于访问对象属性和方法 我的猜测是“已验证”没有正确定义,因此它不存在,至少没有以您期望的形式存在 你确定吗
$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)
{
}
});
错误在于,我的页面中有三个以以下开头的函数:
$(document).on('change', '.verified', function(event) {...});
包含上述javascript的视图中有多个选项卡,每个选项卡都有一个modules::run,调用不同的modules/controller/functions。这导致了三个不同的视图被排列(并因此被加载),如:files | references | other
视图基本上做了相同的事情:让管理员验证或取消验证用户的“东西”。在我的懒惰之旅中,我将选择标记从一个视图复制并粘贴到其他视图中,因此它们看起来都是这样的:
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;
}
<select name='verified' class='verified' id='100'>
<option value=1>Yes</option>
<option value=0 selected = 'selected'>No</option>
</select>
已触发,但这是使用“文件”选项卡加载的。因此,现在服务器端代码正在查找“文件”id为2000,但不存在,因此尝试访问非对象的属性时出现PHP错误。您确定
verified
是正确的属性名称吗?@RicardoLohmann是。对象如下所示:[id]=>130[user\u id]=>101[other\u table]=>profile\u files[other\u id]=>99[verified]=>0[verified_by]=>admin2[notes]=>需要验证[notes_time]=>[user_notes]=>这已得到回答。请参见下文。find_by肯定会在数据库中找到记录。stdClass对象([id]=>130[user_id]=>27[other_table]=>profile_文件[other_id]=>44[verified]=>0[verified_by]=>admin2[notes]=>需要验证[notes\u time]=>[user\u notes]=>)
我还需要包含哪些代码的其他部分?由$item组成的代码。我已经找出了错误。感谢您花时间!Yw,错误是什么?
$(document).on('change', '.verified', function(event) {