【问题标题】:mysql_real_escape_string only escaping one type of quotemysql_real_escape_string 只转义一种类型的引号
【发布时间】: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的回答中找到(无耻的自我推销)

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


【解决方案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 );
    }
    

    祝你好运。

    【讨论】:

      猜你喜欢
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      • 2013-01-28
      • 2011-09-10
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      • 1970-01-01
      相关资源
      最近更新 更多