0

我正在将 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;
}
4

3 回答 3

1

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

但是,您确实说您在之前和之后都做过回声。你确定吗?尝试对 $item 进行 var_dump'ing 或 print_r'ing 并查看结果。如果您没有收到预期的对象,请验证您在 find_by 函数上传递的参数以查看它们是否正确。(也许由于某种原因 user_id 没有正确传递,假设可能是 cookie 或会话过期或类似的东西传递的东西)

于 2013-04-18T18:54:40.847 回答
1
$item->verified

是对象表示法,用于访问对象的属性和方法。

我的猜测是“已验证”没有正确定义,因此它不存在,至少不是您期望的形式。

你确定吗

$item 

不是数组吗?

如果是这种情况,那么您可以使用数组表示法:

$item['prodname'];

但我想你比我们更清楚它是什么。

基线:已验证可能从未定义过,或者它没有定义为对象或对象内。

如果您想要更具体的答案,那么您必须向我们展示其余的代码。

还可以考虑在 ajax 中使用 success 和 complete 函数:

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();
于 2013-04-18T18:55:53.647 回答
0

错误是我的页面中有三个函数,开头是:

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

包含上述 javascript 的视图中有选项卡,每个选项卡都有一个 modules::run 调用不同的模块/控制器/函数。这导致三个不同的视图被安排(并因此加载),如:文件 | 参考资料 | 其他。

这些视图基本上做了同样的事情:让管理员验证或取消验证用户的“资料”。为了变得懒惰,我将选择标签从一个视图复制并粘贴到其他视图中,使它们看起来像这样:

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

(id会根据项目不同)。注意类名“已验证”。

我还复制了 javascript 并且只做了一些小的调整(比如将 url 中的“文件”更改为“文档”或“其他”)。因此,现在当我尝试验证 id 为 2000 的“参考”项目时,显然是这样的:

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

被触发,但这是使用“文件”选项卡加载的那个。所以现在服务器端代码正在寻找一个 id 为 2000 的“文件”,它不存在,因此尝试访问非对象属性的 PHP 错误。

于 2013-04-18T19:47:40.720 回答