我的服务器正在运行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);
}
答案 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 );
}
祝你好运。