0

サイト管理者がユーザーの「もの」(名前や職歴など) を検証または未検証できるようにする Web アプリケーションに CodeIgniter-Bonfire を使用しています。管理者は、ドロップダウン リストから [確認] または [未確認] を選択するだけです。ドロップダウン リストの値が変更されると、サーバーに対して 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 または print_r を実行して、結果を確認してください。予期したオブジェクトを受け取っていない場合は、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 に答える