2015-04-18 43 views
1

我一直在搞亂我的搜索頁面。我加了mysqli_real_escape_stringstrip_tags,據我所知,一切正常,應該是安全的。在搜索字段中輸入單引號導致mysqli_num_rows錯誤

我只是試圖在搜索表單中輸入隨機符號,以查看是否所有數據庫條目都可以在這些安全措施的適當位置找到。除了當我搜索單引號(')時,所有的都不錯。

這給了我「mysqli_num_rows()期望參數1爲mysqli_result,布爾給定」錯誤。有很多關於這個錯誤的信息,我知道如何解決它(至少我是這麼認爲的)。然而,在這種特定的情況下,我不知道:/

代碼:

ini_set('display_errors', 1); 
$search = $_GET ['q']; 
$conn = mysqli_connect("localhost", "root", "","release"); 
$search = mysqli_real_escape_string($conn, "$search"); 
$search = stripslashes(strip_tags(trim("$search"))); 

$query = mysqli_query($conn,"SELECT * FROM game WHERE game_name LIKE '%". $search ."%' ORDER BY game_release"); 
$count = mysqli_num_rows($query); 
+1

您必須使用綁定參數機制。 它顯示在這裏: http://stackoverflow.com/questions/15748254/how-to-run-the-bind-param-statement-in-php –

+0

@KanchoIliev你應該,但你沒有至。 – jeroen

+0

是的,你說得對,對不起。 –

回答

1

你應該在最後使用mysqli_real_escape_string,你注入的變量在數據庫中的查詢權之前,雖然準備的語句是首選。就我而言更容易。

您當前的問題不在於你不能只是mysqli_real_escape_string做到這一點,但是功能的組合和順序使用:

$search = mysqli_real_escape_string($conn, "$search"); 
$search = stripslashes(strip_tags(trim("$search"))); 

您轉義爲MySQL值的特殊字符在第一線。這是通過添加斜槓來完成的。

而在第二行中,您刪除了斜槓,撤銷了與mysqli_real_escape_string的轉義,並使您的查詢容易受到sql注入的影響。

至於對SQL語句中的有關安全的問題,mysqli_real_escape_string是不夠的,所以你只需要一個準備好的聲明或:

$search = mysqli_real_escape_string($conn, $search); 

其餘部分是不必要的,但如果你想這樣做任何方式(例如,如果不允許使用標籤),您應該將該行移動到最終轉義行的上方:

$search = stripslashes(strip_tags(trim($search))); 
$search = mysqli_real_escape_string($conn, $search); 

// and now run your query without further manipulation: 
$query = mysqli_query(...); 
+1

謝謝你對Jeroen的清晰解釋。接受這樣的構建答案真的幫助我很多! – Michael

相關問題