我正在建立一个网站来学习PHP,并且正在从Jquery Ui进行自动提交。
这是我的代码(我很久以前从SO上的帖子中获取了这些代码,而且我不是100%它的功能,所以如果有人能解释,那将会有所帮助!)这段代码来自于建议。 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));
?>
现在这是使自动提示工作,但只有相同的结果(例如,如果我输入“约翰斯”它提出“约翰热狗”作为建议,但如果我键入“fjfjdjf669959”然后它来了与“约翰斯热狗”一起。
我正在使用Mysql Union,因为我正在尝试使用公司表中的名称行填充我的autosuggest, cat 来自 cat 表的行,以及来自 subcat 表的 subcat 行。
为什么这不起作用?
感谢您的帮助!!
我的JQUERy代码如下所示:
<script>
$(function() {
$( "#search" ).autocomplete({
source: "suggest.php"
});
});
</script>
答案 0 :(得分:4)
首先,您的PHP代码容易受到SQL injection attacks的攻击。此外,mysql_* functions are deprecated。相反,请使用PDO。
您的代码失败是因为您正在读取错误的查询变量。由于jQuery UI autocomplete plugin使用参数$_GET['q']
进行搜索查询,因此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));