[RESOLU] Condition LIKE LOWER incompatible avec WHERE en PDO

Mammouth du PHP | 804 Messages

22 mai 2014, 15:49

Bonjour,

j'ai un petit souci avec une requête préparé, ma recherche via LIKE ET LOWER fonctionne à merveille, mais le tri via . ' AND sexe=?' ne fonctionne pas
étant initié à la PDO depuis peu je manque encore un peu d’expérience dans les requêtes et ne comprends pas mon souci.
$query = 'SELECT *'
		. ' FROM source'
		. ' WHERE nom LIKE :keyword OR LOWER(:keyworddirect)'
			. ' AND sexe=?'
			. ' AND sexe=?'
		. ' LIMIT 10;';
	
	$select = $db->prepare($query); 
	$select->bindValue(':keyword',  '%'.$queryString.'%',  PDO::PARAM_STR);
	$select->bindValue(':keyworddirect',  $queryString,  PDO::PARAM_STR);
	$select->bindValue(3,  "fb"	,  PDO::PARAM_STR);
	$select->bindValue(4,  "fs" ,  PDO::PARAM_STR);
	$select->execute();
merci de votre aide

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

22 mai 2014, 17:01

salut,

ton problème est du au SQL et non à PDO.

Essai ta requête sql dans un client (en remplacement les marqueurs) tu auras plus d'infos.

D'ailleurs dans l'erreur que tu dois avoir cela doit être indiqué.
Il est important de fournir les messages d'erreurs lorsque tu pose une question cela facilite les réponses ;)


@+
Il en faut peu pour être heureux ......

ViPHP
xTG
ViPHP | 7331 Messages

22 mai 2014, 18:11

Code : Tout sélectionner

. ' AND sexe=?' . ' AND sexe=?'
Comment un champ peut valoir deux valeurs différentes en même temps (cf bind). ;)
Comme le dit Moogli toujours tester avant dans un client SQL.

Mammouth du PHP | 804 Messages

22 mai 2014, 18:18

Bonjour,

effectivement j'avais oublié d'activé les erreurs

Voici mon erreur
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: mixed named and positional parametre

Mammouth du PHP | 804 Messages

22 mai 2014, 18:54

Code : Tout sélectionner

. ' AND sexe=?' . ' AND sexe=?'
Comment un champ peut valoir deux valeurs différentes en même temps (cf bind). ;)
Comme le dit Moogli toujours tester avant dans un client SQL.

oui j'ai pensé IN, mais ça marche pas non plus et ca ne me retourne aucune error

. ' && sexe in("fs" ,"ms")'

Mammouth du PHP | 571 Messages

22 mai 2014, 20:03

côté PDO, dans une requête préparée on ne peut pas utiliser à la fois des paramètres nommés et des marqueurs(point d'interrogation), c'est l'un ou l'autre pas les 2.
$query = 'SELECT *
                 FROM source
                 WHERE nom LIKE :keyword OR nom LIKE LOWER(:keyworddirect)
                 AND sexe IN ("fb", "fs")  LIMIT 10';
$select = $db->prepare($query); 
$select->execute(array(':keyword '=> '%'.$queryString.'%', ':keyworddirect'=>$queryString));

s'il n'y a que deux sexes dans la table, on peut tout a fait l'omettre de la requête:
$query = 'SELECT *
                 FROM source
                 WHERE nom LIKE :keyword OR nom LIKE LOWER(:keyworddirect)
                 LIMIT 10';
$select = $db->prepare($query); 
$select->execute(array(':keyword '=> '%'.$queryString.'%', ':keyworddirect'=>$queryString));


ViPHP
xTG
ViPHP | 7331 Messages

22 mai 2014, 20:33

Code : Tout sélectionner

. ' AND sexe=?' . ' AND sexe=?'
Comment un champ peut valoir deux valeurs différentes en même temps (cf bind). ;)
Comme le dit Moogli toujours tester avant dans un client SQL.

oui j'ai pensé IN, mais ça marche pas non plus et ca ne me retourne aucune error

. ' && sexe in("fs" ,"ms")'
C'est un OR que tu souhaites donc.

Mammouth du PHP | 804 Messages

23 mai 2014, 16:33

oui c'est un OR :mrgreen:

Mammouth du PHP | 804 Messages

23 mai 2014, 17:47

Bon en suivant le conseil de moogli en utilisant une requête via client sql, j'ai constaté une première erreur, pas simple à trouvé
quand on fait une requête avec un LIKE et d'autre condition il faut mettre le LIKE en dernier.


ne pas faire :
	
$query = 'SELECT *'
		. ' FROM source'
		. ' WHERE nom LIKE :keyword OR LOWER(:keyworddirect)'
		. ' AND sexe=? OR sexe=? '
		. ' LIMIT 10';
		$select = $db->prepare($query); 
		$select->bindValue(':keyword',  '%'.$queryString.'%',  PDO::PARAM_STR);
		$select->bindValue(':keyworddirect',  $queryString	,  PDO::PARAM_STR);
		$select->bindValue(3, 'param1'	,  PDO::PARAM_STR);
		$select->bindValue(4, 'param2',  PDO::PARAM_STR);
		$select->execute();	
mais plutôt, bien que c'est pas encore bon puisque l'on ne peut pas non plus mélanger les paramètres anonymes (syntaxe ?) et nommés (:nom) dans une requête préparée
	
	$query = 'SELECT *'
		. ' FROM sources'
		. ' WHERE sexe IN (?,?) '
		. ' AND nom LIKE :keyword OR LOWER(:keyworddirect)'
		. ' LIMIT 10';
		$select = $db->prepare($query); 
		$select->bindValue(1, 'param1'	,  PDO::PARAM_STR);
		$select->bindValue(2, 'param2',  PDO::PARAM_STR);
		$select->bindValue(':keyword',  '%'.$queryString.'%',  PDO::PARAM_STR);
		$select->bindValue(':keyworddirect',  $queryString	,  PDO::PARAM_STR);
		$select->execute();	
le bon code est celui-ci
		$query = 'SELECT *'
			. ' FROM source'
			. ' WHERE sexe IN (:keyfb, :keyfs)'
			. ' AND nom LIKE :keyword OR LOWER(:keyworddirect)'		
			. ' LIMIT 10;';
	
		$select = $db->prepare($query); 
		$select->bindValue(':keyword',  '%'.$queryString.'%',  PDO::PARAM_STR);
		$select->bindValue(':keyworddirect',  $queryString	,  PDO::PARAM_STR);
		$select->bindValue(':keyfb',  'fb'	,  PDO::PARAM_STR);
		$select->bindValue(':keyfs',  "fs" ,  PDO::PARAM_STR);
		$select->execute();

merci à vous j 'espéré que ça aidera quelqu’un, si il rencontre le même problème que moi

Dog