为什么msyqli_real_escape_string()没有正确地逃避多个反斜杠?

时间:2015-04-22 16:50:35

标签: php mysql

鉴于此SQL

UPDATE `mytable` 
SET `mycolumn`='karla bailey-pearapppppppp\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' 
WHERE `id`=5619 

为什么mysqli_real_escape_string()无法正确转义此字符串?

在转义列的值后尝试使用此SQL查询会产生此mysqli错误:

"您的SQL语法出错了;查看与您的MySQL服务器版本相对应的手册,以便在'' karla bailey-pearapppppppp附近使用正确的语法。\\\\\\\\\\\\\\\\\\\\\ \\\\\\'在第3行"

可以转义的反斜杠数量是否有限制?

2 个答案:

答案 0 :(得分:2)

你是否逃脱了整个字符串? e.g。

$sql = "UPDATE .... \\\\\\\'";
$escaped = mysqli_real_escape_string($link, $sql);

如果是这样,那是不正确的。你这样做是在破坏字符串。您还将转义用于分隔where子句值的'。转义应仅执行您插入字符串的 VALUES 。 e.g。

$name = "Miles O'Brien"; // ' in name would cause syntax error
$bad_sql = "SELECT '$name'";
$broken_sql = mysqli_real_escape_string($link, $bad_sql);
// produces: SELECT \'Miles O\'Brien\'


$ok_sql = "SELECT '" . mysqli_real_escape_string($link, $name) . "'";
// produces: SELECT 'Miles O\'Brien';

答案 1 :(得分:1)

好的,所以我发现了问题。应用程序检查值长度>最大列,如果值太大,则在转义完成后截断值 - 从而打破转义值(非常孤立的情况,这将发生这种情况,此代码已存在多年)。

问题是,在值已经转义后,不能截断以反斜杠结尾的值。