0

codeigniter で ajax を使用してデータベースからビューにデータを取得しようとしていますが、うまくいきません。grade_id をモデル関数に渡す際に問題が発生していると思います。

AJAX:

<script type="text/javascript">
    $(document).ready(function(){    
        $('#grades').change(function(){          
            $("#classes > option").remove(); 
            var grade_id = $('#grades').val();  
            $.ajax({
                type: "POST",
                url: "<?php echo base_url(); ?>index.php/login/get_classes/"+grade_id, 
                data: {gradeid:grade_id},
                success: function(classes) 
                {
                    $.each(classes,function(id,name) 
                    {
                        var opt = $('<option />'); 
                        opt.val(id);
                        opt.text(name);
                        $('#classes').append(opt); 
                    });
                }        
            });

        });
    });
</script>

コントローラ:

 function get_classes($gradeid)
{
    $this->load->model('school_info_model');
    header('Content-type: application/json');

    if ($query = $this->school_info_model->get_all_classes($gradeid))
    {
        echo json_encode($query);
    } else {
        redirect('login/loginform');
    }

}

モデル:

function get_all_classes($gradeid)
{

    $this->db->where('grade_id', $gradeid);

    $query = $this->db->get('classes');

    if($query->result()){
        $result = $query->result();

        foreach($result as $row)
        {
            $options[$row->id] = $row->name;
        }   
        return $options;
    } 
}

編集:

2 つのことを除いて現在動作しているコードを更新しましたが、エラーが発生し続けます。

エラー:

PHP エラーが発生しました

重大度: 警告

メッセージ: foreach() に無効な引数が指定されました

ファイル名: helpers/form_helper.php

ライン番号: 331

また、初めてページをロードすると、成績の値が変更された場合にのみ AJAX がアクティブになるため、クラスの入力フィールドは空です。

4

4 に答える 4

1

コントローラーを次のように設定します。

function get_classes()
{
    $this->load->model('school_info_model');

    if ($gradeid = $this->input->post('gradeid')
    {
        $query = $this->school_info_model->get_all_classes($gradeid);
        header('Content-Type: application/json');
        echo json_encode($query);
    } else {
        redirect('some/controller');
    }

}

そして、JSを次のように変更します。

<script type="text/javascript">// <![CDATA[
    $(document).ready(function(){       
        $('#grades').change(function(){
            $("#classes > option").remove();
            var grade_id = $('#grades').val();
            $.ajax({
                type: "POST",
                url: "<?php echo base_url(); ?>index.php/login/get_classes/",
                data: {gradeid:grade_id},
                success: function(classes)
                {
                    $.each(classes,function(id,name)
                    {
                        var opt = $('<option />');
                        opt.val(id);
                        opt.text(name);
                        $('#classes').append(opt);
                    });
                }        
            });

        });
    });
    // ]]>
</script>

それがまさにあなたが望む場所かどうかはわかりませんが、あなたを近づけるはずです.

于 2013-10-13T17:24:12.240 に答える
1

最初に結果の本文が得られない場合は、json_encodeFALSE を返す可能性が最も高いです。

指摘しておくと、モデルの関数の最初の if 句に比較エラーがあります。

if($gradeid = NULL){
    $this->db->where('grade_id', $gradeid);
}

編集...待って、うーん、あなたの割り当てテストスタイルは私を混乱させています。つまり、このwhere句は決して実行されません。

$optionsさらに、理論的には (アプリケーションを知らなくても) 理にかなっているように見えるように、クラスが見つからない場合は空のリストを返すことを検討することもできます。

JSON データを想定していることを AJAX 呼び出しに明示的に伝えることは必要ないかもしれませんが、役立つ場合があります。つまりdataType: "JSON"、設定として追加します。

あなたのフォームエラーに応じて編集してください:あなたが得ているエラーは、基本的に foreach ループが間違った引数を取得していることを示す標準の php エラーです..おそらく配列を渡していません。そのためには、login/loginformそれぞれのビューを確認する必要があります。しかし、あなたの意図がそこにあるのかわかりませんか?ユーザーが予期したデータを受け取らなかった場合にログインフォームに転送するには? AJAXリクエストでそれを処理しますか? 現在のように、AJAX リクエストはおそらく有効な JSON ではないものに再ルーティングされますが、ブラウザーの場所は変わりません。

于 2013-10-13T18:09:42.553 に答える