1

我遇到了 jQuery 自动完成的问题。基本上我有一个搜索栏,当您输入要查找的 jQuery 代码时,我调用了一个 php 脚本,该脚本执行 MySQL 查询并返回我需要的所有内容并相应地填写文本框。然后我想要做的是获取我从该自动完成中收到的值,并在另一个自动完成中使用它来填充更多数据。棘手的部分是我需要通过第二个查询获取的数据位于与第一个查询不同的表中,它们共享关系。我的问题是我是否需要一个完全独立的函数来执行此操作,或者我可以简单地将两个查询放在 1 php 脚本中,并将第一个查询的信息用于我的第二个查询。

任何帮助表示感谢!

这是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);

因此,当用户输入“纽约”时,他们可以选择该选项。在我的示例中,纽约的 ID 为 5。我还有一个查询选择纽约的不同街道,但这是在单独的表中。然而,在我的街道表中,有一个“LocationID”列,对于纽约的每条街道,其值为 5。因此,当用户进入纽约并从不同的表也具有该 ID。我在创建新函数方面尝试了多种方法,但我不确定如何将该 ID 传递给函数。

谢谢

4

1 回答 1

0

您可以为此使用一个 PHP 脚本。以下是我认为基本结构的样子:

  1. 将两个值传递给“location_query.php”。第一个值是您要查询的表的名称。第二个值可以是自动完成文本框中的选择结果。
  2. 根据传递给“location_query.php”的两个值在“location_query.php”中创建一个准备好的语句。
  3. 执行您的查询。
  4. JSON 对结果进行编码(就像您之前所做的那样)。

我还想指出您的代码存在安全问题。您应该使用Mysqli准备好的语句而不是 PHP 的 MySQL,并且mysql_real_escape_string. mysql_real_escape_string已被证明存在可能导致安全漏洞的安全缺陷,并且 PHP 的 MySQL 类已被弃用。Mysqli 和 Prepared 语句更安全,并且在我看来,提供更简洁的代码,因为它允许分离 SQL 和参数。

希望这可以帮助!

编辑:我想我明白你现在想要做什么,但我认为有更好的方法去做。与其将 id 值分配给隐藏字段并尝试在每次更改该字段时让 jquery 检测,不如执行以下操作:

对于您的第一个文本框的选择方法:

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”。
  2. 然后,我们通过GET调用从第一个文本框中传递所选字段的值。
  3. 然后我们创建一个在 GET 返回时调用的函数。
  4. 最后,我们解析“location_query.php”返回的编码 JSON。之后,您可以使用解析的 JSON(在我们的示例中为 mJSON)执行您需要的任何任务。

采用这种方法使我们不必担心“监听”隐藏 ID 字段中的值变化,并使一切变得干净整洁。

于 2013-09-22T20:01:16.337 回答