recherche multi critères PHP PDO

Par dev23, il y a 10 ans


Bonjour,

je veux créer un moteur de recherche multicritères, j'ai un formulaire qui ressemble à ça

<form> <input type="checkbox" name="ville[]" value="<?php echo $ville->id_ville; ?>"> <input type="checkbox" name="categorie[]" value="<?php echo $categorie->id_categorie; ?>" > </form>

L'utilisateur peut choisir plusieurs villes et plusieurs catégories

Après le code pour traiter le résultat:

<?php $params = array(); if (!empty($_POST['categorie'])) { $params[]= $_POST['categorie']; $sql_1 = 'AND `id_category`IN (?)'; } else{ $sql_1 = '';} if (!empty($_POST['ville'])) { $params[]= $_POST['ville']; // var_dump($params); $sql_2 = ' AND `id_ville`IN (?)'; } else{ $sql_2 = '';} $sql='SELECT * FROM `produits` INNER JOIN `categorie` ON `categorie`.`id_categorie` = `produits`.`id_categorie` INNER JOIN `ville` ON `ville`.`id_ville` = `produits`.`id_ville` where `produits`.`statut`=1 '.$sql_1.' '.$sql_2; $post=$this->getPDO()->prepare($sql); foreach ($params as $value) { $post->execute($value); } $result=$post->fetchAll(PDO::FETCH_OBJ);

J'ai un message d'erreur: Invalid parameter number: number of bound variables does not match
Merci d'avance

6 réponses

Ferias Quarante, il y a 10 ans

Bonjour,
D'après la documentation, la commande execute prend un tableau de paramètres.
Je pense que ici ton paramètre est un tableau, mais il faut quand même "l'encapsuler" dans un tableau car ce n'est qu'un paramètre (de type tableau) donc faire quelque chose comme ça :

$post=$this->getPDO()->prepare($sql); foreach ($params as $value) { $post->execute(array($value)); }
dev23, il y a 10 ans

J'ai toujours le meme message d'erreur

Grafikart, il y a 10 ans

Debug ta requête et $value, vérifie que le nbre de paramètre correspond (autant de ? que d'élément dans $value)

dev23, il y a 10 ans

j'ai modifier mon code pour créer des placeholder dynamiques

if (!empty($_POST['categorie'])) { $params []= $_POST['categorie']; $arr= array(); foreach($_POST['categorie'] as $elem){ $arr[] = '?'; $str = implode(',', $arr); //Contient: ?,?,?,?,? $sql_1 = 'AND `articles_has_category`.`category_id_category` IN (' . $str . ')'; } } else{ $sql_1 = ''; }

le var_dump de $params lorsque je sélectionne deux ville et deux catégories

array (size=2) 0 => array (size=2) 0 => string '14' (length=2) 1 => string '15' (length=2) 1 => array (size=2) 0 => string '1' (length=1) 1 => string '2' (length=1)

maintenant pour exécuter la requete je me trouve face à un tableau multi dimensions
le var_dump $value affiche juste les id des catégories

array (size=2) 0 => string '14' (length=2) 1 => string '15' (length=2)
Ferias Quarante, il y a 10 ans

Et quelque chose comme ca :

$categories_sql = ''; $towns_sql = ''; $params_sql = []; if (!empty($_POST['categorie'])) { $categories_id = $_POST['categorie']; $place_holders = implode(',', array_fill(0, count($categories_id), '?')); // => ?,?,?,?,?, ... $categories_sql = 'AND `articles_has_category`.`category_id_category` IN ('.$place_holders.') '; $params_sql = array_merge($params_sql, $categories_id); } if (!empty($_POST['ville'])) { $towns_id = $_POST['ville']; $place_holders = implode(',', array_fill(0, count($towns_id), '?')); // => ?,?,?,?,?, ... $towns_sql = 'AND `id_ville`IN ('.$place_holders.') '; $params_sql = array_merge($params_sql, $towns_id); } $sql = 'SELECT * FROM `produits` INNER JOIN `categorie` ON `categorie`.`id_categorie` = `produits`.`id_categorie` INNER JOIN `ville` ON `ville`.`id_ville` = `produits`.`id_ville` where `produits`.`statut`=1 '.$categories_sql.' '.$towns_sql; $post = $this->getPDO()->prepare($sql); $post->execute($params_sql); $result = $post->fetchAll(PDO::FETCH_OBJ);
dev23, il y a 10 ans

Merci Ferias Quarante ça marche nickel