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