mysql_real_escape_string 只转义一种类型的引号

Posted

技术标签:

【中文标题】mysql_real_escape_string 只转义一种类型的引号【英文标题】:mysql_real_escape_string only escaping one type of quote 【发布时间】:2011-11-13 12:11:21 【问题描述】:

我的服务器正在运行 php 5.2.17,并且我使用 php.ini 文件禁用了魔术引号。我有一个字符串数组,有些像

abcd "efg" hij'k lmnop'q

我正在使用以下代码将它们转义以插入 mysql 数据库

foreach($array as &$data) 
    mysql_real_escape_string($data);

然后我像这样构造我的 sql

$sql='INSERT INTO table VALUES('.
     '"'.$array[0].'", '.
     '"'.$array[1].'", '.
     '"'.$array[2].'")';

当我尝试执行查询时出现错误。当我收到错误时输出 $sql 变量,似乎 mysql_real_escape_string 只是转义单引号或双引号。

如果我的 $sql 变量是使用单引号创建的,并且列值在双引号中,就像上面一样,那么单引号会被转义,但双引号不会。

如果我切换引号,以便使用双引号创建 $sql 变量并且列值在单引号中,则只有双引号被转义。

谁能弄清楚可能出了什么问题?

**更新

马楚想通了。我已将代码更改为以下内容,并且可以正常工作:

foreach($row as &$data) 
    $data = mysql_real_escape_string($data);

【问题讨论】:

你可能想看看PDO,占位符有点好。 一个PDO的使用例子可以在NullUserException的回答中找到(无耻的自我推销) 【参考方案1】:

mysql_real_escape_string 不会 修改字符串对象本身,即使您使用& 通过引用而不是值传递也是如此。相反,它返回字符串的转义副本。您不能只运行该功能;您必须将其输出分配给变量。

我现在不在一个可以测试的地方,但Joe 说这可以解决问题:

$data = mysql_real_escape_string($data);

【讨论】:

代码:$data = mysql_real_escape_string($data); @Joe:谢谢 :) 这个盒子上没有 PHP,而且,由于我对 PHP 如何处理 & 不是非常熟悉,所以我没有信心包括代码块而无法对其进行测试。当然,我会在其中快速编辑它,并正确归因:)【参考方案2】:

更好的解决方案是改用PDO prepared statements:

$stmt = $dbh->prepare("INSERT INTO table VALUES(?, ?, ?)"); 
$stmt->execute($array); 

没有对mysql_real_escape_string() 的重复调用、没有迭代和(IMO)更简洁的代码。

【讨论】:

【参考方案3】:

Matchu 是正确的,mysql_real_escape_string 返回转义后的字符串。试试……

foreach($array as &$data) 
   $data = mysql_real_escape_string( $data );

祝你好运。

【讨论】:

以上是关于mysql_real_escape_string 只转义一种类型的引号的主要内容,如果未能解决你的问题,请参考以下文章

mysql_real_escape_string() 坏了吗?

如何在 PDO 中使用/编写 mysql_real_escape_string? [复制]

sqli-labs less37 POST- Bypass MYSQL_real_escape_string (POST型绕过MYSQL_real_escape_string的注入)

使用准备好的语句时是不是需要 mysql_real_escape_string()?

什么是 mysql_real_escape_string() 而addslashes() 没有?

MySQL QUOTE() 与 mysql_real_escape_string()?