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

Server-side function throws a php error when accessed through ajax

本文关键字:php 错误 访问 ajax 函数 服务器端      更新时间:2023-09-26

我正在使用CodeIgniter-Bonfire的web应用程序,让网站管理员验证或不验证用户的"东西"(如姓名和工作经验)。管理员可以从下拉列表中选择"验证"或"不验证"。当下拉列表的值发生变化时,将向服务器发出ajax调用。然后,服务器向javascript回显一些值,javascript将其插入视图页面。

一切正常——数据库被相应地改变了,回显的值是正确的——但是javascript现在也捕获了来自服务器端的错误消息。

错误是:Trying to get property of non-object.

我在可能发生错误的地方前后都做了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);
});

函数验证如下:

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;
}

由于错误行上唯一的对象是$item对象,这可能意味着该项未设置或至少不是对象(可能为null或false)。因为find_by方法返回的是第一个匹配的对象,所以我猜测过滤器根本不匹配任何东西。

你说你在前后都做了回声。你对那件事有把握吗?尝试var_dump或print_r ` ing $item,看看会得到什么结果。如果没有收到预期的对象,请验证传递给find_by函数的参数是否正确。(可能由于某些原因,user_id没有正确传递,假设这可能是cookie或会话过期或类似的东西传递)

$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)
    {
    }
});

你也可以抛出'error'函数。

你可以使用json返回警告消息取决于什么是成功的,什么不是。您还可以使用try catch并返回异常消息,这样您就可以更容易地找出不工作的地方。基本上你想处理这个错误,你不希望页面重新加载,所以你必须完全控制你的代码。

您可以返回一个json对象,并在服务器上创建后将其刷新到客户端:

echo json_encode($json);
flush();

错误是我的页面中有三个函数以:

$(document).on('change', '.verified', function(event) {...});

包含上面javascript的视图中有标签,每个标签执行一个模块::run,调用不同的模块/控制器/函数。这导致了三个不同的视图被排列(并因此被加载),如:files | references | other.

视图基本上做了同样的事情:让管理员验证或取消验证用户的"东西"。为了偷懒,我将一个视图中的select标签复制并粘贴到另一个视图中,这样它们看起来就像这样:

<select name='verified' class='verified' id='100'>
    <option value=1>Yes</option>
    <option value=0 selected = 'selected'>No</option>
</select>

(id根据项目不同而不同)。注意类名"verified"

我还复制了javascript,并只做了轻微的调整(如将url中的"文件"更改为"文档"或"其他")。因此,现在当我尝试验证id为2000的"引用"项时,显然是这样的:

$(document).on('change', '.verified', function(event) {
触发了

,但这是加载了"files"选项卡的那个。因此,现在服务器端代码正在查找id为2000的"文件",该文件不存在,因此PHP错误试图访问非对象的属性。