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
Réponse acceptée

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);

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
Auteur

J'ai toujours le meme message d'erreur

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

dev23
Auteur

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)
dev23
Auteur

Merci Ferias Quarante ça marche nickel