Probleme pour une requete.
Résolu
drlecteur
Messages postés
36
Date d'inscription
Statut
Membre
Dernière intervention
-
drlecteur Messages postés 36 Date d'inscription Statut Membre Dernière intervention -
drlecteur Messages postés 36 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Alors voilà je dois coder une page qui reçoit des variables et qui en fonction des variables quelles reçoit doit effectuer une requête à ma BDD. Je vous montre mon code (qui est totalement faux) pour essayer de vous expliquer plus clairement :
Donc voilà comme vous pouvez le voir au début de ma page je récupère 9 variables. Ensuite je dois effectuer la recherche en fonction des variables rentré dans le formulaire à la page précédente. S'il y a uniquement la variable nom qui est remplis, si elle a pour valeur 'toto' alors je veux qu'apparaisse toutes les entrées de ma table ou le nom est égal a toto et toutes les informations dans ma table qui lui corresponde.En revanche, si l'on reçoit comme variable nom = 'toto' & ville = 'Marseille' je veux qu'apparaissent toutes les personnes dans ma base de données qui s'appelle toto et qui habite Marseille. Ect ... Au plus il y a de variable au plus la requête sera précise. De même si l'unique variable precisé est la ville ex : 'Marseille' je veux que toutes les personnes situé a Marseille apparaissent. Si aucune variable n'est rentré alors la totalité de ma base doit être afficher. J'espère avoir été le plus clair possible et merci de votre futur aide :-)
Alors voilà je dois coder une page qui reçoit des variables et qui en fonction des variables quelles reçoit doit effectuer une requête à ma BDD. Je vous montre mon code (qui est totalement faux) pour essayer de vous expliquer plus clairement :
<!DOCTYPE > <html> <head> <title>Identifiaction</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> </head> <?php $prenom = htmlspecialchars($_POST['prenom']); $nom = htmlspecialchars($_POST['nom']); $Salaire = htmlspecialchars($_POST['Salaire']); $Niveau_detude = htmlspecialchars($_POST['Niveau_detude']); $Niveau_de_poste = htmlspecialchars($_POST['Niveau_de_poste']); $region = htmlspecialchars($_POST['region']); $departement = htmlspecialchars($_POST['departement']); $fonction = htmlspecialchars($_POST['fonction']); $ville = htmlspecialchars($_POST['ville']); try { $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', 'root'); } catch(Exception $e) { die('Erreur : '.$e->getMessage()); } $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); $req = $bdd->prepare('SELECT * FROM CV WHERE Nom = :Nom AND Prenom = :prenom AND Fonction = :fonction AND ville = :ville AND Region = :Region AND Departement = :departement AND Salaire = :Salaire AND Niveau_detude = :Niveau_detude AND Niveau_de_poste = :Niveau_de_poste)'); $req->execute(array( 'Nom' => $nom, 'Prenom' => $prenom, 'Fonction' => $fonction, 'ville' => $ville, 'Region' => $region, 'Departement' => $departement, 'Salaire' => $Salaire, 'Niveau_detude' => $Niveau_detude, 'Niveau_de_poste' => $Niveau_de_poste, )); ?> <?php while ($donnees = $reponse->fetch()) { echo $donnees['Nom'] . '<br />'; echo $donnees['Prenom'] . '<br />'; echo $donnees['Fonction'] . '<br />'; echo $donnees['ville'] . '<br />'; echo $donnees['Region'] . '<br />'; echo $donnees['Departement'] . '<br />'; echo $donnees['Salaire'] . '<br />'; echo $donnees['Niveau_detude'] . '<br />'; echo $donnees['Niveau_de_poste'] . '<br />'; } $reponse->closeCursor(); ?> </body> </html>
Donc voilà comme vous pouvez le voir au début de ma page je récupère 9 variables. Ensuite je dois effectuer la recherche en fonction des variables rentré dans le formulaire à la page précédente. S'il y a uniquement la variable nom qui est remplis, si elle a pour valeur 'toto' alors je veux qu'apparaisse toutes les entrées de ma table ou le nom est égal a toto et toutes les informations dans ma table qui lui corresponde.En revanche, si l'on reçoit comme variable nom = 'toto' & ville = 'Marseille' je veux qu'apparaissent toutes les personnes dans ma base de données qui s'appelle toto et qui habite Marseille. Ect ... Au plus il y a de variable au plus la requête sera précise. De même si l'unique variable precisé est la ville ex : 'Marseille' je veux que toutes les personnes situé a Marseille apparaissent. Si aucune variable n'est rentré alors la totalité de ma base doit être afficher. J'espère avoir été le plus clair possible et merci de votre futur aide :-)
A voir également:
- Probleme pour une requete.
- Erreur lors de l'envoi de la requête facebook - Forum Facebook
- Quelle requête écrire pour demander au moteur de recherche de présenter de préférence les pages web traitant de tennis mais pas de tennis de table ? ✓ - Forum Loisirs / Divertissements
- Erreur de requete facebook - Forum Facebook
- L'opérateur ou l'administrateur a refusé la requête ✓ - Forum Windows
- Quelle requête écrire pour demander au moteur de recherche de présenter de préférence les pages web traitant de tennis mais pas de tennis de table ✓ - Forum Android
10 réponses
Salut,
Tu dois créer ta requête par l'intermédiaire d'une variable que tu concatèneras en fonction des résultats transmis. Ex :
Etc.
Tu dois créer ta requête par l'intermédiaire d'une variable que tu concatèneras en fonction des résultats transmis. Ex :
$select = "SELECT * FROM CV WHERE 1=1"; // Condition non restrictive, qui te permettra ensuite de concaténer n'importe quelle autre condition en la précédant d'un 'AND'. if (!empty($nom)) $select .= " AND Nom = :Nom"; if (!empty($prenom)) $select .= " AND Prenom = :Prenom";
Etc.
Salut, merci de ton aide mais je n'ai pas compris. Peux tu essayer d'etre plus claire pour un amateur stp ? :)
Désolé :)
Je vais essayer :
- Tu crées une requête de base : $select = "SELECT * FROM CV WHERE 1=1";
Le 1=1 sera toujours vrai, donc sa présence n'a aucune incidence sur ta requête. Il te permet simplement par la suite de pouvoir ajouter "AND xxx = xxx ", sans avoir à te soucier s'il s'agit de la première condition ou non.
- Tu vérifies pour chacune de tes variables si elle n'est pas vide, en utilisant la fonction empty() (https://www.php.net/manual/fr/function.empty.php !empty(xxx) est une sorte de raccourci syntaxique équivalent à empty(xxx) == false.
- Si ta variable n'est effectivement pas vide, alors tu peux concaténer la clause concernée dans ta requête : $select .= " AND xxx = xxx";
.= est également une sorte de raccourci syntaxique équivalent à $select = $select . 'xxx'
Et tu auras au final une requête complète et dépendante des variables qui t'auront été transmises, contenue dans ta variable $select que tu pourras utiliser à la place de ta précédente requête : $req = $bdd->prepare($select);
Je vais essayer :
- Tu crées une requête de base : $select = "SELECT * FROM CV WHERE 1=1";
Le 1=1 sera toujours vrai, donc sa présence n'a aucune incidence sur ta requête. Il te permet simplement par la suite de pouvoir ajouter "AND xxx = xxx ", sans avoir à te soucier s'il s'agit de la première condition ou non.
- Tu vérifies pour chacune de tes variables si elle n'est pas vide, en utilisant la fonction empty() (https://www.php.net/manual/fr/function.empty.php !empty(xxx) est une sorte de raccourci syntaxique équivalent à empty(xxx) == false.
- Si ta variable n'est effectivement pas vide, alors tu peux concaténer la clause concernée dans ta requête : $select .= " AND xxx = xxx";
.= est également une sorte de raccourci syntaxique équivalent à $select = $select . 'xxx'
Et tu auras au final une requête complète et dépendante des variables qui t'auront été transmises, contenue dans ta variable $select que tu pourras utiliser à la place de ta précédente requête : $req = $bdd->prepare($select);
Ok j'ai mieux saisi :) . Je vais essayer si je m'en sort pas je reviendrais vous questionner :d. Merci :)
Bonjour
Puisque tu utilises de paramètres nommés, il faut de plus construire en parallèle l'array qui te servira pour l'execute :
Et il faut aussi corriger le fetch :
Puisque tu utilises de paramètres nommés, il faut de plus construire en parallèle l'array qui te servira pour l'execute :
$arexec=array(); if (!empty($nom)) { $select .= " AND Nom = :Nom"; $arexec[':Nom'] = $nom; } if (!empty($prenom)){ $select .= " AND Prenom = :Prenom"; $arexec[':Prenom'] = $prenom; } ... $req->execute($arexec);
Et il faut aussi corriger le fetch :
while ($donnees = $req->fetch())
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
voila une solution, pas testée, il peut subsister des erreurs de frappe ou de copier coller:
<!DOCTYPE > <html> <head> <title>Identifiaction</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> </head> <?php $prenom = htmlspecialchars($_POST['prenom']); $nom = htmlspecialchars($_POST['nom']); $Salaire = htmlspecialchars($_POST['Salaire']); $Niveau_detude = htmlspecialchars($_POST['Niveau_detude']); $Niveau_de_poste = htmlspecialchars($_POST['Niveau_de_poste']); $region = htmlspecialchars($_POST['region']); $departement = htmlspecialchars($_POST['departement']); $fonction = htmlspecialchars($_POST['fonction']); $ville = htmlspecialchars($_POST['ville']); //on va empiler les saisies des champs non vides dans un array de recherche et l'array d'execution , ainsi seuls ceux remplis seront pris en compte dans la requette // ATTENTION le nom entre [' ' ) de l'array doit être identique au nom du champ dans ta table de BDD $array_recherche=array(); $arexec=array(); if(!empty($prenom)) $array_recherche['Prenom']=$prenom; $arexec[':Prenom'] = $prenom; } if(!empty($nom)) {$array_recherche['Nom']=$nom; $arexec[':Nom'] = $nom; } if(!empty($fonction)){ $array_recherche['Fonction']=$fonction; $arexec[':Fonction'] = $fonction; } if(!empty($ville)) {$array_recherche['ville']=$ville; $arexec[':ville'] = $ville; } if(!empty($region)){ $array_recherche['Region']=$region; $arexec[':Region'] = $region; } if(!empty($departement)){ $array_recherche['Departement']=$departement; $arexec[':Departement'] = $departement; } if(!empty($Salaire)) {$array_recherche['Salaire']=$Salaire; $arexec[':Salaire'] = $Salaire; } if(!empty($Niveau_detude)) {$array_recherche['Niveau_detude']=$Niveau_detude; $arexec[':Niveau_detude'] = $Niveau_detude; } if(!empty($Niveau_de_poste)) {$array_recherche['Niveau_de_poste']=$Niveau_de_poste; $arexec[':Niveau_de_poste'] = $Niveau_de_poste; } //construction de la requette $req="SELECT * FROM CV "; //parcours de l'array $cp=1; //compteur du nombre de critères remplis foreach($array_recherche as $cle=>$value){ // $cle represente le nom du champ BDD, $value la valeur saisie pour le critere if($cp==1){ //pour le premier critere il faut le where $req .= " WHERE $cle = :$value"; }else{ // pour les criteres suivants pas de WHERE mais il faut rajouter le AND $req .= " AND "; $req .= " $cle = :$value"; } $cp=++; } $req = $bdd->prepare($req); $req->execute($arexec); ?> <?php while ($donnees = $reponse->fetch()) { echo $donnees['Nom'] . '<br />'; echo $donnees['Prenom'] . '<br />'; echo $donnees['Fonction'] . '<br />'; echo $donnees['ville'] . '<br />'; echo $donnees['Region'] . '<br />'; echo $donnees['Departement'] . '<br />'; echo $donnees['Salaire'] . '<br />'; echo $donnees['Niveau_detude'] . '<br />'; echo $donnees['Niveau_de_poste'] . '<br />'; } $reponse->closeCursor(); ?> </body> </html>
Bon j'ai rajouter la balise body au debut qu'il manquait j'ai essayer de remettre en forme j'ai bien compris le code par contre sa marche pas et la je vois pas pourquoi. Sa fait un petit moment que je suis dessu mais la la solution ne me vient pas si vous avez des idées je suis prenneur :d
modifies cette partie
...... //construction de la requette $select="SELECT * FROM CV "; //parcours de l'array $cp=1; //compteur du nombre de critères remplis foreach($array_recherche as $cle=>$value){ // $cle represente le nom du champ BDD, $value la valeur saisie pour le critere if($cp==1){ //pour le premier critere il faut le where $select .= " WHERE $cle = :$value"; }else{ // pour les criteres suivants pas de WHERE mais il faut rajouter le AND $select .= " AND "; $select .= " $cle = :$value"; } $cp=++; } ////test pour voir la requette echo "Requette construite: ".$select; /// $req = $bdd->prepare($select); $req->execute($arexec); ?> <?php while ($donnees = $req->fetch()) { ......