Tutoriel vidéo PHP : Développer un site : Jour 5, Backoffice, à la minute 0:49:18
L'attribut "value" de la balise html "input" renvoie une chaîne vide. Pourtant, on y a placé le code PHP suivant :
c'est donc ce code qui comporte une erreur ou des variables non définies.
Au moment de passer la requête avec :
J'obtiens l'erreur suivante :
Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in C:\wamp\www\tuto\core\Model.php on line 118 (la ligne 118 est celle qui contient : "$pre->execute($d);"
Et aussi :
Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number in C:\wamp\www\tuto\core\Model.php on line 118
Voici mon fichier Model.php :
Voilà deux jours que je galère là-dessus, et je ne trouve pas l'erreur. J'ai beau relire, revisionner la vidéo, essayer de comprendre comment tout cela s'articule, où est l'étourderie qui a pu générer cette erreur, je ne vois pas...
Quelqu'un peut-il m'aider ?
L'attribut "value" de la balise html "input" renvoie une chaîne vide. Pourtant, on y a placé le code PHP suivant :
$this->controller->request->data->$name
c'est donc ce code qui comporte une erreur ou des variables non définies.
Au moment de passer la requête avec :
$pre = $this->db->prepare($sql); $pre->execute($d); return true;
J'obtiens l'erreur suivante :
Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in C:\wamp\www\tuto\core\Model.php on line 118 (la ligne 118 est celle qui contient : "$pre->execute($d);"
Et aussi :
Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number in C:\wamp\www\tuto\core\Model.php on line 118
Voici mon fichier Model.php :
<?php class Model{ static $connections = array (); public $conf = 'default'; public $table = false; public $db; public $primaryKey = 'id'; public function __construct(){ // J'initialise quelques variables if ($this->table === false){ $this->table = strtolower(get_class($this)).'s'; } // Je me connecte à la base $conf = Conf::$databases[$this->conf]; if(isset(Model::$connections[$this->conf])){ $this->db = Model::$connections[$this->conf]; return true; } try{ $pdo = new PDO( 'mysql:host='.$conf['host'].';dbname='.$conf['database'].';', $conf['login'], $conf['password'], array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8') ); $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING); Model::$connections[$this->conf] = $pdo; $this->db = $pdo; }catch(PDOException $e){ if(Conf::$debug>=1){ die($e->getMessage()); }else{ die('impossible de se connecter à la base de données'); } } } public function find($req){ $sql = 'SELECT '; if(isset($req['fields'])){ if(is_array($req['fields'])){ $sql .= implode(', ', $req['fields']); }else{ $sql .=$req['fields']; } }else{ $sql.='*'; } $sql .=' FROM '.$this->table.' as '.get_class($this).' '; // Construction de la condition if(isset($req['conditions'])){ $sql.='WHERE '; if(!is_array($req['conditions'])){ $sql.=$req['conditions']; }else{ $cond = array(); foreach ($req['conditions'] as $k=>$v) { if (!is_numeric($v)){ $v = '"'.mysql_real_escape_string($v).'"'; } $cond[]="$k=$v"; } $sql .= implode(' AND ', $cond); } } if(isset($req['limit'])){ $sql.='LIMIT '.$req['limit']; } $pre = $this->db->prepare($sql); $pre->execute(); return $pre->fetchAll(PDO::FETCH_OBJ); } public function findFirst($req){ return current($this->find($req)); } public function findCount($conditions){ $res = $this->findFirst(array( 'fields' => 'COUNT('.$this->primaryKey.') as count', 'conditions' => $conditions )); return $res->count; } public function delete($id){ $sql = "DELETE FROM {$this->table} WHERE {$this->primaryKey} = $id"; $this->db->query($sql); } public function save($data) { $key = $this->primaryKey; $fields = array(); $d = array(); foreach ($data as $k => $v) { $fields[] = "$k:=$k"; $d[":$k"] = $v; } if (isset($data->$key) && !empty($data->$key)) { $sql = 'UPDATE '.$this->table.' SET '.implode(',',$fields).' WHERE '.$key.'=:'.$key; } $pre = $this->db->prepare($sql); $pre->execute($d); return true; } } ?>
Voilà deux jours que je galère là-dessus, et je ne trouve pas l'erreur. J'ai beau relire, revisionner la vidéo, essayer de comprendre comment tout cela s'articule, où est l'étourderie qui a pu générer cette erreur, je ne vois pas...
Quelqu'un peut-il m'aider ?