2011-06-07 154 views
2

我已经建立了使用PHP和MySQL的搜索引擎。撇号问题

问题: 当我提交一个带有撇号的单词并使用$ _GET将值返回给文本字段时,撇号已被替换为反斜杠,撇号后的所有字符都丢失。

例子: 提交词:Just can't get enough
返回值(使用$ _ GET):Just can\
同样的网址出现这样的:search=just+can%27t+get+enough

正如你可以看到“已被替换为\和得到足够的是缺失。

问: 有谁知道是什么原因导致这种情况发生的,什么是解决这个问题的解决方案?

代码: http://tinypaste.com/11d62

+0

是它在表上是否正确?如果没有,也许你在保存数据时没有逃脱它。 Apos必须加倍,例如更新... set col1 ='我不知道'... – Bohemian 2011-06-07 23:09:08

+0

你可以显示更多代码的例子吗?这不会发生在我身上。 – MGwynne 2011-06-07 23:10:22

+0

尝试在get上运行urldecode,然后尝试运行mysql_real_escape_string(使数据库使用安全)。不知道这是否是问题,但值得一试。就像MGwynne说的那样,当你访问get变量时不应该发生这种情况,它可能发生在你将它添加到数据库时 – Ben 2011-06-07 23:12:51

回答

0

从你的“价值的文本字段”的描述我猜测你有一些输出这样的代码:

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>"; 
+0

啊...我看到你在说什么... – IAbstract 2011-06-07 23:20:16

+0

搜索box shows just can/too – mofhd 2011-06-07 23:25:43

+0

你需要申请'htmlspecialchars()'*无处不在*你试图输出'$ search'。为了简单起见,我建议你做一个'$ html_search = htmlspecialchars($ search,ENT_QUOTES);'一次,然后打印'$ html_search'。 – mario 2011-06-07 23:30:29

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()

1

如果您运行的PHP版本低于5.3.0,则可以通过Magic Quotes添加斜杠,您可以在.ini文件中关闭该斜杠。