0

ここでいくつかのことを理解しようとしていますが、かなり近いようですが、障害にぶつかっています。私の問題は、ドロップダウン オプション (多数の結果をフィルタリングするために使用) を選択した後、オートコンプリート ボックスに入力を開始したときに表示されるはずの結果が表示されないことです。ドロップダウンが渡す値をハードコードし、オートコンプリート ボックスに入力を開始すると、すべて正常に動作します。私が問題を抱えているのは、その値を渡したときだけです。

私は 2 つの PHP ページを持っています。1 つはドロップダウン (結果の SQL) とオートコンプリート ボックスを含むレイアウトを含み、もう 1 つはオートコンプリートの SQL を含みます。

検索.php

<select id="loc">
<?php
// sql for dropdown
while ($row = odbc_fetch_array($result)) {
echo "<option value\"".$row['Location']"\">".$row['Description']."</option>";
}
?>
</select>

<label for="search">Search: </label>
<input type="text" id="search" />

<script>
// Send value entered in the autocomplete box to data.php for it to be used in sql statement
$(document).ready(function(){
    $('#search').autocomplete({
        minLength: 3,
        source: function(query, process) {
            $.ajax({
                url: 'data.php',
                type: 'GET',
                data: "name=" + $('#search').val(),
                dataType: 'JSON',
                async: true,
                success: function(data) {
                    process(data);
                }
            });
        }
    });
});

// Append selected dropdown value to URL so it can be accessed
$(document).ready(function() {
    $('#search').change(function() {
        var res = $(this).val();
        location.href = "search.php?src="+res;
    });
});
</script>

data.php

<?php
if (isset($_GET['src'])) {
$loc = $_GET['src'];
$fullname = explode(" ", $_GET['name']);
$sql = "SELECT p.lastname + ', ' + p.firstname as fullname,
        l.city as city
        FROM people p
        JOIN location l on p.city = l.city
        WHERE p.lastname like '".$fullname[1]."%' AND p.firstname like '".$fullname[0]."%'
        AND l.city = '$loc'
        GROUP BY p.lastname + ', ' + p.firstname, l.city
        ORDER BY p.lastname + ', ' + p.firstname";

// DB connection and execute connection here

$array = array();
while ($row = odbc_fetch_array($db)) {
    $array[] = $row['fullname'];
}
echo json_encode($array);
}
?>


したがって、このようなコードを作成してドロップダウンからオプションを選択すると、選択した値が渡されるため、select ステートメントが実行されます。search.php ページで結果をエコーすると、それらは正しくフィルタリングされます。 data.php ページに直接移動し、正しいパラメーターをすべて渡します。ただし、選択を行ってオートコンプリート ボックスに入力を開始しても、結果が得られません。選択に基づいて何らかの方法で結果をフィルタリングし、それらの結果を取得して、入力を開始したときに別のクエリを実行する必要があると思いますか?

ご不明な点がありましたらお知らせください。

4

1 に答える 1

0

いつものように、休憩を取った後、今は機能しています。

以下は、私が変更した内容を示すコメント付きの改訂されたコードです。

検索.php

<select id="loc">
<?php
// sql for dropdown
while ($row = odbc_fetch_array($result)) {
echo "<option value\"".$row['Location']"\">".$row['Description']."</option>";
}
?>
</select>

<label for="search">Search: </label>
<input type="text" id="search" />

<script>
/* Send value entered in the autocomplete box to data.php 
 * for it to be used in sql statement */
$(document).ready(function(){
    $('#search').autocomplete({
        minLength: 3,
        source: function(query, process) {
// Added the variable below to get the dropdown's selected value
            var res = $('#loc').val();
            $.ajax({
                url: 'data.php',
                type: 'GET',
// Edited: included the dropdown value 
                data: "src="+res + "&name=" + $('#search').val(),
                dataType: 'JSON',
                async: true,
                success: function(data) {
                    process(data);
                }
            });
        }
    });
});

/* This event is not needed since the value is set when a selection 
 * is made. 'change' passed that value to search.php causing
 * the query to run without the search value. This caused a HUGE 
 * number of results, and usually causing the page to timeout. 
 * Making sure all variables get passed prior to running the query
 * is a must. I knew this but got stuck on how to make it work. */
// Append selected dropdown value to URL so it can be accessed
//$(document).ready(function() {
//    $('#search').change(function() {
//        var res = $(this).val();
//        location.href = "search.php?src="+res;
//    });
//});
</script>

data.php

<?php
if (isset($_GET['src'])) {
    $loc = $_GET['src'];
}
// Moved the $loc variable into the if statement above
// $loc = $_GET['src'];
$fullname = explode(" ", $_GET['name']);
$sql = "SELECT p.lastname + ', ' + p.firstname as fullname,
        l.city as city
        FROM people p
        JOIN location l on p.city = l.city
        WHERE p.lastname like '".$fullname[1]."%' 
              AND p.firstname like '".$fullname[0]."%'
        AND l.city = '$loc'
        GROUP BY p.lastname + ', ' + p.firstname, l.city
        ORDER BY p.lastname + ', ' + p.firstname";

// DB connection and execute connection here

$array = array();
while ($row = odbc_fetch_array($db)) {
    $array[] = $row['fullname'];
}
echo json_encode($array);
?>


ドロップダウンから選択が行われるまでオートコンプリートボックスを無効/非表示にする、追加のフィルタリングのためにクエリを調整するなど、メインページのいくつかの部分を完了していませんが、それらは私のリストの次です。他にもクリーンアップできることがいくつかあると確信していますが、最初の目標は正しく動作させることでした。それは今では達成されています!

誰かがphpを使用していて、数十万以上の結果があり、結果が表示されるまで途方もない時間を待たずにオートコンプリートボックスを使用してそれらをフィルタリングしたい場合は、これが役立つことを願っています. 私が当初考えていたほど複雑ではありませんが、考えすぎるとそうなるでしょう。また、現在は機能していますが、提案や文法上の誤りについての謝罪を自由に追加してください!

于 2013-04-24T16:07:38.190 に答える