Recherche multicritères PDO problèmes

Fermé
Titiyoyo - 9 mars 2016 à 13:50
totodunet Messages postés 1377 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 5 mars 2020 - 10 mars 2016 à 17:44
Bonjour,

if($lieu == 'no' AND $nomroche == 'no' AND $cartegeologique == 'no' AND $natureroche == 'no')
{
    $result = $bdd->prepare('SELECT * FROM rochesvosges');
    $result->execute();
}
 
elseif($nomroche=="no")
{
    $result = $bdd->prepare('SELECT * FROM rochesvosges where lieu = :lieu
    AND cartegeologique = :cartegeologique AND natureroche = :natureroche
    OR (cartegeologique = :cartegeologique AND natureroche = :natureroche)');
    $result->execute(array(':lieu'=>$lieu, ':cartegeologique'=>$cartegeologique, ':natureroche'=>$natureroche));
}
 
elseif($lieu=="no")
{
    $result = $bdd->prepare('SELECT * FROM rochesvosges where cartegeologique = :cartegeologique
    AND nomroche = :nomroche AND natureroche = :natureroche
    OR (nomroche = :nomroche AND natureroche = :natureroche)');
    $result->execute(array(':nomroche'=>$nomroche, ':cartegeologique'=>$cartegeologique, ':natureroche'=>$natureroche));
}
        
elseif($cartegeologique=="no")
{
    $result = $bdd->prepare('SELECT * FROM rochesvosges where natureroche = :natureroche
    AND lieu = :lieu AND nomroche = :nomroche
    OR (lieu = :lieu AND nomroche = :nomroche)');
    $result->execute(array(':nomroche'=>$nomroche, ':lieu'=>$lieu, ':natureroche'=>$natureroche));
}
       
elseif($natureroche=="no")
{
    $result = $bdd->prepare('SELECT * FROM rochesvosges where nomroche = :nomroche
    AND lieu = :lieu AND cartegeologique = :cartegeologique
    OR (lieu = :lieu AND cartegeologique = :cartegeologique)');
    $result->execute(array(':nomroche'=>$nomroche, ':lieu'=>$lieu, ':cartegeologique'=>$cartegeologique));
}
       
else
{
    $result = $bdd->prepare('SELECT * FROM rochesvosges where lieu = :lieu and nomroche = :nomroche and cartegeologique = :cartegeologique and natureroche = :natureroche');
    $result->execute(array(':lieu' => $lieu, ':nomroche' => $nomroche, ':cartegeologique' => $cartegeologique, ':natureroche' => $natureroche));
}




Ma requête fonctionne uniquement lorsque 3 champs (sur 4 au total) possèdent une valeur, mais dans le cas ou 3 champs possèdent une valeur il me donne toute les données correspondantes présente dans la table.

Mais ce n'est pas ce que je veux, il me faudrait une requête croisée me permettant de faire des recherches sur 1, 2, 3 ou 4 champs tout en m'affichant la totalité de ma table si je ne remplis aucun champ.

Merci à tous !
A voir également:

2 réponses

totodunet Messages postés 1377 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 5 mars 2020 199
Modifié par totodunet le 9/03/2016 à 23:51
Bonjour

"Ma requête fonctionne uniquement lorsque 3 champs (sur 4 au total) possèdent une valeur"

Effectivement une seule requête sera exécutée si il y a qu'un seul champ à no. Je pense que ton soucis est dans tes conditions if/else if

Admettons que je ne sélectionne aucun champ, la première requête sera exécutée car tout les champs sont à no, la suivante aussi car le champ nomroche est forcément à no aussi, la suivante encore et ainsi de suite jusqu'au dernier else if. La requête dans le else ne sera pas exécutée.

En gros en PHP on rentre dans le else if si ça répond à la condition même si on était déjà rentré dans un if ou else if avant cela.

Qui ne tente rien n'a rien
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
Modifié par jordane45 le 10/03/2016 à 01:01
Bonjour totodunet,

En gros en PHP on rentre dans le else if si ça répond à la condition même si on était déjà rentré dans un if ou else if avant cela.

Non.

http://php.net/manual/fr/control-structures.elseif.php
=> L'expression elseif est exécutée seulement si le if précédent et tout autre elseif précédent sont évalués comme FALSE, et que votre elseif est évalué à TRUE.
0
totodunet Messages postés 1377 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 5 mars 2020 199
10 mars 2016 à 09:27
Ok au temps pour moi.

J'étais tellement sûr que l'erreur venait de là.
0
totodunet Messages postés 1377 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 5 mars 2020 199
Modifié par totodunet le 10/03/2016 à 10:34
Ceci étant dit je pense que les conditions ne vont toujours pas. Si je suis la logique et que je ne sélectionne qu'un seul champ, il va rentrer dans un seul else if (le premier répondant à la condition) alors que j'ai 3 champs à no
Si je sélectionne 2 champs, il va rentrer dans un else if aussi et j'ai 2 champs à no pourtant
Si je sélectionne 3 champs il rentre dans un des else if car 1 seul champ est à no - là ça va être juste cette fois-ci
Si je sélectionne 4 champs il rentre dans le else donc c'est bon
Si je sélectionne aucun champ il rentre dans le premier if, c'est bon aussi

Les requêtes SQL sont bizarres je trouve moi aussi. Pourquoi tu fais un OR ? Tu demandes de faire un select sur 3 critères ou seulement sur 2 critères.
0
Ouais c'est tout à fait ça !
Parce que je veux pouvoir faire ma requête peu importe le champ en "no"

Ou toi tu les ferais comment les requêtes ?
0
totodunet Messages postés 1377 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 5 mars 2020 199
Modifié par totodunet le 10/03/2016 à 17:46
l'idéal serait de faire qu'une seule requête je pense, celle qu'il y a dans ton else en fait et qui prend tout les critères en compte
Si tes critères ne sont que des champs textes je propose de remplacer l'opérateur = par like qui évalue le champ par une expression regulière

$result = $bdd->prepare('SELECT * FROM rochesvosges where lieu like :lieu and nomroche like :nomroche and cartegeologique like :cartegeologique and natureroche like :natureroche');

$result->execute(array(':lieu' => $lieu, ':nomroche' => $nomroche, ':cartegeologique' => $cartegeologique, ':natureroche' => $natureroche));


ainsi pour les champs qui sont pas sélectionnés tu ne les mets pas à 'no' mais à '%' qui correspond à n'importe quel chaîne de caractère. par exemple si lieu n'est pas sélectionné on aura $lieu='%' ce qui signifie dans la requête que lieu pourra avoir toutes les valeurs possibles
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
Modifié par jordane45 le 10/03/2016 à 01:01
Bonjour,

Par contre,
je ne comprend pas .. dans tes requête tes AND / OR
 AND nomroche = :nomroche AND natureroche = :natureroche
    OR (nomroche = :nomroche AND natureroche = :natureroche)'

... tu lui demande deux fois la même chose.....

Pour ce qui est de ton problème....
Peux tu faire un ECHO de tes différentes variables pour voir ce qu'elles contiennent ?

Ajoutes également des TRY/CATCH dans tes requêtes pour intercepter les éventuelle erreurs...
par exemple :
 $sql = " SELECT * 
            FROM rochesvosges 
            WHERE natureroche = :natureroche
             AND lieu = :lieu 
             AND nomroche = :nomroche ";

 $a_datas = array(':nomroche'=>$nomroche
                             , ':lieu'=>$lieu
                             , ':cartegeologique'=>$cartegeologique
                           );

    try{
        $prepare = $bdd->prepare($sql);
        $prepare->execute($a_datas);
         //on stocke le résultat dans un array
        $donnees = $prepare->fetchAll();
    } catch (Exception $e) { 
       echo 'Erreur : ' . $e->getMessage(); 
       exit();
    }





Cordialement, 
Jordane                                                                 
0