2012-11-12 65 views
3

我一直在尋找一些主題,但還沒有找到任何可行的工作 - 或者它可以,但我對PHP/MySQL很新,所以也許我我只是想念一些東西。帶有撇號的PHP查詢中的搜索條件

我有一個頁面,允許用戶鍵入一個項目的名稱在(MySQL)數據庫中查找它。然後它生成一個結果表並顯示這些結果,並將一些數據轉換爲鏈接。然後將鏈接的術語用作查詢來搜索數據庫的其他字段。

一切正常......除非其中一個搜索項包含撇號。顯然我想防止注射問題,但我也需要用撇號搜索。下面的代碼我有:

$query = mysql_real_escape_string($query); 
$query = htmlspecialchars($query); 
$queryentered = $query; 
$query = strtolower($query); 

而這裏的就是這樣的傳球到查詢的網址:

echo " from <a href='index.php?volume=".$results2['book']."' class='where'>" 
.$results2['book']."</a>"; 

和查詢:

$raw_results = mysql_query("SELECT * FROM $database1 WHERE $wh LIKE '%$query%' 
ORDER BY displayname") or die(mysql_error()); 

什麼我不編碼正確的?當我運行一個搜索時,它會顯示「找不到[搜索字詞]的結果」,我在那裏得到任何撇號的結果。

+2

嗨@Lera,歡迎來到SO。 +1格式整齊,直接的問題。 :) – Ben

+0

您需要打印出最終的SQL查詢字符串,然後查看該字符串以進行調試。 – mario

+0

如果您剛剛開始使用PHP/MySQL,我強烈建議您查看mysqli *函數組,而不是! http://php.net/manual/en/book.mysqli.php – Geo

回答

1

我強烈建議使用預準備語句和PDO庫。

  • 真的很容易學習
  • 會讓你的問題更容易解決
  • 作品有(最)任何數據庫
  • 走一段很長的路要走,以防止你提到
  • 技能集將注入問題適用於您可能學習的其他語言

您只需編寫查詢,然後準備連接字符串(與數據庫e類型和詳細信息),然後觸發查詢。與查詢一起發送參數數組,以解耦數據。

幫助鏈接:

http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/

http://id1.php.net/pdo

2

這個片段是完全錯誤的順序:

$query = mysql_real_escape_string($query); 
$query = htmlspecialchars($query); 
$queryentered = $query; 
$query = strtolower($query); 

逃逸應最後完成,數據庫查詢字符串連接前右。在這種情況下,它不相關,因爲strtolower不能撤銷轉義。更嚴重的是實際上HTML轉義,它不屬於SQL上下文。不要覆蓋你的主變量,而是:

$queryentered = htmlspecialchars($query); 
$query = strtolower($query); 
$query = mysql_real_escape_string($query); 

繁瑣的數據庫轉義,btw,很容易避免。看看PDO and prepared statements

1

的問題是在這條線:

$query = htmlspecialchars($query); 

如果你搜索Death's book最終$querydeath\&#039;s book! 通過刪除htmlspecialchars您的查詢會很好!