Recherche multicritères PDO problèmes
Titiyoyo
-
totodunet Messages postés 1513 Statut Membre -
totodunet Messages postés 1513 Statut Membre -
Bonjour,
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 !
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:
- Recherche multicritères PDO problèmes
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Rechercher ou entrer l'adresse mm - recherche google - Guide
- Recherche image - Guide
- Je recherche une chanson - Guide
- Rechercher ou entrer l'adresse 4 - recherche google ✓ - Forum Windows
2 réponses
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
"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
Bonjour,
Par contre,
je ne comprend pas .. dans tes requête tes AND / OR
... 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 :
Cordialement,
Jordane
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
Non.
J'étais tellement sûr que l'erreur venait de là.
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.
Parce que je veux pouvoir faire ma requête peu importe le champ en "no"
Ou toi tu les ferais comment les requêtes ?
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