0

MySQLデータベースと対話するPHPスクリプトと、AJAX呼び出しを使用してPHPスクリプトから情報を取得するJavaScriptスクリプトを作成しています。


私がやろうとしているのは、私が主題の中にある<select>ボックスを作成することです。Subjects<optgroup label="Subject">Courses<option value="1">Course</option>

私が現在持っているのは、Firebugにコンソールエラーはありませんが、単に処理されないJSスクリプトです。


私はこのSQLステートメントを書きました:

$sql = "SELECT
    s.Title AS Subject,
    s.Subject_ID AS Subject_ID,
    c.Title AS Course,
    c.Course_ID AS Course_ID
    FROM
    subjects s
    LEFT JOIN courses c ON s.Subject_ID = c.Subject_ID
    WHERE s.Faculty_ID = $faculty";

これは、の場合$faculty == 1、このデータを返します。

観察記録-科目とコースのリスト

Subject次に、次のコードを使用して、レベルにそのサブジェクトが含まれている多次元配列を返しますCourses

$res = mysql_query( $sql );
while ( $row = mysql_fetch_assoc( $res ) ) {
    $return[$row["Subject_ID"]][] = array( "Course_ID" => $row["Course_ID"], "Title" => $row["Course"] );
}

print_r( $return );

編集print_r: JSスクリプトに情報を送信するために機能しないことに気付きました(私はそのためのreturn $return設定をしました)、私はデバッグ目的でそれを使用していました。


完全なPHP関数は次のようになります。

switch($_GET["cmd"]) {
    case "populateForm" :
        $return = json_encode( populateForm() );
        break;
    case "populateCourses" :
        $return = json_encode( populateCourses( $_GET["faculty"] ) );
        break;
}

echo $return;

-

function populateCourses( $faculty ) {
    $sql = "SELECT
        s.Title AS Subject,
        s.Subject_ID AS Subject_ID,
        c.Title AS Course,
        c.Course_ID AS Course_ID
        FROM
        subjects s
        LEFT JOIN courses c ON s.Subject_ID = c.Subject_ID
        WHERE s.Faculty_ID = $faculty";
    $res = mysql_query( $sql );
    while ( $row = mysql_fetch_assoc( $res ) ) {
        $return[$row["Subject_ID"]][] = array( "Course_ID" => $row["Course_ID"], "Title" => $row["Course"] );
    }

    return $return;
}

そのデータは次のようになります。

Array
(
    [8] => Array
        (
            [0] => Array
                (
                    [Course_ID] => 59
                    [Title] => Core ICT
                )

            [1] => Array
                (
                    [Course_ID] => 60
                    [Title] => BTEC Business
                )

            [2] => Array
                (
                    [Course_ID] => 61
                    [Title] => BTEC ICT
                )

            [3] => Array
                (
                    [Course_ID] => 62
                    [Title] => GCSE Business
                )

            [4] => Array
                (
                    [Course_ID] => 63
                    [Title] => GCSE ICT
                )

        )

    [9] => Array
        (
            [0] => Array
                (
                    [Course_ID] => 64
                    [Title] => Advance BTEC Business
                )

            [1] => Array
                (
                    [Course_ID] => 65
                    [Title] => Advance BTEC ICT
                )

            [2] => Array
                (
                    [Course_ID] => 66
                    [Title] => AS Applied Business
                )

            [3] => Array
                (
                    [Course_ID] => 67
                    [Title] => AS Applied ICT
                )

            [4] => Array
                (
                    [Course_ID] => 68
                    [Title] => A2 Applied Business
                )

            [5] => Array
                (
                    [Course_ID] => 69
                    [Title] => A2 Applied ICT
                )

            [6] => Array
                (
                    [Course_ID] => 70
                    [Title] => A2 Economics
                )

            [7] => Array
                (
                    [Course_ID] => 71
                    [Title] => A2 Law
                )

            [8] => Array
                (
                    [Course_ID] => 72
                    [Title] => GCSE Maths
                )

            [9] => Array
                (
                    [Course_ID] => 73
                    [Title] => Maths
                )

            [10] => Array
                (
                    [Course_ID] => 74
                    [Title] => AS Further Maths
                )

            [11] => Array
                (
                    [Course_ID] => 75
                    [Title] => AS Maths
                )

            [12] => Array
                (
                    [Course_ID] => 76
                    [Title] => GSE Maths Rs-Sit
                )

            [13] => Array
                (
                    [Course_ID] => 77
                    [Title] => A2 Further Maths
                )

            [14] => Array
                (
                    [Course_ID] => 78
                    [Title] => A2 Maths
                )

        )

)

