2012-07-26 16 views
0

所以我嘗試創建一個MySQL命令來搜索一個表。我想要它做的是:嘗試創建MySQL命令,它選擇一列並搜索另外兩行

我的表有4列:id,categories,brands,names

在搜索頁面的php/html 上,用戶從下拉菜單中選擇一個類別。這是該類別,因此將其作爲category發佈到搜索頁面。然後你在關鍵字中輸入文本框。這被張貼keyword到搜索頁面。

我要作出這樣的選擇發佈,然後在categories類別搜索那些選擇行在brands我貼關鍵字MySQL命令,並names

這是我曾嘗試:

"SELECT brands, names 
    FROM tableName 
    WHERE categories LIKE".$_GET['category']." 
    AND (brands LIKE ".$_GET['keyword']." 
    OR names LIKE ".$_GET['keyword'].");"; 
+0

有點偏離主題,但您的查詢很容易受到SQL注入的影響;這意味着任何腳本小孩都可以完全控制您的數據庫。您不應該將此代碼用於任何嚴重的應用程序。 – AardvarkSoup 2012-07-26 21:46:56

+0

謝謝馬特。這很容易閱讀 – eciusr 2012-07-26 21:47:50

+0

是的,我知道@AaRdvarkSoup只是簡單的查詢。但如果您願意的話,我會很感激您的意見。永遠不要太瞭解安全。謝謝 – eciusr 2012-07-26 21:50:00

回答

1

您需要SQL中字符串的引號。試試這個:

"SELECT brands, names 
    FROM tableName 
    WHERE categories LIKE '".$_GET['category']."' 
    AND (brands LIKE '".$_GET['keyword']."' 
     OR names LIKE '".$_GET['keyword']."');"; 

除非你預計會有變化,例如使用LIKE開頭的幾個單詞並不多。如果您期待這一點,您需要使用通配符來指定您期望差異的位置,例如

brands LIKE '".$_GET['keyword']."%' 
// User enters 'Mc', SQL end up as: 
brands LIKE 'Mc%' 
// Columns matched: 'McDonalds' 'McHenry' 

更多示例here

如果你不想允許這樣做,只需使用=而不是LIKE。

您還需要首先使用正則表達式或類似的方法來清理這些變量,因爲這樣當前會允許有人用SQL injection攻擊您的服務器。

+0

謝謝你的工作。我使用'LIKE',因爲即時通訊使用Ajax,可以在輸入時創建列表。但我確實將'categories'搜索切換到'='。 – eciusr 2012-07-26 22:20:36

0

把你的命令,並在您的SQL文檔編輯器玩它,我認爲這是有事情和

(brands LIKE ".$_GET['keyword']." OR names LIKE ".$_GET['keyword'].");" 

我知道SQLite中,你可以使用一個等號,而不是LIKE的,

(brands='".$_GET['keyword']."' OR names='".$_GET['keyword']."');"