Bonsoir,
J'ai terminé le Tutoriel de création de Site de A-Z jour 5, cependant j'ai une erreur persistante et je n'arrive pas à en trouver l'origine.
Lorsque je veux éditer un article existant, je modifie mes champs et quand je valide je me retrouve avec cette erreur:
SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
SQLSTATE[HY093]: Invalid parameter number
Je pensais que cela venait de la fonction lastInsertId() qui ne récupérait pas l'id mais ce n'est pas possible puisque l'on effectue cette fonction de récupération après la requête SQL.
J'essaye d'avancer a coups de "debug()" mais je n'arrive pas a trouver mon problème. Voici ma requête et ce que contient mon tableau de data.
stdClass Object
(
[name] => Mon Titre change
[slug] => ca-marche
[id] => 11
[content] => grfrrfrg
[online] => 1
[type] => post
[created] => 2012-11-12 04:13:10
)
PDOStatement Object
(
[queryString] => INSERT INTO posts SET name=:name,slug=:slug,content=:content,online=:online,type=:type,created=:created
)
Je ne sais pas si quelqu'un a déja rencontré ce problème..
Benj
Bonjour Grafik,
Merci de la réponse, oui j'ai cherché la definition de l'erreur sur le net (SdZ etc,..), mais c'est normal que l'on ai pas :id dans la requête puisqu'on est censé le récupérer grâce à lastInsertId() après.. Non?! (Oui, je suis un petit débutant en php ^^)
Voici ce que cela me donne:
public function save($data){
$key = $this->primaryKey;
$fields = array();
$d = array();
if(isset($data->key)) unset($data->key);
foreach($data as $k=>$v){
if($k!=$this->primaryKey){
$fields] = "$k=:$k";
$d":$k"] = $v;
}elseif(!empty($v)){
$d":$k"] = $v;
}
}
if(isset($data->key) && !empty($data->key)){
$sql = 'UPDATE '.$this->table.' SET '.implode(',',$fields).' WHERE '.$key.'=:'.$key;
$this->id = $data->$key;
$action = 'update';
}else{
$sql = 'INSERT INTO '.$this->table.' SET '.implode(',',$fields);
debug($sql);
$action = 'insert';
}
$pre = $this->db->prepare($sql);
$pre->execute($d);
if($action == 'insert'){
$this->id = $this->db->lastInsertId(); // On recupere l'id de l'article ici si c'est une MaJ d'article
}
}
Peut etre que je ne l'ai pas placé au bon endroit?!