我使用php和mysql构建了一个搜索引擎。
问题: 当我在其中提交带有撇号的单词并使用$ _GET将值返回到文本字段时,撇号已替换为反斜杠,并且撇号后的所有字符都将丢失。
实施例:
提交的字词:Just can't get enough
返回值(使用$ _GET):Just can\
此网址也是这样的:search=just+can%27t+get+enough
正如你所看到的那样'已被替换为\并且缺少足够的东西。
问题: 有没有人知道导致这种情况发生的原因以及解决这个问题的解决方案是什么?
答案 0 :(得分:1)
如果您运行的PHP版本低于5.3.0,则可以在。{3}}中添加斜杠,您可以在.ini文件中关闭。
答案 1 :(得分:0)
单引号在PHP和MySQL中很重要。
单引号是PHP中字符串的分隔符,例如:
$str = 'my string';
如果要在字符串中包含文字引号,则必须告诉PHP引用不字符串的结尾。它使用反斜杠转义,例如:
$str = 'my string with a quote \' inside it';
有关详情,请参阅PHP Strings。
MySQL以类似的方式运行。示例查询可能是:
$username = 'andyb';
$quert = "SELECT * FROM users WHERE user_name = '$username'";
单引号分隔字符串参数。如果$username
包含单引号,则会导致查询过早结束。正确转义参数是一个需要熟悉的重要概念,因为它是一个攻击数据库的攻击媒介 - 有关详细信息,请参阅SQL Injection。
处理此转义的一种方法是使用mysql_real_escape_string()
。
答案 2 :(得分:0)
从“值到文本字段”的描述中我推测你有一些像这样的输出代码:
Redisplay
<input value='<?=$_GET['search']?>'>
在这种情况下,包含的单引号将终止html属性。单引号背后的任何内容都只是浏览器的垃圾。在这种情况下,将htmlspecialchars
应用于输出会有所帮助。
(反斜杠很可能是因为magic_quotes或mysql _ * _ escape在输出文本之前。我怀疑这个问题在这里描述了一个数据库错误。)
更新:这似乎确实是输出问题:
echo "<a href='searchmusic.php?search=$search&s=$next'>Next</a>";
无论您使用单引号还是双引号,都需要:
echo "<a href='searchmusic.php?search="
. htmlspecialchars(stripslashes($search))
. "&s=$next'>Next</a>";
(请注意,使用stripslashes
是一种解决方法。您应该保留原始搜索文本,或者保留disable the magic_quotes
。)
好的,我忘记了一些至关重要的事情。 htmlspecialchars
需要 ENT_QUOTES 参数 - 总是,特别是在您的情况下:
// prepare for later output:
$search = $_GET['search'];
$html_search = htmlspecialchars(stripslashes($search), ENT_QUOTES);
然后在你想要显示$ search之前使用它:
echo "<a href='searchmusic.php?search=$html_search&s=$next'>Next</a>";