2017-09-29 65 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 

这应该覆盖它。 有一个好的一天