Page 1 sur 1

petit pb dans une requette SQL

Posté : 21 mai 2010, 19:54
par doctori
Bonjour Bonjour,
Voila j'ai un petit probleme lors de la creation d'une requette SQL
je suis en train de créer un site pour gerer ma collection de vinyles
et le probleme qui se pose a moi est le suivant!
pour la recherche j'ai a peu près 10 critere (don 3 sont des bouton radio)
le truc serai de faire un recherche en fonction des champ rempli par exemple recherche tous les ablum de 1996 si l'utilisateur n'a rentré que 1996
mais faire un recherche de Rage Against The machine en 1996 si l'utilisateur a rentré le deux champs.
il faut donc faire une boucle "foreach" et verifier qu'il y a quelque chose dans les champs
mon code ressemble a peu près a ça

Code : Tout sélectionner

/* * * On initialise les variable et pui on compte le nombre d'entres valide * */ $i=0; $nbmax=0; foreach($_POST as $element) { $nbmax=$nbmax+1; } /* * *On Prepare la requette et on rempli la requette en fonction du fait que les champs osnt remplis ou non * */ $reqsql = 'SELECT * FROM vinyles WHERE'; foreach($_POST AS $clef => $valeur) { if($valeur!="") { if($i<$nbmax) { $reqsql = $reqsql .$clef. ' LIKE %:' .$valeur. '% AND '; $champremplis[$clef] = $valeur; } else { $reqsql= $reqsql . $clef . ' LIKE %:' .$valeur. '% '; $champremplis[$clef] = $valeur; } } $i=$i+1; } print_r($clef); $reponse = $bdd->prepare($reqsql); $reponse->execute($champremplis)or die(print_r($bdd->errorInfo()));
et mon message d'erreur est le suivant

Code : Tout sélectionner

Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in C:\wamp\www\test\resultats.php on line 93

Re: petit pb dans une requette SQL

Posté : 21 mai 2010, 20:27
par Silenas
Pourrais tu faire un echo ou print de ta variable reqsql pour voir se que ton script engendre? et aussi nous indiquer quelle est la ligne 93? pour voir déjà mieux.

Re: petit pb dans une requette SQL

Posté : 21 mai 2010, 21:13
par doctori
ouais pas con le echo de $reqsql
n'avais pas pensé du coup ça eclaircit pas mal de truc
et pour info là ligne 93 c'est la ligne ou la requette s'execute

Code : Tout sélectionner

$reponse->execute($champremplis)or die(print_r($bdd->errorInfo()));

Bon rectification encore
(merci pour le conseil)
maintenant la requette sql ressemble a ça !

Code : Tout sélectionner

SELECT * FROM vinyles WHERE artiste LIKE %:Rage Against The Machine% AND WHERE date LIKE %:1996%

Re: petit pb dans une requette SQL

Posté : 21 mai 2010, 22:03
par Silenas
Pour la suite je ne peut pas t'aider, tu utilise des choses que je n'est pas encore vu^^ comme les % même si je pense savoir à quoi cela sert, par contre les ":" sont-il correctes?

Re: petit pb dans une requette SQL

Posté : 21 mai 2010, 22:40
par Ryle
Il y a effectivement des choses qui ne vont pas dans la requête que tu génères :
SELECT * FROM vinyles WHERE artiste LIKE %:Rage Against The Machine% AND WHERE date LIKE %:1996% 


- tu as un "where" en trop : WHERE condition1 AND condition2
- il te manque les apostrophes pour délimiter les chaines : LIKE '%:Rage Against The Machine%'
- comme le souligne silenas, les ":" semblent être de trop, à moins que dans ta base, ils soient effectivement présents

PS : au lieu de
$nbmax=0;
foreach($_POST as $element)
{
$nbmax=$nbmax+1;
}
Tu peux aussi faire
$nbmax = count($_POST);
pour un même résultat ;)

Re: petit pb dans une requette SQL

Posté : 22 mai 2010, 14:35
par doctori
effectivement merci de la remarque j'avais tout confondu !
melangé le titre des colone avec le contenu
bref !
j'ai tout rearanger et pour le
$nbmax = count($_POST);
j'ai ameliorer le truc parce que en fesant un count il me compte même les valeur null
du coup ma boucle pour compter le nombre de champs remplis ressemble a ça
foreach($_POST as $element)
	{
		if($element!="")
			{
				$nbmax=$nbmax+1;
			}
	}
(mieux) et ma requette SQL ressemble a ça
SELECT * FROM vinyles WHERE artiste LIKE %:artiste% AND date LIKE %:date% 
c'qui est beaucoup mieux
j'ai changé de technique pour créer l'array des valeur j'ai fait un truc du genre
$reqsql = 'SELECT * FROM vinyles WHERE ';
$table_valeur= ' ';
foreach($_POST AS $clef => $valeur)
	{
	
		if($valeur!="")
		{
			if($i<$nbmax)
			{
			echo $i.' '.$nbmax. ' <br/>';
			echo ' clef'.$i. ' ' .$clef. ' <br/>';
			echo ' valeur'.$i. ' ' .$valeur. ' <br/>';
			
				$reqsql = $reqsql.'  ' .$clef. ' LIKE %:' .$clef. '% AND ';
				$table_valeur=$table_valeur. ' \''.$clef. '\' => \''.$valeur.'\' , ';
			}
			else
			{
			
			echo $i.' '.$nbmax. ' <br/>';
			echo ' clef'.$i. ' ' .$clef. ' <br/>';
			echo ' valeur'.$i. ' ' .$valeur. ' <br/>';
				$reqsql= $reqsql. ' ' .$clef . ' LIKE %:' .$clef. '% ';
				$table_valeur=$table_valeur. ' \''.$clef. '\' => \''.$valeur.'\' ';

			}
			$i=$i+1;
		}
		
	}
	
	
	echo $table_valeur. '<br/>';
	echo $reqsql. '<br/>';

$reponse = $bdd->prepare($reqsql);
$reponse->execute(array($table_valeur))or die(print_r($bdd->errorInfo()));
c'est déjà mieu le pb c'est que j'ai toujours la même erreur
alors que cette fois j'ai deux parrametre et j'ai bien defini ces 2 paramettre j'ai l'impression qu'il en veux trois ...
puisque en erreur j'ai
Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in C:\wamp\www\test\resultats.php on line 121
Array ( [0] => 00000 [1] => [2] => ) 1
là ligne 121 etant l'execute ...
merci en tout cas pour ces reponse
on avance !

Re: petit pb dans une requette SQL

Posté : 24 mai 2010, 17:01
par stealth35
a la fin fait un
echo $reqsql;
print_r($_POST);
sinon pour la gestion des erreurs avec PDO c'est comme ca : http://www.php.net/manual/fr/pdo.error-handling.php :wink:

Re: petit pb dans une requette SQL

Posté : 25 mai 2010, 22:11
par Ryle
Il y a toujours un problème de syntaxe dans ta requête : tes chaines ne sont pas délimités (et donc pas considérés comme des chaines, et donc interprétés par le sgbd alors qu'il ne devrait pas).

La requête finale devrait ressembler à ça (avec les apostrophes en plus) :
SELECT * FROM vinyles WHERE artiste LIKE '%:artiste%' AND date LIKE '%:date%'
A voir également, les ":" me semblent être de trop a moins que les artistes et les dates que tu recherches contiennent tous un ":" :)