1

jQuery オートコンプリートに問題があります。基本的には検索バーがあり、探しているものを jQuery コードに入力すると、MySQL クエリを実行する php スクリプトが呼び出され、必要なものがすべて返され、それに応じてテキスト ボックスに入力されます。次に、そのオートコンプリートから受け取った値を取得し、それを別のオートコンプリートで使用して、さらにデータを入力します。注意が必要なのは、2 番目のクエリで取得する必要があるデータが、関係を共有する最初のクエリとは別のテーブルにあることです。私の質問は、これを行うには完全に別の関数が必要ですか、それとも単純に両方のクエリを 1 つの php スクリプトに入れて、最初のクエリからの情報を 2 番目のクエリに使用できるかということです。

どんな助けでも感謝します!

jQuery関数は次のとおりです。

$(function() {

/*            $('#abbrev').val("");
*/             
            $("#q16_location16").autocomplete({
                source: "location_query.php",
                minLength: 1,
                select: function(event, ui) {
                    $('#q16_location161').val(ui.item.LocationID);
                    $('#SystemName').val(ui.item.SystemName);
                    $('#SiteAddress1').val(ui.item.SiteAddress1);
                    $('#SiteAddress2').val(ui.item.SiteAddress2);
                    $('#SiteCPP').val(ui.item.SiteCPP);
                    $('#Contact').val(ui.item.Contact);
                    $('#SiteLocationHours').val(ui.item.SiteLocationHours);
                }
            });
        });

およびphpスクリプト:

/* If connection to database, run sql statement. */
if ($conn)
{

    $fetch = mysql_query("
    SELECT Location.LocationID,
    Location.SystemName,
    Location.SiteAddress1,
    Location.SiteAddress2,
    CONCAT_WS(' ', Location.SiteCity, Location.SiteProvince, Location.SitePostalCode) AS SiteCPP,
    CONCAT_WS(' ', Location.ContactName, Location.ContactPhone, Location.ContactEmail) AS Contact,
    Location.SiteLocationHours, 
    CONCAT_WS(' ', SystemName, SiteNameLocation, SiteAddress1, SiteCity, SiteProvince, SitePostalCode) as expr2 
    FROM Location 
    WHERE Location.SystemName like '%".mysql_real_escape_string($_GET['term'])."%'
    OR Location.SiteNameLocation like '%".mysql_real_escape_string($_GET['term'])."%'
    OR Location.SiteAddress1 like '%".mysql_real_escape_string($_GET['term'])."%'
    OR Location.SiteCity like '%".mysql_real_escape_string($_GET['term'])."%'
    OR Location.SiteProvince like '%".mysql_real_escape_string($_GET['term'])."%'
    OR Location.SitePostalCode like '%".mysql_real_escape_string($_GET['term'])."% '
    LIMIT 0,15");


    /* Retrieve and store in array the results of the query.*/
    while ($row = mysql_fetch_array($fetch, MYSQL_ASSOC)) {
        $row_array['LocationID'] = $row['LocationID'];
        $row_array['value'] = $row['expr2'];
        $row_array['SystemName'] = $row['SystemName'];
        $row_array['SiteAddress1'] = $row['SiteAddress1'];
        $row_array['SiteAddress2'] = $row['SiteAddress2'];
        $row_array['SiteCPP'] = $row['SiteCPP'];
        $row_array['Contact'] = $row['Contact'];
        $row_array['SiteLocationHours'] = $row['SiteLocationHours'];

        array_push($return_arr,$row_array);
    }
}

/* Free connection resources. */
mysql_close($conn);

/* Toss back results as json encoded array. */
echo json_encode($return_arr, $return_arr2);

したがって、ユーザーが「New York」と入力すると、そのオプションを選択できます。この例では、ニューヨークの ID は 5 です。ニューヨークのさまざまな通りを選択するクエリもありますが、これは別のテーブルにあります。ただし、私の通りのテーブルには、ニューヨークのすべての通りの値が 5 になる "LocationID" 列があります。そのIDを持つ別のテーブル。新しい関数の作成に関して複数のことを試しましたが、その ID を関数に渡す方法がわかりません。

ありがとう

4

1 に答える 1

0

これには、1 つの PHP スクリプトを使用できます。基本的な構造は次のようになると思います。

  1. 2 つの値を「location_query.php」に渡します。最初の値は、クエリするテーブルの名前です。2 番目の値は、オートコンプリート テキスト ボックスからの選択結果である可能性があります。
  2. 「location_query.php」に渡された 2 つの値から、「location_query.php」に準備済みステートメントを作成します。
  3. クエリを実行します。
  4. 結果を JSON エンコードします (前と同じように)。

また、コードのセキュリティ上の懸念を指摘したいと思います。PHP の MySQL の代わりにMysqliプリペアド ステートメントを使用する必要がありmysql_real_escape_string. mysql_real_escape_string、セキュリティ違反につながる可能性のあるセキュリティ上の欠陥があることが示されており、PHP の MySQL クラスは推奨されていません。Mysqli および Prepared ステートメントははるかに安全であり、私の意見では、SQL とパラメーターを分離できるため、よりクリーンなコードを提供します。

お役に立てれば!

編集:あなたが今何をしようとしているのか理解できたと思いますが、それを行うためのより良い方法があると思います. id 値を非表示フィールドに割り当てて、そのフィールドが変更されるたびに jquery に検出させる代わりに、次のようにします。

最初のテキスト ボックスの select メソッドの場合:

select:function(event, ui) {
    $.get("location_query.php", {
        searchterm:$(ui).val()
        }, yourFunction);
}

「queryFinished」の実装例を次に示します。

function queryFinished(data, textStatus, jqXHR) {
    var mJSON = $.parseJSON(data);
    /* mJSON is the parsed JSON data returned from your "location_query.php" 
       script.*/
    //TODO the rest of your code
}

何が起こっているかは次のとおりです。

  1. 最初のテキスト ボックスで新しい項目が選択されたときに呼び出されるカスタム関数を定義します。GETこの関数の唯一の目的は、「location_query.php」でa を呼び出すことです。
  2. 次に、呼び出しを介して最初のテキスト ボックスから選択したフィールドの値を渡しますGET
  3. 次に、GET が返されたときに呼び出される関数を作成します。
  4. 最後に、「location_query.php」によって返されるエンコードされた JSON を解析します。その後、解析された JSON (この例では mJSON) を使用して必要なタスクを実行できます。

このアプローチを採用すると、非表示の ID フィールドの値の変更を「リッスン」することを心配する必要がなくなり、すべてがきれいになります。

于 2013-09-22T20:01:16.337 に答える