我有一个脚本,我试图匹配我以ajax $ .post请求的形式检索到的droppable data,该请求包含名字,姓氏,描述和等级,并将其与相同的数据库中的数据。这样做我想找到用户并在我的查询中提取它们。我在使用LIKE
进行高效查询时遇到问题,并且我不确定要添加哪些其他组件才能使其正确发生
if (isset($_POST['data'])){
$data = $_POST['data'];
$query = mysql_query("SELECT * FROM `tempusers`
WHERE `firstname` LIKE '%" . $data . "%'
OR `lastname` LIKE '%" . $data . "%'
OR `description` LIKE '%" . $data . "%'
OR `grade` LIKE '%" . $data . "%'");
if (! $query){
echo'Database error: ' . mysql_error();
}
while ($row=mysql_fetch_assoc($query)) {
$description = $row['description'];
echo $description;
}
exit;
}
问题是我没有返回任何结果而是得到错误
您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以获得正确的语法
and
mysql_fetch_assoc()期望参数1为资源,给定布尔值。
我欢迎任何我可以实施的提示,并且非常感谢
答案 0 :(得分:1)
查询的语法有效,这意味着您的输入数据中某处有单引号,导致查询失败并出现语法错误。
要解决此问题,您可以将$data
传递给mysql_real_escape_string()
,这将转义任何引号,最重要的是阻止SQL注入。
甚至比转义更好的方法是使用PDO或MySQLi的参数化查询。
至于优化,您可以尝试REGEXP而不是多个LIKE。 Example here
答案 1 :(得分:1)
您已经请求帮助优化无效的MySQL查询。
首先,您需要使查询正常工作。通常的做法是将您的查询键入MySQL客户端(如phpmyadmin),看看会发生什么。您可能还会发现使用echo输出构造的查询将帮助您查看SQL语法错误。
其次,表格的查询
column LIKE '%matchstring%'
根本无法优化。匹配字符串上的前导%表示MySQL服务器必须搜索您提到的列的每一行才能找到匹配项。索引对此没有帮助。如果您可以这样查询
column LIKE 'matchstring%'
您可以使用索引来优化这些搜索。
第三,您在查询中使用OR
。 MySQL优化器并不真正喜欢OR,它会重新扫描每个表。
您可以将此表放入MyISAM访问方法(如果尚未访问)并使用FULLTEXT匹配。试试这个:
WHERE MATCH (firstname, lastname, description, grade)
AGAINST ('matchstring' IN BOOLEAN MODE)
这将执行您想要的搜索。您可以使用全文索引对其进行优化。
最后,正如Marc B指出的那样,你必须修复你的SQL注入问题。小学,从不介意中学,充满了喜欢分级系统的人。要找出危险,请在搜索引擎中查找“小Johnny Droptables”。
答案 2 :(得分:1)
在die;
之后放置echo'Database error: ' . mysql_error();
并运行您的代码以检查数据库错误是什么。
答案 3 :(得分:0)
您没有清理用户输入,这会导致SQL中出现杂散的引号字符(由您的错误消息证明)。简单的修复可以是(在将其放入查询之前转义字符串):
if (isset($_POST['data'])){
// sanitize user input
$data = mysql_real_escape_string($_POST['data']);
$query = mysql_query("SELECT * FROM `tempusers`
WHERE `firstname` LIKE '%" . $data . "%'
OR `lastname` LIKE '%" . $data . "%'
OR `description` LIKE '%" . $data . "%'
OR `grade` LIKE '%" . $data . "%'");
if (! $query){
echo'Database error: ' . mysql_error();
}
while ($row=mysql_fetch_assoc($query)) {
$description = $row['description'];
echo $description;
}
exit;
}
请阅读SQL injection。
关于提高效率:索引不适用于使用LIKE
查询的字段。
此外,不鼓励您使用mysql_
函数,因为它们已被弃用。请改用mysqli
。