3

我一直在浏览一堆主题,但还没有找到任何有用的东西——或者它可能确实有效,但我对 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());

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

4

3 回答 3

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 和准备好的语句

于 2012-11-12T03:33:35.860 回答
1

问题出在这一行:

$query = htmlspecialchars($query);

如果你搜索Death's book 你的最终 $query 将是death\&#039;s book!通过删除htmlspecialchars您的查询会很好!

于 2012-11-12T03:34:25.130 回答
1

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

  • 真的很容易学
  • 将使您的问题更容易解决
  • 适用于(大多数)任何数据库
  • 防止您提到的注入问题有很长的路要走
  • 技能组合将适用于您可能学习的其他语言

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

有用的网址:

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

http://id1.php.net/pdo

于 2012-11-12T03:30:24.700 回答