2011-06-07 120 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文件中關閉該斜槓。