如果我输入
进入我的搜索栏我得到一个mysql错误,因为“sting”还没有被转义 - 它认为。
但我之所以逃避它的原因是因为我不认为它现在是一个字符串。
搜索框使用ajax动态生成搜索结果,就像我输入的那样,它会找到我收到错误的结果:
You have an error in your SQL syntax; check the manual that corresponds to
your MySQL server version for the right syntax to use near '%' OR Location
LIKE '%'%' OR Map LIKE '%'%' LIMIT 0, 16' at line 2
这是mysql查询:
<?php
if($_POST['q']!=""){
include $_SERVER['DOCUMENT_ROOT'] . "/include/datebasecon.php";
$result = mysql_query("
SELECT id, Name, Location, Map
FROM Accommodation WHERE Name LIKE '%".$_POST['q']."%' OR Location LIKE '%".$_POST['q']."%' OR Map LIKE '%".$_POST['q']."%' LIMIT 0, 16")
or die(mysql_error());
$output = "";
while($row = mysql_fetch_array($result)){
$N = preg_replace("/(".$_POST['q'].")/i","<span>$1</span>",$row['Name']);
$L = preg_replace("/(".$_POST['q'].")/i","<span>$1</span>",$row['Location']);
$M = preg_replace("/(".$_POST['q'].")/i","<span>$1</span>",$row['Map']);
$output .= "<p>".$N." - ".$L."</p>";
}
print $output;
}
?>
无论如何我可以在发布查询之后解决这个问题吗?
答案 0 :(得分:3)
当magic_quotes_gpc
关闭时(应该是!),$_POST['q']
只是字符串'
,只是一个字符。这就是它出现在你的SQL代码中的原因:
%' OR Location LIKE '%'%' OR Map LIKE '%'%' LIMIT 0, 16
错误发生在'%'%'
,因为LIKE
字符串过早终止。
您可以在mysql_real_escape_string()
上使用$_POST['q']
并将其转义:
$q = mysql_real_escape_string($_POST['q']);
$result = mysql_query("
SELECT id, Name, Location, Map
FROM Accommodation WHERE Name LIKE '%".$q."%' OR Location LIKE '%".$q."%' OR Map LIKE '%".$q."%' LIMIT 0, 16")
or die(mysql_error());
答案 1 :(得分:1)
你写道“我不认为它现在是一个字符串”......它是一个字符串。您可以将其传递给mysql_real_escape_string()
并使用结果使您的查询安全可靠。您的脚本通过$_POST
,$_GET
,$_REQUEST
和$_COOKIE
参数接收的所有内容都可以用作字符串,但它是一个数组。
答案 2 :(得分:1)
让你明白。
看看你的问题:
LIKE '%search string%'
注意用于分隔搜索字符串的撇号 这些撇号确实意味着 IS 中的数据是一个字符串 您在查询中加入引号的 Everything 是一个字符串 一切您在查询中添加引号必须才能进行转义 无需思考,考虑或估计。该规则简单明了:引用的文本应该总是被转义。