撇号问题
我已经建立了使用PHP和MySQL的搜索引擎。撇号问题
问题: 当我提交一个带有撇号的单词并使用$ _GET将值返回给文本字段时,撇号已被替换为反斜杠,撇号后的所有字符都丢失。
例子: 提交词:Just can't get enough
返回值(使用$ _ GET):Just can\
同样的网址出现这样的:search=just+can%27t+get+enough
正如你可以看到“已被替换为\和得到足够的是缺失。
问: 有谁知道是什么原因导致这种情况发生的,什么是解决这个问题的解决方案?
从你的“价值的文本字段”的描述我猜测你有一些输出这样的代码:
Redisplay
<input value='<?=$_GET['search']?>'>
在这种情况下,包含单引号将终止HTML属性。而且单引号后面的任何内容都只是对浏览器的垃圾。在这种情况下,应用htmlspecialchars
来帮助输出。
(反斜杠可能是由于magic_quotes或mysql _ * _在输出文本之前转义的。我怀疑这个问题是否描述了数据库错误。)
更新:看来这的确是一个输出问题就在这里:
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);
,然后使用等。无论您想显示前$搜索:
echo "<a href='searchmusic.php?search=$html_search&s=$next'>Next</a>";
单引号是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()
。
是它在表上是否正确?如果没有,也许你在保存数据时没有逃脱它。 Apos必须加倍,例如更新... set col1 ='我不知道'... – Bohemian 2011-06-07 23:09:08
你可以显示更多代码的例子吗?这不会发生在我身上。 – MGwynne 2011-06-07 23:10:22
尝试在get上运行urldecode,然后尝试运行mysql_real_escape_string(使数据库使用安全)。不知道这是否是问题,但值得一试。就像MGwynne说的那样,当你访问get变量时不应该发生这种情况,它可能发生在你将它添加到数据库时 – Ben 2011-06-07 23:12:51