0

[php-mysqlを介して]サーバーからデータを取得するためにjsonリクエストを送信するhtmlページがあります。応答が受信されていないことがわかります。フィドラーを使用してデバッグを試みたところ、「応答に有効な json テキストが含まれていません。

私のコードは以下です

html

<!DOCTYPE html>
<html>
<script src="http://code.jquery.com/jquery-latest.js" 
        type="text/javascript">
</script>

<script type="text/javascript">
function populateFruitVariety() {

    $.getJSON('serverside.php', 
               {fruitName:$('#fruitName').val()}, 
               function(data)  {

    var select = $('#fruitVariety');

    if(select.prop) {
        var options = select.attr('options');
    } else {
        var options = select.attr('options');
    }

    $('option', select).remove();

    $.each(data, function(val, text) {
        options[options.length] = new Option(text, val);
    });
    });
}

$(document).ready(function() {
    populateFruitVariety();
    $('#fruitName').change(function() {
        populateFruitVariety();
    });
});

</script>

<form>
    Fruit:
    <select name="name" id="fruitName">
        <option>Apple</option>
        <option>Banana</option>
        <option>Orange</option>
        <option>Pear</option>
    </select>
    Variety:
    <select name="variety" id="fruitVariety">
    </select>
</form>
</html>

サーバーサイド.php

<?php
header('Content-type: application/json');

$host="localhost";
$username="root";
$password="";
$database="db_common";
$table_fruit_info = "fruit_info";
$tc_fruit_id = "fruit_id";
$tc_fruit_index = 'fruit_index';

$con = mysql_connect("$host", "$username", "$password") 
       or die(mysql_error());
mysql_select_db("$database") or die(mysql_error());

if(isset($_GET['fruitName'])) {
    $fruit_id = $_GET['fruitName'];
    $result = mysql_query("SELECT * FROM $table_fruit_info
                WHERE $tc_fruit_id='$fruit_id'");
    while($rows = mysql_fetch_array($result))
    {
        $ret_fruitIndex = $rows[$tc_fruit_index];
    }
}
echo json_encode($ret_fruitIndex);
?>

ご協力いただきありがとうございます!

4

3 に答える 3

2

$ret_fruitIndex適切な JSON の代表を持たない単なる文字列のようです。あなたのwhileループでは、パスごとにこの変数の値を上書きしていますが、これはあなたがやりたいことではないと思います。

私はあなたが本当に次のようなことをしたいと思っていると思います:

$ret_fruitIndex[] = $rows[$tc_fruit_index];

mysql_*側面として、コードは SQL インジェクションに対して非常に脆弱であり、非推奨の関数も使用しないでください。mysqli_*関数、PDO、またはよりモダンで安全なものを使用することをお勧めします。

あなたのjQueryに関して:あなたがここで何をしているのかわかりません:

if(select.prop) {
    var options = select.attr('options');
} else {
    var options = select.attr('options');
}

ケースに違いはありません。

また、あなたのeach()機能が間違っていると思います。コールバック関数に渡されるパラメーターは、データのインデックス値とそのインデックスの値になります。

optionsロジックは、データに基づいて新しいオプションを追加するよりも、すべてのオプションを削除する必要があるため、変数がこのコールバック関数に関与している理由がまったくわかりません。

于 2012-12-28T20:17:54.997 に答える
1

フルーツ名の配列が必要なので、$ ret_fruitIndex = $ rows[$tc_fruit_index]を置き換えます。

$ ret_fruitIndex [] = $ rows [$ tc_fruit_index];

于 2012-12-28T20:27:22.410 に答える
0

PHP を修正したら、JS コールバックを次のように変更します。

function(data)  {

    var select = $('#fruitVariety');

    select.empty();

    $.each(data, function(val, text) {
        select.append($('option', {value: val}).text(text));
    });

});

optionsは DOM の配列への参照ではなく、jQuery オブジェクトであるため、追加しても DOM は更新されません。

于 2012-12-28T20:49:54.353 に答える