在php替换语句中的单引号即使转义也会返回错误

时间:2012-09-15 16:17:17

标签: php mysql

我需要在mysql数据库中替换单引号,并使用脚本来执行此操作。它适用于其他角色但是当涉及单引号时它根本不起作用。

$sql[$handle]['sql'] = 'UPDATE '.$table.' SET '.$field.' = REPLACE('.$field.',\''.$search[$i].'\',\''.$replace[$i].'\')'

尝试替换单引号时出现此错误:

  

您的SQL语法有错误;检查手册   对应于您的MySQL服务器版本,以便使用正确的语法   靠近'''''''''在第1行)

这是我用来搜索引号的字符串:$search[] = ('\'');

2 个答案:

答案 0 :(得分:2)

您需要转义$search,因为您传递的是单引号 - 所以当它转到MySQL时,它看起来像这样:'''。加上这个:

$search[$i] = addslashes($search[$i]);

使用preparing statements来避免转义和SQL注入问题会更好。

答案 1 :(得分:0)

使用prepared statements?占位符。此示例使用PEAR DB package

<?php
    // import the PEAR DB module
    require_once("DB.php");

    // connect
    $dsn = "mysqli://tehUserName:tehPassWord@db.example.com/tehDatabase";
    $conn = DB::connect($dsn);

    // note the question marks, `?`, used for the string values
    $statement = 'UPDATE '.$table.' SET '.$field.' = REPLACE(?, ?, ?)';
    $result = $conn->query ($statement, [ $field, $search[$i], $replace[$i] ]);

    // ...

PEAR数据库软件包已经被取代了,我认为 - 自从我编写PHP代码以来已经有一段时间了 - 但这个代码片段演示了预处理语句和占位符。

不使用PEAR DB包,您仍然可以使用预处理语句和占位符,但我不确定。 (如果有人想要编辑此问题......)请参阅article on Prepared Statements on php.net