mysql_real_escape_string只转义一种报价

时间:2011-09-09 04:42:53

标签: php mysql escaping quotes mysql-real-escape-string

我的服务器正在运行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);
}

3 个答案:

答案 0 :(得分:4)

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

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

$data = mysql_real_escape_string($data);

答案 1 :(得分:3)

更好的解决方案是使用PDO prepared statements代替:

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

没有重复调用mysql_real_escape_string(),没有迭代和(IMO)清洁代码。

答案 2 :(得分:1)

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

foreach($array as &$data) {
   $data = mysql_real_escape_string( $data );
}
祝你好运。