2011-10-10 26 views
0

我有一個4記錄表。mysql like語句不按預期方式工作

Records: 1) arup Sarma 
     2) Mitali Sarma 
     3) Nisha 
     4) haren Sarma 

而且我使用下面的SQL語句從搜索框中獲取記錄。

$sql = "SELECT id,name FROM ".user_table." WHERE name LIKE '%$q' LIMIT 5"; 

但是這個檢索表中的所有記錄。即使我輸入一個不存在的單詞(例如:hgasd或任何其他單詞),它也會顯示上面的所有4條記錄。哪裏有問題 ? PLZ任何意見..

這是我的全碼:

$q = ucwords(addslashes($_POST['q'])); 
$sql = "SELECT id,name FROM ".user_table." WHERE name LIKE '%".$q."' LIMIT 5"; 
$rsd = mysql_query($sql); 
+1

你確定'$ q'有一個值嗎?你可以嘗試'var_dump($ q)'?你如何填充該變量? – mellamokb

+0

你可以打印出呈現的字符串以確保$ q變量不是問題嗎? – smp7d

+0

您的$ q可能是空的。 – konsolenfreddy

回答

3

您所查詢的是罰款。你的問題是,$ Q不具有任何價值,或者你被錯誤地追加價值,您的查詢,讓你有效地做:

"SELECT id,name FROM ".user_table." WHERE name LIKE '%' LIMIT 5"; 
+0

你沒有評論SQL注入問題,在你的答案之後,在那個代碼**中編輯的OP,所以我不會爲此而下調。 – Johan

-1

在MySQL中,像操作者使用「$」正則表達式來表示任何結束字符串..和'%'是開頭..所以任何字符串將屬於這個正則表達式,這就是爲什麼它返回所有記錄。 請參閱http://dev.mysql.com/doc/refman/5.0/en/pattern-matching.html一次。希望對你有幫助。

+0

對於鏈接+1,對於實際上沒有閱讀它說的-1。(提示:'REGEXP'和'LIKE'不是一回事。) –

0

使用下面的代碼
A - 防止SQL注入
乙 - 防止像一個空的$ Q

//$q = ucwords(addslashes($_POST['q'])); 
//Addslashes does not work to prevent SQL-injection! 
$q = mysql_real_escape_string($_POST['q']); 
if (isset($q)) { 
    $sql = "SELECT id,name FROM user_table WHERE name LIKE '%$q' 
      ORDER BY id DESC 
      LIMIT 5 OFFSET 0"; 
    $result = mysql_query($sql); 
    while ($row = mysql_fetch_row($result)) { 
    echo "id: ".htmlentities($row['id']); 
    echo "name: ".htmlentities($row['name']); 
    } 
} else { //$q is empty, handle the error } 

在代碼中的幾點意見。

  1. 如果您不是使用PDO,而是使用mysql,只有mysql_real_escape_string可以保護您免受SQL注入攻擊,否則將無法使用。
  2. 總是圍繞任何$vars注入代碼與單'報價。如果你不逃脫將無法正常工作,語法錯誤將打擊你。
  3. 您可以使用isset測試var以查看它是否已填充。
  4. 爲什麼要連接表名?只需像往常一樣將表的名稱放在字符串中。
  5. 如果你只選擇幾行,你真的需要一個order by子句,所以結果將不是隨機的,這裏我已經訂購了最新的id,假設id是一個auto_increment字段,較新的id將代表較新的用戶。
  6. 如果您從數據庫回顯數據,則需要使用htmlentities來避免這種情況,以防止出現XSS安全漏洞。