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
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));
}
Debug ta requête et $value, vérifie que le nbre de paramètre correspond (autant de ? que d'élément dans $value)
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)