2017-09-29 46 views
0

我是一名編程愛好者,在我的一個小項目上工作,但當我想爲我的mysql輸出生成過濾器時,我被困住了。使用PHP和MYSQL進行過濾

所有的作品時,我填寫的所有搜索輸入字段和提交,出現正確的過濾結果。但是當我離開一個領域時什麼也沒有顯示(只有其他命令),因爲使用AND條件。如果我使用OR並將其保留爲空,它會顯示所有結果而不關心填寫在必填字段中的內容。

會不會有什麼辦法如何顯示,即使其中一個字段保持爲空的結果?我試圖在不同的帖子中使用不同的帖子,但沒有運氣,因爲我沒有很多經驗,也不知道如何在代碼中使用這個。

if(isset($_POST["profilename"]) && $_POST["profilename"] != "") 
$sql .= " AND profilename = '". $_POST["profilename"] ."'"; 

下面是我的代碼,如果你可以看看,並建議我可以編輯,所以過濾將工作。

<select class="form-control" id="Select1" name="departure"> 
<select class="form-control" id="Select2" name="destination"> 
<select class="form-control" id="Select3" name="layover"> 

...

<?php 
include_once("connect.php"); 

if (isset($_GET['submit'])) { 
$departure = mysqli_real_escape_string($connection, $_GET['departure']); 
$destination = mysqli_real_escape_string($connection, $_GET['destination']); 
$layover = mysqli_real_escape_string($connection, $_GET['layover']); 



$result = mysqli_query($connection, "SELECT * FROM crud 
WHERE departure LIKE '$departure%' 
AND kam LIKE '$kam' 
AND layover LIKE '$layover' 
ORDER BY id DESC"); 



if($make = mysqli_num_rows($result) > 0){ 
while($r = mysqli_fetch_assoc($result)){ 
echo '<div style="display:block;"'.$r['departure'].'</div>'; 
echo '<div style="display:block;"'.$r['kam'].'</div>'; 
echo '<div style="display:block;"'.$r['layover'].'</div>'; 
//following code.. 
} 
}else{ 
echo'<h4>No match found!</h4>'; 

print ($make); 
} 
mysqli_free_result($result); 
mysqli_close($connection); 
} 

?> 

例如:過濾DepartureDestination離開Layover空 - >應該返回所需Departure and Destination的結果與任何Layover。 或第二個例子:填寫DestinationLayover但留下Departure空會導致與任何Departure所需搜索的Destination and Layover

請讓我知道,如果可能我的代碼,並可能如何。 非常感謝你們!

回答

0

您可以檢查對空字符串的每個輸入中的每個不同和條件,或條件。

"SELECT * FROM crud 
WHERE ('$departure' = '' OR departure LIKE '$departure%') 
AND ('$kam' = '' OR kam LIKE '$kam') 
AND ('$layover' = '' OR layover LIKE '$layover') 
ORDER BY id DESC" 

這樣,如果未給定的輸入參數中的一個,條件的相應部分將被解釋爲,例如,其中('' = '' OR departure LIKE '$departure%')將評估爲真,每行自''始終等於''無論的LIKE比較。

幾個筆記 - 首先,沒有任何通配符,您的LIKE比較基本上像=一樣工作(例如,kam LIKE '$kam'將匹配與kam = '$kam'相同的行)。因此,無論是使用=還是添加一些通配符以使這些通配符有用。其次,考慮使用預準備語句,而不是像這樣將值連接到你的SQL中。連接方法使得你的代碼容易受到SQL注入和各種煩人的錯誤(即使你轉義字符串)。

+0

完美的,這個工作很好,解決方案很容易! :)也有任何具體的建議什麼改變我的代碼,所以它不容易sql注入?我不確定我可以改變什麼來防止這種情況發生。非常感謝! –

0

是這樣的:

$result = mysqli_query($connection, "SELECT * FROM crud 
WHERE (departure LIKE '$departure%' OR departure is null) 
AND kam LIKE '$kam' 
AND (layover LIKE '$layover' OR departure is null) 
ORDER BY id DESC"); 
0

讓我們把「不建使用用戶輸入您的查詢」一邊。

如果你想要去的這條道路,你可以使用條件來構建一步查詢一步。

$query = "SELECT * FROM crud WHERE "; 
if (!empty($departure)) { 
    $query .= "departure LIKE '$departure%' AND "; 
} 
if (!empty($destination)) { 
    $query .= "destination LIKE '$destination%' AND "; 
} 
if (!empty($layover)) { 
    $query .= "layover LIKE '$layover' AND "; 
} 
$query .= "1 ORDER BY id DESC"; 

您將結束在$查詢字符串一些替代方案:

NOTHING SELECTED: 
SELECT * FROM crud WHERE 1 ORDER BY id DESC 

SOMETHING SELECTED: 
SELECT * FROM crud WHERE departure LIKE '$departure%' AND layover LIKE '$layover' AND 1 ORDER BY id DESC 

ALL SELECTED: 
SELECT * FROM crud WHERE departure LIKE '$departure%' AND destination LIKE '$destination%' AND layover LIKE '$layover' AND 1 ORDER BY id DESC 

這應該覆蓋它。 有一個好的一天