2010-10-02 55 views
2

好吧,我想就如何以正確的方式編寫高級搜索配置文件提供一些建議。PHP:編碼「高級搜索」最好的方法

「高級」搜索包含:

Gender female/both/male 
Search in All/latest profiles 1/2/7/14/32 days ago 
Online: Yes(checked) 
Age (xx) to (xx) years (xx means you can write e.g 12 and 18) 
Cities: all/city1/city2/city3 

有很多,你可以挑選標準。

我想知道我應該如何編碼這個最有效的方式,用最少的代碼重複。我應該從用戶選擇的內容構建一個查詢嗎?例如:

$query = "SELECT * FROM users WHERE" 
if(!empty($gender){ // if its empty, then the user chose both.. 
    $query .= "gender = $gender"; 
} 
.... 

或者有沒有更好的解決方案?我認爲這樣做會導致問題,因爲如果用戶不選擇任何性別,而另一個如果$在線(示例)以AND開頭,則將導致在哪裏並且...

回答

0

我認爲你的解決方案是一個很好的開始。繼續檢查高級搜索字段,並根據需要構建SQL where子句。

如果您需要模糊邏輯 - 男性或城市1,問題就來了。但是你沒有在你的OP中表示過。

爲了避免WHERE AND剛開始你在那裏有一個真正的表達條款:

$query = "SELECT * FROM users WHERE 1" 

這將始終評估爲真,當你添加更多的條件下,他們會正確地追加 - SELECT * FROM users WHERE 1 AND city = 'city1'

0

的「和「問題很容易解決:

$andArr[] = "gender = $gender"; 
$andArr[] = "age between $from and $to"; 
... 

$adsString = implode(' AND ', $andArr); 

對於性別我會使用一個下拉與」兩個「作爲預選。

+0

請不要使用未初始化的變量,如andArr。另外,我很漂亮,在最後一行的$ andArr之後不應該有任何大括號。編輯。 – phihag 2010-10-02 13:54:13

+0

它只是一個代碼片段。通常我初始化所有變量。 $ andArr = array();會在我的$ andArr [] = ...之前; – ITroubs 2010-10-02 14:04:15

+0

內爆是做什麼的?如果我回聲的字符串,它會是性別= $性別和年齡介於$從和$到? – Johnson 2010-10-02 14:20:05

-1

請不要編寫允許SQL injections的代碼。另外,請確保您的php代碼與register_globals set to off一起運行。除此之外,我認爲沒有理由不這樣做。

因此,這裏是一個簡單的例子,使用PDO

$query = 'SELECT * FROM users WHERE 1'; 
$params = array(); 
if (!empty($_POST['gender'])) { 
    $query .= ' AND gender=:gender' 
    $params[':gender'] = $_POST['gender']; 
} 
... 
$st = $pdo->prepare($query); 
$result = $st>execute($params); 
+1

如果我在上面的例子的開始$查詢中添加「WHERE 1」,它是否允許sql注入? – Johnson 2010-10-02 13:56:46

+0

我的registerglobal關閉 – Johnson 2010-10-02 13:57:45

+0

@ user457827我只是假設$性別是直接用戶輸入(並且需要register_globals)。如果你做了一些預處理,如果預處理是正確的話,它是安全的。基本上唯一確定的方法是使用intval之類的安全函數,或者將其與可能值的硬編碼列表進行比較。既然在那裏很容易搞砸,我會一直使用準備好的狀態動作。 – phihag 2010-10-02 14:01:08