php select和json编码问题

时间:2012-08-10 17:31:33

标签: php mysql

我正在建立一个网站来学习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>

1 个答案:

答案 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));

Here is a live, downloadable (incl. database) demo