2017-09-29 2 views
0

Je suis un programmeur amateur, travaillant sur un petit projet, mais je me suis bloqué quand je voulais faire des filtres pour ma sortie mysql.Filtrer avec PHP et MYSQL

Tout fonctionne quand je remplis tous les champs de recherche et soumets, le résultat filtré correct apparaît. Mais quand je laisse un champ dehors, rien ne s'affiche (commande autre que) en utilisant la condition ET. Si j'utilise OR et le laisse vide, il affiche tous les résultats sans se soucier de ce qui a été rempli dans les champs requis.

Y aurait-il moyen de montrer le résultat même si l'un des champs reste vide? J'ai essayé de jouer avec un code de post différent ici dans stackoverflow mais pas de chance encore car je ne suis pas vraiment très expérimenté et ne peux pas comprendre comment utiliser ceci à l'intérieur de mon code.

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

Ci-dessous voici mon code, si vous pouvez jeter un oeil et de suggérer ce que je pouvais modifier de sorte que le filtrage travaillerait.

<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); 
} 

?> 

Par exemple: Filtre Departure avec Destination et laisser Layover vide -> doit renvoyer un résultat de Departure and Destination désiré avec TOUT Layover. ou 2ème exemple: Remplissez Destination avec Layover mais laissez Departure vide entraînerait la recherche souhaitée de Destination and Layover avec Departure.

S'il vous plaît laissez-moi savoir si c'est possible avec mon code et éventuellement comment. Merci beaucoup les gars !!

Répondre

0

Vous pouvez vérifier chaque entrée par rapport à une chaîne vide dans une condition OU dans chacune des différentes conditions ET.

"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" 

De cette façon, si l'un des paramètres d'entrée n'est pas donné, la partie correspondante de la condition sera interprété comme, par exemple, ('' = '' OR departure LIKE '$departure%') qui évaluera aussi vrai pour chaque ligne depuis '' est toujours égal à '' quel que soit de la comparaison LIKE.

Quelques notes - Tout d'abord, sans caractères génériques, vos comparaisons comme le travail essentiellement comme =, (par exemple kam LIKE '$kam' correspondront aux mêmes lignes que kam = '$kam'). Donc, utilisez simplement = ou ajoutez des caractères génériques pour que ceux-ci soient utiles.Deuxièmement, pensez à utiliser des instructions préparées au lieu de concaténer des valeurs dans votre SQL comme ceci. L'approche de concaténation rend votre code vulnérable à l'injection SQL et à diverses erreurs gênantes (même si vous échappez aux chaînes).

+0

Parfait, cela fonctionne bien et la solution était assez facile! :) Aurait également des conseils spécifiques quoi changer dans mon code afin qu'il ne soit pas vulnérable à l'injection SQL? Je ne suis pas vraiment sûr de ce que je pourrais changer pour éviter cela. Merci beaucoup! –

0

quelque chose comme ceci:

$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

Mettons le « dont construire vos requêtes à l'aide d'entrée utilisateur » de côté.

Si vous souhaitez suivre ce chemin, vous pouvez utiliser des conditions pour générer la requête pas à pas.

$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"; 

Vous finirez avec quelques variantes dans la chaîne de requête $:

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 

Cela devrait couvrir. Passez une bonne journée