Mysql_real_escape_string只转义一种引用类型


mysql_real_escape_string only escaping one type of quote

我的服务器正在运行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变量使用双引号创建,列值在单引号中,只有双引号被转义。

有谁能找出可能出了什么问题吗?

* *更新

Matchu发现了。我已经将我的代码更改为以下代码,它可以工作:

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

mysql_real_escape_string 修改字符串对象本身,即使您使用&通过引用而不是通过值传递。相反,它返回字符串的转义副本。你不能只是运行函数;你必须把它的输出赋值给一个变量。

我现在没有地方可以测试,但是Joe说这是可行的:

$data = mysql_real_escape_string($data);

一个更好的解决方案是使用PDO预处理语句:

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

不重复调用mysql_real_escape_string(),不迭代,(IMO)代码更干净。

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

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

好运。