Addslashes似乎有点困惑。给出以下2行代码
$name = "Dave's test";
$newName = addslashes($name);
我期待 $ newName “Dave的测试”(我的单引号很好地逃脱了)
然而,我获取的是“Dave \\的测试”(请注意DOUBLE反斜杠)。这与我在addslashes上找到的每一个在线文档相矛盾 - 并且让我感到非常悲痛。
我将通过error_log ...
将addslashes结果转储到http错误日志之前和之后error_log("before=$name after=$newName");
结果...
before=Dave's test after=Dave\\'s test
注意 - 这是ajax过程的一部分,所以我无法真正“回应”结果。
非常感谢任何关于为什么addlashes会在后退上加倍的见解。
仅供参考:我在linux下使用PHP 5.2.6并使用魔术引号OFF。
答案 0 :(得分:4)
看起来error_log在内部调用addslashes。在阅读了回复我原来问题的帖子后,我创建了一个非常简单的脚本......
<?php
$name = "Dave's test";
$newName = addslashes($name);
echo "name=$name. newName=$newName";
error_log("name=$name. newName=$newName");
?>
echo的结果:
name=Dave's test. newName=Dave\'s test
error_log的结果:
name=Dave's test. newName=Dave\\'s test
非常感谢所有花时间阅读和评论这个问题的人。这是我关于Stack Overflow的第一个问题,我只是被响应的速度所震惊。多么棒的社区!
答案 1 :(得分:1)
对于初学者,你为什么要逃脱addslashes()
?这是一种不充分的方法,特别是如果你试图防止SQL注入。
您还能告诉我们您的配置,以便我们尝试复制吗?
答案 2 :(得分:1)
您可以在php.ini文件中将magic_quotes_gpc设置为Off。这将阻止你的双重逃避。请记住要谨慎行事,就好像你正在使用SQL一样,你可以轻松地进行一些SQL注入。
答案 3 :(得分:0)
我的猜测是error_log()
功能正在使用另一个反斜杠转义反斜杠本身。
然后表示的字符串在技术上只有1个反斜杠,这是期望的结果。
试试这个简单的测试:
error_log('\a')
并查看您是否在日志中获得\\a
答案 4 :(得分:0)
无法在5.2.6或5.2.0安装上进行复制。
如果您在编写的操作后立即回显$ newName ,您是否看到了双反斜杠?我问,因为我怀疑其他处理层的干预是反斜杠加倍,而不是addslashes()。
答案 5 :(得分:0)
注意 - 这是ajax过程的一部分,所以我无法真正“回应”结果。
我认为这可能是问题的关键 - 我认为addslashes可能正确地为该引用添加了一个反斜杠,但不知何故,你的AJAX进程再次逃避它。你是通过JSON传递这个文本(使用json_encode)?如果是这样,你不需要转义它,因为json_encode()将透明地执行它。
如果您无法“回显”结果,或者将其写入文件?
$name = "Dave's test";
$newName = addslashes($name);
file_put_contents('/tmp/test.txt', $newName); // temporary
这至少可以让你向自己证明你的addslashes()正在做它应该做的事情。
答案 6 :(得分:0)
我建议您使用 sprintf 格式化字符串,addslashes可以使用斜杠留下您的日志,而您只想格式化字符串。