4

我正在建立一个网站来学习 PHP,并正在从 Jquery Ui 进行自动建议。

这是我的代码(我很久以前从 SO 上的一篇文章中获取了这段代码,而且我不是 100% 它的作用,所以如果有人能解释一下,这将是有帮助的!)这段代码来自Suggest.php,它我从我的 jquery 代码中调用(我认为它正在工作,所以我没有发布它,但如果你需要它可以!)

<?
include("config.php");

$queryString = strtolower($_GET["q"]);

$return = array();
$query = mysql_query("SELECT name FROM company WHERE name LIKE '$queryString%' UNION SELECT cat FROM cat WHERE cat LIKE '$queryString%' UNION SELECT subcat FROM subcat WHERE subcat LIKE '$queryString%' LIMIT 10");
while ($row = mysql_fetch_array($query)) {
     array_push($return,array('label'=>$row['name'],'value'=>$row['name']));
}
echo(json_encode($return));

?>

现在这正在使自动建议工作,但只有相同的结果(例如,如果我输入“Johns”它会提出“Johns Hot Dogs”作为建议,但如果我输入“fjfjdjf669959”那么它会出现“约翰热狗”也是如此。

我正在做一个 Mysql Union,因为我试图用company表中的name行、 cat表中的cat行和subcat表中的subcat行填充我的 autosuggest 。

为什么这不起作用?

感谢您的任何帮助!

我的 JQUERy 代码如下所示:

<script>
    $(function() {
        $( "#search" ).autocomplete({
            source: "suggest.php"
        });
    });
</script>
4

1 回答 1

4

首先,您的 php 代码容易受到SQL 注入攻击。此外,不推荐使用 mysql_* 函数。相反,使用PDO

您的代码失败,因为您正在读取错误的查询变量。$_GET['q']为空,因为jQuery UI 自动完成插件使用参数term进行搜索查询。使用空的$queryString,执行 SQL 查询

SELECT name FROM company WHERE name LIKE '%'   -- UNION ...

这当然只是返回一切。你要:

<?php
include("config.php");
$db = new PDO('mysql:host=localhost;dbname=database', 'user', 'password');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

if (!isset($_GET['term'])) {
    header('HTTP/1.0 400 Bad Request');
    echo 'Missing term parameter in request';
    exit();
}
$queryString = strtolower($_GET["term"]);
$query = $db->prepare("SELECT name FROM company WHERE name LIKE :qs" .
  " UNION SELECT cat AS name FROM cat WHERE cat LIKE :qs" .
  " UNION SELECT subcat AS name FROM subcat WHERE subcat LIKE :qs " .
  " LIMIT 10");
$query->execute(array(':qs' => $queryString . '%'));
$query->setFetchMode(PDO::FETCH_NAMED);
$result = array_map(function($row) {
    return array('label'=>$row['name'],'value'=>$row['name']);
}, $query->fetchAll());

header('Content-Type: application/json');
echo(json_encode($result));

这是一个实时的、可下载的(包括数据库)演示

于 2012-08-12T21:06:56.460 回答