2012-09-09 41 views
4

不知道我該如何做到這一點。基本上我有變量填充一個組合框,然後通過where子句傳遞給MQSQL查詢的過濾器。我需要做的是允許用戶將組合框留空,然後在where子句中忽略該變量。這可能嗎?可能讓PHP MYSQL查詢忽略WHERE子句中的空變量?

即,來自該代碼。假設填充$ value1的組合框是空的,有什麼辦法可以忽略這個,只有第二個過濾器被應用。

$query = "SELECT * FROM moth_sightings WHERE user_id = '$username' AND location = '$value1' AND english_name = $value2 "; 
$result = mysql_query($query) or die(mysql_error()); 
$r = mysql_numrows($result); 

感謝您的任何幫助。 ç

+4

檢查'$ value1'是否爲空,並且不要追加'AND位置='$ value1'來查詢。 BTW不使用'mysql_ *',因爲它不推薦使用 –

回答

12

使用

$where = "WHERE user_id = '$username'"; 

if(!empty($value1)){ 
$where .= "and location = '$value1'"; 
} 

if(!empty($value2)){ 
$where .= "and english_name= '$value2 '"; 
} 


$query = "SELECT * FROM moth_sightings $where"; 
$result = mysql_query($query) or die(mysql_error()); 
$r = mysql_numrows($result); 
+0

爲什麼-1 ???????????????? – shail

+0

道歉。沒有故意點擊。由於我是新用戶,它不會讓我投票,但這非常有幫助。我再次爲意外投票道​​歉。 – user1658170

+1

我不知道是誰做的,但再投了,也改變了凡在IF的進入和,和後「$值1」留出空間,否則將無法正常工作;) – dbf

0

當然,

$sql = ""; 
if(!empty($value1)) 
    $sql = "AND location = '{$value1}' "; 
if(!empty($value2)) 
    $sql .= "AND english_name = '{$value2}'"; 

$query = "SELECT * FROM moth_sightings WHERE user_id = '$username' {$sql} "; 
$result = mysql_query($query) or die(mysql_error()); 
$r = mysql_numrows($result); 

要知道SQL注入和mysql_ *的棄用,使用庫MySQLi或PDO來代替

+1

你在變量'$ sql'的最後一個實例中有一個輸入錯誤。你寫了'$ sq'。我試圖編輯,但不能(6封信分鐘) –

+1

@iight感謝;) – dbf

0
if (isset($value1)) 
$query = "SELECT * FROM moth_sightings WHERE user_id = '$username' AND location = '$value1' AND english_name = $value2 "; 
else 
$query = "SELECT * FROM moth_sightings WHERE user_id = '$username' AND english_name = $value2 "; 

但是,你也可以做一個函數返回查詢根據您的輸入。 也不要忘記在生成查詢之前逃脫你的$values

0

1)不使用MySQL的簡單PHP擴展,使用先進的mysqli擴展或更安全的PDO/MDB2包裝。

2.)不要指定像這樣的完整陳述(除此之外,你甚至不編碼和轉義給定的值...)。相反,使用這樣的:

sprintf("SELECT * FROM moth_sightings WHERE 1=1 AND %s", ...); 

然後填寫使用數組持有的所有值,你實際上是從您的形式獲取原始查詢:

$clause=array(
    'user_id="'.$username.'"', 
    'location="'.$value1.'"', 
    'english_name="'.$value2.'"' 
); 

你可以以任何方式操縱該陣列,例如測試爲空值或任何其他。現在只是爆陣列從上面完成了原始的問題:

sprintf("SELECT * FROM moth_sightings WHERE 1=1 AND %s", 
     implode(' AND ', $clause)); 

大優勢:即使條款陣列完全是空的查詢語法是有效的。

0

首先,請閱讀約SQL Injections。其次,$ r = mysql_numrows($ result)應該是$ r = mysql_num_rows($ result); $ r = mysql_num_rows($ result);

你可以,如果在MySQL中使用,這樣的事情:

SELECT * FROM moth_sightings WHERE user_id = '$username' AND IF('$value1'!='',location = '$value1',1) AND IF('$value2'!='',english_name = '$value2',1); -- BUT PLEASE READ ABOUT SQL Injections. Your code is not safe. 
+0

謝謝你,我知道SQL注入。這只是爲了幫助我學習之前,我明白了。 – user1658170

+0

好的。希望MySQL中的IF能幫助你解決你的問題。 if的語法是IF(condition,[if true],[if false])。在[如果假],我把「1」,只是返回true,這樣就不會影響到其他條件。 – rationalboss

0

我想到了另外兩種方式來解決這個問題:

SELECT * FROM moth_sightings 
WHERE 
     user_id = '$username' 
     AND location = '%$value1%' 

     AND english_name = $value2 "; 

這會返回結果只對本user_id,其中位置字段包含$value1如果$ value1爲空,這將仍然返回此user_id的所有行,不管是否爲空。


OR

SELECT * FROM moth_sightings 
WHERE 
     user_id = '$username' 
     AND (location = '$value1' OR location IS NULL OR location = '') 
     AND english_name = $value2 "; 

這會給你這個user_id$value1的位置或具有空值的所有行。