为什么msyqli_real_escape_string()不能正确地转义多个反斜杠?

问题描述:

鉴于这种SQL为什么msyqli_real_escape_string()不能正确地转义多个反斜杠?

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

为什么会mysqli_real_escape_string()无法正常逃离这个字符串?

试图逃脱列的值之后,使用该SQL查询产生这种mysqli的错误:

“您的SQL语法错误;检查对应于您的MySQL服务器版本的使用权语法手册在'3号线附近'karla bailey-pearapppppppp \\\\\\''在线3“

是否有数量限制可以逃脱的反斜杠?

+1

为什么你仍然使用mysqli_real_escape_string(),而不是使用绑定变量....那么这将是一个非问题 –

+4

在哪里以及如何实现msyqli_real_escape_string()?你的问题没有什么可以支持这一点。顺便说一句,它是'mysqli_real_escape_string()'而不是'msyqli_real_escape_string()'所以如果这就是你正在使用或不是;展示下。 –

+0

看起来像是=和karla之间的错误 –

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

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

你是否逃避了ENTIRE字符串?例如

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

如果是这样,那是不正确的。你这样做是在捣毁字符串。你也将逃避',它划定你的where子句的值。只应执行转义VALUES,您将其插入到字符串中。例如

$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'; 
+0

很好的纠正他们*希望*错字'msyqli_real_escape_string' –

+0

不,我逃避的价值。现在处理一个示例脚本。 –

+0

我很困惑。当我在应用程序之外尝试时,它不会失败。我可以在应用程序中完全重现,直到使用我创建的测试代码来创建连接,转义字符串,运行UPDATE查询。当我使用页面中的值(通过POST)时失败,但在测试脚本中使用相同的值时失败。该值使用rawurlencode()传递,所以在我的测试脚本中,我使用了编码值,然后使用rawurldecode(),但每次仍然有效。 –