<SELECT>ただし、JavaScriptにアクセスすると、このデータを後のボックスに処理する方法がわかりません。データが正しく受信されていることに注意してください。この関数をconsole.log(data)使用すると、予想どおり、PHPスクリプトによって送信されたすべてのデータが表示されます。

私はこれを試しています:

        $('#courses').on("click", "option", function(event) {
            var id = $(this).val();
            UWA.Data.getJson(Input.URL + '?cmd=populateCourses&faculty=' + id, Input.populateCourses);
        })
    }

Input.populateCourses = function(data) {
    $('#courses').empty();
    for (var i = 0; i < data.length; i++) {
        alert(data[i]);
        $('#courses').append('<optgroup label="' + data[i] + '>');
        for (var x = 0; x < data[i].length; x++) {
            $('#courses').append('<option value="' + data[i][x].Course_ID + '">' + data[i][x].Title + '</option>');
        }
        $('#courses').append('</optgroup>');
    }
}

#coursesあると<select id="courses"></select>


forJSスクリプトでこれらのループを記述した方法は、データがアクセス/検出されていないことを意味しているため、スクリプトが失敗していると推測しています。

SQLステートメントから返されたデータを操作して<select>必要なボックスを生成するための最良の方法は何ですか?または、SQLステートメントを改善して作業を簡単にする必要がありますか?

前もって感謝します、

4

4 に答える 4

2

Use echo json_encode( array() ); exit; instead of print_r().

于 2012-09-18T11:56:22.457 に答える
1

データを正しく再保存すれば、その PHP コードをすべて表示する必要はありません。

あなたが見なければならない機能は次のとおりです。

Input.populateCourses = function(data) {
    $('#courses').empty();
    for (var i = 0; i < data.length; i++) {
        alert(data[i]);
        $('#courses').append('<optgroup label="' + data[i] + '>');
        for (var x = 0; x < data[i].length; x++) {
            $('#courses').append('<option value="' + data[i][x].Course_ID + '">' + data[i][x].Title + '</option>');
        }
        $('#courses').append('</optgroup>');
    }
}

解決策 1:

Input.populateCourses = function(data) {
    var html = "";
    for (var i = 0; i < data.length; i++) {
        html += <optgroup label="' + data[i] + '>';
        for (var x = 0; x < data[i].length; x++) {
            html += '<option value="' + data[i][x].Course_ID + '">' + data[i][x].Title + '</option>';
        }
        html += '</optgroup>';
    }
    $('#courses').empty().html(html);
}

解決策 2:

Input.populateCourses = function(data) {
    var $courses = $('#courses').empty();
    var $optgroup;
    for (var i = 0; i < data.length; i++) {
        $optgroup = $('<optgroup label="' + data[i] + '>').appendTo($courses);
        for (var x = 0; x < data[i].length; x++) {
            $('<option value="' + data[i][x].Course_ID + '">' + data[i][x].Title + '</option>').appendTo($optgroup);
        }
    }
}
于 2012-09-18T12:35:15.317 に答える
1

試したことはありませが、問題は、データがゼロベースの配列ではなく、インデックスが0、1、2、3などではないため、ループが機能しないことだと思います。次のようなことを試してみてください。

Input.populateCourses = function(data) {
    $('#courses').empty();
    for (var i in data) {
        alert(data[i]);
        /*...*/
    }
}

dataphp の連想配列で、javascript の数値プロパティを持つオブジェクトに変換するとfor (var i in data)、オブジェクトのプロパティを反復処理します。

于 2012-09-18T12:56:56.493 に答える
0

json_encodePHP配列が必要です。JS は、その文字列出力をどうするかわかりません。

次に、JS 側で、JSON.parse通常どおり使用できる JS オブジェクトにテキストを変換する必要があります。

これが IE6/7 でも機能する必要がある場合は、ページに Douglas Crockford の json2.js が必要です。GhettoIE をサポートしていない場合は、サポートしていません。

于 2012-09-18T12:04:05.590 に答える