当通过ajax访问时,服务器端函数抛出php错误

时间:2013-04-18 18:39:40

标签: php javascript jquery ajax jquery-ui-tabs

我正在使用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;
}

3 个答案:

答案 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错误。