2010-09-29 53 views
1

在我的搜索表單中,我有價值男性,價值女性和價值兩者。如果同時選擇了,我不希望有在那裏的「性別=‘$性’」如何在PHP中有條件地爲我的查詢添加一個子句?

我應該做這樣的:

if(empty($sex)){ // value empty if you chose "both" 
$query = "SELECT firstname, lastname, id, user_name, sex, last_access, bostadsort FROM users WHERE (firstname LIKE '%$firstname%' OR lastname LIKE '%$lastname%')"; 
}else{ 
$query = "SELECT firstname, lastname, id, user_name, sex, last_access, bostadsort FROM users WHERE (firstname LIKE '%$firstname%' OR lastname LIKE '%$lastname%') AND sex = '$sex'"; 
} 

還是有寫這一個聰明的辦法?

+1

有趣的標題。考慮使用性別。 – 2010-09-29 19:06:43

+3

空性更有趣。 – 2010-09-29 19:09:25

+0

HAHA!現在,當我再次閱讀標題時......這很有趣:P我喜歡使用「性」而不是性別。 – Johnson 2010-09-29 19:14:22

回答

3

如何不重複自己:

$query = "SELECT firstname, lastname, id, user_name, sex, last_access, bostadsort FROM users WHERE (firstname LIKE '%$firstname%' OR lastname LIKE '%$lastname%')"; 

if(!empty($sex)){ 
    $query = $query . " AND sex = '$sex'"; 
} 
+0

哈哈!打你2秒! :D – 2010-09-29 19:09:06

+1

如何不從插值字符串構建SQL? – Tomalak 2010-09-29 19:14:28

+0

這可能是SQL注入byron嗎? (在你的回答中提到) – Johnson 2010-09-29 19:17:10

2

你可以這樣做:

$sql = "SELECT ..."; 

if (!empty($gender)) 
{ 
    $sql .= " AND gender = '$gender'"; 
} 

,並確保觀看SQL注入攻擊。

+0

你能注入這個還是? – Johnson 2010-09-29 19:13:06

+0

你可以最低限度地做一些事情,比如'$性別= mysql_real_escape_string($ _ REQUEST [「性別」])' – 2010-09-29 19:20:33

+0

這將「工作」,並使用mysql_real_escape_string()將處理安全漏洞(如果它的定位MySql的,當然什麼關於Postgres?MSSql?),但體系結構手動SQL是一種脆弱且容易出錯的方法,正在迅速失寵。爲了向社區灌輸最佳實踐,我們最好將人們從這些骯髒的黑客中移走。 – 2010-09-29 19:41:26

6

從未構建從用戶輸入的SQL字符串。這是準備好的陳述的目的。它們很安全,重新執行時執行得更快,而且易於使用,因此可以使用它們:

$sql = " 
    SELECT 
    firstname, lastname, id, user_name, sex, last_access, bostadsort 
    FROM 
    users 
    WHERE 
    (firstname LIKE '%'|| ? || '%' OR lastname LIKE '%'|| ? || '%') 
    AND Sex = CASE ? WHEN 'both' THEN Sex ELSE ? END 
"; 
$stmt = $mysqli->prepare($sql); 
$stmt->bind_param('ssss', $firstname, $lastname, $sex, $sex); 

$result = $stmt->execute(); 
+0

這是做這件事的正確和更安全的方法。更高層次的方法是使用一個類來封裝它,或者使用其中的幾十個ORM框架之一。像:http://stackoverflow.com/questions/108699/good-php-orm-library – 2010-09-29 19:34:50

+0

@visionary:我會說,上面的代碼是最小的共同點。淺的學習曲線,大大提高了處理和安全性。在這個階段,ORM框架或OO封裝可能太多了。 – Tomalak 2010-09-29 19:40:25

+0

我想我是新來的PHP,當我沒有任何線索bind_param,執行和那些命令你在那裏使用。而即時通訊使用MySQL不mysqli。 – Johnson 2010-09-29 19:43:38

相關問題