-5

我有一个奇怪的问题。

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

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

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

---- 编辑放一些代码

$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\'s Photo
现在的值,如果我在 phpMyAdmin 上运行查询,用 where photo_title='Girish\''s Photo' 替换 where 子句,我会得到记录。

4

5 回答 5

3
  $data = "Girish's Photo";

  $query = "SELECT * FROM table WHERE title='".mysql_real_escape_string($data)."'";
于 2012-12-11T11:44:20.877 回答
1

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

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

但是,这是不好的做法。

于 2012-12-11T11:43:44.940 回答
0

我最近有一个类似的问题,我通过使用htmlentites()而不是在手册w3 学校mysql_real_escape_string()中检查它来解决

编辑:这是一个有效的答案,因为他mysql_real_escape_string()首先在错误的上下文中使用。如果您阅读该问题,则他正在逃避 FILENAME,因此他没有被注射的风险。如果您要投反对票,请至少说明原因..

于 2012-12-11T11:42:29.117 回答
0

好的,所以您将要对所有查询使用 PDO。主要有以下几个原因:

  1. mysql_* 已被弃用。
  2. SQL 注入并不安全。
  3. PDO 能够访问众多数据库引擎,使其更加灵活而无需更改 API。

请查看这篇文章以了解如何使用 PDO 发出 SELECT。

通过 PDO 进行参数化 SELECT 查询?

于 2012-12-11T11:48:49.857 回答
0

数据库中的值不应包含反斜杠。这就是您的查询不匹配的原因。Girish's Photo不匹配Girish\'s Photo。听起来你是魔术引语的受害者。阅读手册并摆脱它们。

于 2012-12-11T12:10:04.077 回答