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()?