PHP mysql_real_escape_string未按预期工作

时间:2012-12-11 11:32:39

标签: php mysql

我有一个奇怪的问题。

我有一个有标题字段的表 我正在使用mysql_real_escape_string将值插入此标题字段。对于带单引号的值,插入工作正常 我正在使用where子句中提交的标题进行选择的其他地方,如下所示

SELECT * FROM table WHERE title=mysql_real_escape_string(Girish's Photo);

即使我插入Girish的Photo,此查询也会返回空结果集。

----编辑放一些代码

$photo_title=mysql_real_escape_string($_POST[photo_title]);<br/>
$sql = "INSERT INTO photos values($id,'$photo_title');<br/>

从我已将 Girish的照片插入到photo_title的表格中使用此功能。它工作得很好。
... .. ..

然后在PHP的其他地方

$title="Girish's Photo";
$sql = "SELECT photo_id,photo_title FROM photos WHERE photo_title ='" . mysql_real_escape_string($title)."'" ;

但是此查询返回空结果集。

使用phpMyAdmin,如果我尝试运行上面的查询..结果为空。如果我浏览表格,我会看到价值Girish的照片 现在如果我在phpMyAdmin上运行查询替换where子句,其中photo_title ='Girish \'的照片'我正在获取记录。

5 个答案:

答案 0 :(得分:3)

  $data = "Girish's Photo";

  $query = "SELECT * FROM table WHERE title='".mysql_real_escape_string($data)."'";

答案 1 :(得分:1)

mysql_real_escape_string()是一个PHP函数,应该按如下方式使用:

"SELECT * FROM table WHERE title='".mysql_real_escape_string("Girish's Photo")."'";

然而,这是不好的做法。

答案 2 :(得分:0)

最近我遇到了类似的问题,我使用htmlentites()代替mysql_real_escape_string()the manualw3 schools

中查看了该问题

编辑:这是一个有效的答案,因为他首先在错误的上下文中使用mysql_real_escape_string()。如果你读到这个问题,他就会逃避一个FILENAME,因此他没有注射的风险。如果你打算至少说出原因......

答案 3 :(得分:0)

好的,所以你会想要将PDO用于所有查询。主要有以下原因:

  1. mysql_ *正在弃用。
  2. SQL注入并不安全。
  3. PDO能够访问众多数据库引擎,使其更灵活,无需更改API。
  4. 请查看这篇文章,了解如何使用PDO发布SELECT。

    Parameterized SELECT queries via PDO?

答案 4 :(得分:0)

数据库中的值应 包含反斜杠。这就是您的查询不匹配的原因。 Girish's PhotoGirish\'s Photo不符。听起来你是magic quotes的受害者。阅读the manual并删除它们。