Recherche paramétrée dans en PDO

Pochtroi

Membre actif
Bonjour, j'ai un petit souci de recherche sur ma base de données.
Je propose sur mon site un formulaire de recherche sur des petites annonces. Ce sont des annonces ciblées sur les instruments de musique, donc il y a des champs spécifiques.
Pour cela, j'utilise un script PHP qui récupère les champs postées et qui construit une requete SQL en fonction des champs remplis ou non.

Ca fonctionnait très bien tant que j'utilisais la fonction mysql_query. (voir http://www.accordeons-fratelibenar.fr/occasions.php)
Mais je suis en train de mettre à jour mon site, entre autres en utilisant des requêtes PDO.

J'écris ma requête sous conditions que telle ou telle donnée soit postée ou non en concaténant.
En simplifié, ça donne qqch comme ça :
Bloc de code:
$rech='SELECT * FROM mabase WHERE'
if (isset($_POST['Marque'])) { $marque=$_POST['Marque']; }
else { $marque=''; }
if (isset($_POST['Modele'])) { $marque=$_POST['Modele']; }
else { $modele=''; }
[...]
if ($marque!='') { $rech.=' AND Marque=:marque'; }
if ($modele!='') { $rech.=' AND Modele=:modele'; }
[...]
$rech=preg_replace('#(AND|OR)#','WHERE',$rech,1); //le premier seulement
$rech.=' ORDER BY DATE DESC';

$instrus=$bdd->prepare("$rech");
$instrus->bindParam('marque', $modele, PDO::PARAM_INT); }
$instrus->bindParam('modele', $modele, PDO::PARAM_INT); }
[...]
$instrus->execute();
... ce qui fonctionne très bien.

Dans cette recherche est inclue une recherche sur les codes postaux. Pour cela, je recherche les membres (autre table de la BDD) dont le CP correspond à celui recherché.
J'ai tenté, sans trop y croire de rajouter à ma requête :
Bloc de code:
    while ($membre=$membres->fetch())
     {
       $rech=$rech."OR ID_Membre=:id".$count." ";
       $id[$count]=$membre['ID'];
       $count++;
     }
[...]
for ($i=0; $i<=$count; $i++)
{
   $instrus->bindParam('id'.$i, $id[$i], PDO::PARAM_INT);
}

Mais là, PDO le prend très mal !!! : (j'affiche avant l'erreur la requete préparée, mais je pense plutôt que c'est dans l'envoi des paramètres que ça chie dans la colle)
SELECT * FROM mabase WHERE ID_Membre=:id0 OR ID_Membre=:id1 OR ID_Membre=:id2 OR ID_Membre=:id3 ORDER BY Date DESC
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens'

Quelqu'un connait-il la syntaxe qui va bien ?

Merci beaucoup
 
Résolu : je n'ai pas bien compris, mais son problème était en fait que je passais plus ou moins de paramètres que ce qu'il attendait.
La solution était simplement de contrôler que le paramètre existe avant de l'envoyer. Mais à ma grande surprise, il comprend très bien
Bloc de code:
$instrus->bindParam('id'.$i, $id[$i], PDO::PARAM_INT);

Par contre c'est un peu crado, j'ai un truc du style
Bloc de code:
if (isset($_POST['Marque'])) { $marque=$_POST['Marque']; }
else { $marque=''; }
[...]
if ($marque!='') { $rech.=' AND Marque=:marque'; }
[...]
$instrus=$bdd->prepare("$rech");
if ($marque!='') { $instrus->bindParam('marque', $modele, PDO::PARAM_INT); }
[...]
$instrus->execute();

je pourrais peut-être réunir les if pour que ce soit plus rapide (faut voir il y a des conditions entre tout ça), mais ce serait moins clair à la relecure