使用撇号在PHP查询中搜索术语

时间:2012-11-12 03:24:46

标签: php html mysql

我一直在查看一系列主题,但还没有找到任何有用的东西 - 或许它确实如此,但我对PHP / MySQL很新,所以也许我只是遗漏了一些东西。

我有一个页面,允许用户输入项目名称以在(MySQL)数据库中查找。然后它生成一个结果表并显示它们,并将一些数据转换为链接。然后将链接的术语用作查询以搜索数据库的其他字段。

一切正常......除非其中一个搜索词包含撇号。显然我想防止注入问题,但我还需要用撇号进行搜索。这是我的代码:

$query = mysql_real_escape_string($query);
$query = htmlspecialchars($query);
$queryentered = $query;
$query = strtolower($query);

这是传递给查询的URL:

echo " from <a href='index.php?volume=".$results2['book']."' class='where'>"
.$results2['book']."</a>";

查询:

$raw_results = mysql_query("SELECT * FROM $database1 WHERE $wh LIKE '%$query%'
ORDER BY displayname") or die(mysql_error());

我编码的权利是什么?当我运行搜索时,它会显示“找不到[搜索词]的结果”,其中我得到的是任何撇号。

3 个答案:

答案 0 :(得分:2)

此代码段的顺序错误:

$query = mysql_real_escape_string($query);
$query = htmlspecialchars($query);
$queryentered = $query;
$query = strtolower($query);

应该在数据库查询字符串连接之前的最后一次执行转义。在这种情况下,它无关紧要,因为strtolower不会撤消转义。更严重的是HTML转义,它不属于SQL上下文。不要覆盖主变量,而是:

$queryentered = htmlspecialchars($query);
$query = strtolower($query);
$query = mysql_real_escape_string($query);

繁琐的数据库转义,顺便说一下,很容易避免。查看PDO and prepared statements

答案 1 :(得分:1)

我强烈建议使用预准备语句和PDO库。

  • 真的很容易学习
  • 将使您的问题更容易解决
  • 适用于(大多数)任何数据库
  • 为防止您提及的注射问题做了很长的工作
  • 技能组合适用于您可能学习的其他语言

您所要做的就是编写查询,然后准备一个连接字符串(包含数据库类型和详细信息),然后触发查询。随查询一起发送一系列参数,以解耦数据。

有用的链接:

http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/

http://id1.php.net/pdo

答案 2 :(得分:1)

问题在于这一行:

$query = htmlspecialchars($query);

如果您搜索Death's book,您的最终$query将是death\&#039;s book! 删除htmlspecialchars您的查询就可以了!