2012-09-05 74 views
2

我有一個生成一個MySQL的SELECT語句中的PHP腳本:MySQL的SELECT語句GET變量

SELECT * FROM話,其中一句話=「經典」

有中字表中只有一個字可變字等於經典。

當我的PHP頁面執行時,我沒有從查詢中得到任何結果。如果我回顯用於執行查詢的字符串,請將其剪切並粘貼到數據庫中的PHPMyAdmin的SQL窗口中,但我也沒有得到任何結果。但是,如果我將該EXACT字符串重新輸入到PHPMyAdmin中的SQL窗口中(使用相同的引號字符),我會得到一行的正確結果。

select語句中的經典單詞來自PHP GET(請參閱下面的代碼)。我可以回顯$ word變量,並獲得'Classic'的正確結果。我究竟做錯了什麼?

這裏是我的代碼:

<?php 

    require ('dbconnect.php'); 

    $word = $_GET["word"]; 

    $selectStr = "SELECT * FROM words WHERE word = '" . $word . "'"; 

    if ($results = MySQL($dbName, $selectStr)) 
    { 
    $rowCount = MySQL_NUMROWS($results); 
    } 

    $resultRow = MYSQL_FETCH_ROW($results); 

    $wordID = $resultRow[0]; 

?> 
+8

你應該永遠不要直接在SQL語句上使用請求變量。 – samura

+1

它不回答你的問題,但請記住你**必須**總是在用戶輸入之前清理用戶輸入,然後在查詢中使用它以避免SQL注入! – Marco

+0

會不會有任何區分大小寫問題? – Sourabh

回答

3

請,請,請消毒這個詞。 mysql_real_escape_string()應該做的伎倆。

$selectStr = "SELECT * FROM words WHERE word LIKE '" . $sanitized_word_i_promise . "'";應該工作:)

只是解釋: 「=」 必須精確匹配工作。這包括大寫/小寫,空格等。在查詢中使用它之前,您應該先修剪該結果。

如果您有foo存儲在數據庫中(請注意最後的空格) - 它不會匹配foo,沒有空格。你可能想要使用LIKE 'foo%'。無論哪種方式,Sourabh都是對的,雖然表現明智,但在嘗試匹配確切字符串時這不是一個大問題,您應該首先在其他地方查找問題(例如,是數據庫中的項目完全符合?)。

+1

當他想要完全匹配時,使用like不是一個好選擇。性能會很差 – Sourabh

+0

你說得對。我被這個變量嚇到了。更新:) – Claudiu

+1

好的。瞭解。用消毒這個詞,並使用LIKE語句,我使它正常工作。謝謝! –

2

首先,您不應該接受任何用戶輸入並直接將其輸入到查詢中,而無需進行消毒或使用預準備語句。

現在我們已經明白了:您是否嘗試過使用變量和您的字符串寫入strcmp()?如

回聲的strcmp($ _ GET [ '字'], 「經典」)

如果你獲得比0的結果,這意味着他們是不一樣的,很有可能會出現$ _GET變量中的某種空白。使用trim()來取出空格。也可能是一個區分大小寫的問題。

+0

我得到一個1,這意味着單詞是不一樣的。但我已經嘗試使用trim()和mysql_real_escape_string(),並且字符串仍然不匹配。 –

+0

可能是一些大/小寫問題。 – Claudiu