Bonjour à tous,
j'aimerais filtrer mes recherches grâce à des options,
par exemple : catégorie 1, catégorie 2, catégorie 3
Toute les options peuvent être cochées ou qu'une seule, j'ai utilisé des input checkbox pour ce faire avec un bouton submit.
Niveau php, j'imaginais utiliser $_POST...
Je sais traiter facilement un élément
if(isset($_POST"option"]))
{
requête mysqli
}
Cependant pour en gérer plusieurs, je coince un peu... Auriez vous une piste à me suggérer ? merci !
<input type="checkbox" name="cb]" value="test1"/>test 1 <br />
<input type="checkbox" name="cb]" value="test2"/>test 2 <br />
<input type="checkbox" name="cb]" value="test3"/>test 3 <br />
$_POST'cb'] sera un array, qui contiendra autant de valeurs qu'il y a eu de cases cochées. Sa longueur peut donc etre variable, tu peux cocher 0, une partie, ou toutes les cases.
A toi de faire un foreach sur ce tableau ensuite pour construire ta requete.
Super ! Merci ça fonctionne !
@glaived, j'ai plusieurs éléments cochable, GET c'est pratique pour retourner un élément mais plusieurs... autant faire un POST non ?
Par contre, j'ai encore un petit souci.
Cette syntaxe est-elle correcte ?
if($categorie== 'categorie1'+'categorie2'){
requête
}
Elle fonctionne mais à l'air de planter les précédentes...
Si c'est ca que tu veux faire, la concaténation en php se fait avec un point, pas un + (c'est en JS le +).
if($categorie == 'categorie1' . 'categorie2'){
// ...
}
Merci Vallyan, ceci dit, je ne suis pas sûr de m'être bien exprimé.
En faite, j'aimerais écrire ceci :
Si $maVariable = catégorie1 j’exécute ma requête mysqli 1
Si $maVariable = catégorie2 j’exécute ma requête mysqli 2
Si $maVariable = catégorie1 et catégorie2 j’exécute ma requête mysqli 3
Cependant, en raisonnant comme ça, j'ai l'impression qu'il se court-circuite.
Par exemple :
Si $maVariable = catégorie1 et catégorie2 j’exécute ma requête mysqli
fonctionne très bien tout seul, mais si je rajoute :
Si $maVariable = catégorie1 j’exécute ma requête mysqli
Si $maVariable = catégorie2 j’exécute ma requête mysqli
ça ne fonctionne plus...
Ah pardon, effectivement je n'avais pas pigé ^^
Alors: pour répondre a ta question, il faudrait utiliser les if ... elseif ... elseif ... de cette manière lorsqu'une condition est remplie, les suivantes ne sont pas testées. Par contre attention a l'ordre dans lequel tu les mets, du coup.
MAIS:
Je ne sais pas exactement ce que tu veux faire, mais est-ce de cette manière que tu veux faire tes requetes multiples en fonction de tes options ? Si tu as 5 catégories, en content toutes les combinaisons possibles, cela fait 206 requetes a créer ... et le jour ou tu en rajoutes une sixième, il faudra en faire 1031 de plus.
As-tu pensé a utilisé une boucle, plutot, pour construire ta requete ?
C'est vrais que dis comme ça, c'est pas vraiment optimiser.
j'ai une dizaine de catégories, exemple : rouge, noir, gris, vert, violet...
l'utilisateur pourrait choisir rouge et noir, ou rouge, noir et vert...
Voici pour le moment à quoi ressemble mon code :
<form method="post" action="">
<input class="rouge" type='checkbox' name='couleur_list]' value="rouge" id="rouge"/><label for="rouge">rouge</label>
<input class="noir" type='checkbox' name='couleur_list]' value="noir" id="noir"/><label for="noir">noir</label>
<input class="gris" type='checkbox' name='couleur_list]' value="gris" id="gris"/><label for="gris">rouge</label>
<input class="vert" type='checkbox' name='couleur_list]' value="vert" id="vert"/><label for="vert">vert</label>
....
<input type="submit">ok</button>
</form>
<?php
if(!empty($_POST'couleur_list'])) {
$options = $_POST'couleur_list'];
foreach ($options as $option) {
if($option == 'rouge'){
$request = blabla FROM objet blabla WHERE couleur LIKE 'rouge';
}
if($option == 'rouge'.'noir'){
$request = blabla FROM objet blabla WHERE couleur LIKE 'rouge' AND couleur LIKE 'noir';
}
if($option == 'rouge'.'noir'.'gris'){
$request = blabla FROM objet blabla WHERE couleur LIKE 'rouge' AND couleur LIKE 'noir' AND couleur LIKE 'gris' ;
}
....
if($option == 'noir'){
$request = blabla FROM objet blabla WHERE couleur LIKE 'noir';
}
if($option == 'gris'){
$request = blabla FROM objet blabla WHERE couleur LIKE 'gris';
}
if($option == 'vert'){
$request = blabla FROM objet blabla WHERE couleur LIKE 'gris';
}
}
}
Essaye un truc comme ceci:
foreach ($_POST'couleur_list'] as $val) {
$choices] = "`color` LIKE '$val'";
}
$query = "blabla FROM objet blabla WHERE " . implode(" OR ", $choices);
Quelque soit le nombre de cases cochées, tu as une requete qui fonctionne. Suivant ce que tu veux faire, tu peux remplacer le OR par un AND.
Utilise plutôt un switch si c'est pour faire de multiple if qui se suivent.
Ce sera beaucoup plus simple à lire et à modifier par la suite.
Une autre façon de faire est d'utiliser une fonction :)
Vallyan, Super, ça marche impec !! C'est beaucoup plus simple ainsi !
J'ai quasiment finis ce que je voulais faire, juste à un détail prêt, imaginons que j'ai des ronds, et des carrés...
Si la $val carré est indiqué, je la sélectionne :
if($valeur == 'carré'){ $table = 'type';}
ça jongle très bien entre type et couleur, par contre, si je lui demande de choisir type 'carré'
le valeur d'après ne devra plus être OR mais AND.
Avec le même principe que $table, je n'arrive pas à le mettre en place.
Par exemple :
WHERE type LIKE 'carré' AND couleur LIKE 'rouge' OR couleur LIKE 'vert'
mais je n'arrive pas à changer uniquement cette valeur, du coup je me retrouve avec :
WHERE type LIKE 'carré' OR couleur LIKE 'rouge' OR couleur LIKE 'vert'
Ce qui ordonne par carré ou par couleurs rouge/vert ce qui inclus aussi les ronds
Meme principe.
Mets un nom d'input différent pour chaque type de caractéristique (shape_list] et couleur_list], par exemple):
<form action="index.php" method="post">
<input class="carre" type='checkbox' name='shape_list]' value="carre" id="carre"/>Carré<br>
<input class="rond" type='checkbox' name='shape_list]' value="rond" id="rond"/>Rond<br>
<input class="triangle" type='checkbox' name='shape_list]' value="triangle" id="triangle"/>Triangle<br>
<br />
<input class="rouge" type='checkbox' name='couleur_list]' value="rouge" id="rouge"/>rouge<br>
<input class="noir" type='checkbox' name='couleur_list]' value="noir" id="noir"/>noir<br>
<input class="gris" type='checkbox' name='couleur_list]' value="gris" id="gris"/>gris<br>
<input class="vert" type='checkbox' name='couleur_list]' value="vert" id="vert"/>vert<br>
<input type="submit" value="go" />
</form>
Ensuite tu construis ta requete partielle pour chaque type de caractéristique, en l'entourant de parenthèses
Puis tu assembles tes requetes partielles avec un AND
$query_parts = array();
// Couleurs
if( !empty ($_POST'couleur_list']) ) {
foreach ($_POST'couleur_list'] as $val) {
$colors] = "color
LIKE '$val'";
}
$query_parts] = "(".implode(" OR ", $colors).")";
}
// Formes
if( !empty ($_POST'shape_list']) ) {
foreach ($_POST'shape_list'] as $val) {
$shapes] = "shape
LIKE '$val'";
}
$query_parts] = "(".implode(" OR ", $shapes).")";
}
// Requete complete
$query = "blabla FROM objet blabla WHERE " . implode(" AND ", $query_parts);
echo $query;
Cela dit ca marche tout aussi bien que tu passes tes variables en post ou en get, et effectivement c'est peut-ete intéressant de les passer en get, comme dit Glaived.