Probleme pour une requete.

Résolu/Fermé
drlecteur Messages postés 36 Date d'inscription vendredi 6 juillet 2012 Statut Membre Dernière intervention 24 octobre 2012 - 17 août 2012 à 09:43
drlecteur Messages postés 36 Date d'inscription vendredi 6 juillet 2012 Statut Membre Dernière intervention 24 octobre 2012 - 21 août 2012 à 11:53
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 :
<!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 :-)

10 réponses

flokocha Messages postés 1510 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 10 octobre 2015 280
Modifié par flokocha le 17/08/2012 à 10:16
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 :

$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.
0
drlecteur Messages postés 36 Date d'inscription vendredi 6 juillet 2012 Statut Membre Dernière intervention 24 octobre 2012
17 août 2012 à 10:17
Salut, merci de ton aide mais je n'ai pas compris. Peux tu essayer d'etre plus claire pour un amateur stp ? :)
0
flokocha Messages postés 1510 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 10 octobre 2015 280
17 août 2012 à 10:26
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);
0
drlecteur Messages postés 36 Date d'inscription vendredi 6 juillet 2012 Statut Membre Dernière intervention 24 octobre 2012
17 août 2012 à 10:41
Ok j'ai mieux saisi :) . Je vais essayer si je m'en sort pas je reviendrais vous questionner :d. Merci :)
0
Utilisateur anonyme
17 août 2012 à 11:13
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 :

$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())
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
drlecteur Messages postés 36 Date d'inscription vendredi 6 juillet 2012 Statut Membre Dernière intervention 24 octobre 2012
17 août 2012 à 11:20
Ca fait beaucoup d'un coup ^^. Je vais me pencher sur sa mais je suis pas sur de tout saisir :d
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
18 août 2012 à 14:13
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>
0
drlecteur Messages postés 36 Date d'inscription vendredi 6 juillet 2012 Statut Membre Dernière intervention 24 octobre 2012
20 août 2012 à 12:21
ok, je vien de voir ton message sa a l'air vachement bien. Je vais tester sa !! merci beaucoup :)
0
drlecteur Messages postés 36 Date d'inscription vendredi 6 juillet 2012 Statut Membre Dernière intervention 24 octobre 2012
20 août 2012 à 15:13
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
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
20 août 2012 à 18:24
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())
				{
......
0
drlecteur Messages postés 36 Date d'inscription vendredi 6 juillet 2012 Statut Membre Dernière intervention 24 octobre 2012
21 août 2012 à 11:53
c'est bon j'ai fini sa fonctionne. Merci beaucoup pour vos conseils !
0