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 :
$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 ?
EUREKA !
J'ai honte ! J'ai trouvé l'erreur : à la ligne 110 (cf. ci-dessus), il fallait écrire :
$fields] = "$k=:$k";
et non
$fields] = "$k:=$k";
(le signe égale est avant les deux points, et non l'inverse).
Merci Lotfi, de prendre à chaque fois le temps d'examiner mes questions (j'essaie bien pourtant à chaque fois de résoudre le problème par moi-même avant d'appeler à l'aide dans le forum, mais là, ça faisait trop longtemps que je bloquais).
Il subsiste toujours une erreur "trying to get property of non-object" sur le fichier Form.php, je pense que ça vient du fait que l'attribut "value" de la balise <input> est vide, mais je n'en suis pas sûr. C'est peut-être normal à cet endroit de la vidéo. Je vais continuer de visionner, et de résoudre le problème par moi-même, et... je reviendrai si vraiment je ne trouve pas d'issue par moi-même. Merci encore.
(et... à bientôt ?)
Bonjour,
Pour savoir ce qu'il se passe fait un echo de $sql et donne nous le resultat de cette requete sql.
Cordialement
@bahamut : Voici ce que donne echo($sql) :
UPDATE posts SET name:=name,slug:=slug,id:=id,content:=content,online:=online WHERE id=:id
Est-ce que ça a un sens à cet endroit du tuto ?
Bonsoir,
Que signifie les deux points devant ton name, slug etc... ?
Ici tu updates pas les bonnes valeurs visiblement car name pour name et slug pour slug c'est bizarre (peut être volontaire selon tes variables??)
Je dirais soucis au niveau des deux points = ":" déjà !:)
Teste ce même UPDATE sur phpmyadmin se voit ce qu'il te retourne comme erreur ;)
tu vas dans SQL et tu colle ta requête.
Bonjour, Lotfi, toujours fidèle au poste, et prêt à porter secours. Merci pour ton aide.
En effet, phpMyAdmin me renvoie "#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':id' at line 1".
Je suis d'accord, je trouve la requête étrange, tout débutant que je suis, elle ne me semble pas signifier grand chose, mais ça ne me dit pas ce que j'ai raté dans cette vidéo, ni d'où vient l'erreur. Quelqu'un peut-il visionner le tuto pour me dire concrètement ce que j'ai raté ? Je repasse la vidéo en boucle depuis deux jours sans voir la faille. J'ai bien corrigé une virgule par ci, une erreur de frappe par là, mais rien ne change, pourtant. Là, je ne trouve plus de différence.
Je donne même toujours la minute à laquelle se trouve le problème dans toutes mes questions (0:49:18), vous n'êtes pas obligés de regarder toute la vidéo. Moi, je me suis repassé un intervalle d'au moins une demi-heure, minute par minute, pour chercher l'erreur...
s'il vous plaît...
D'ailleurs, je viens de revisionner la vidéo, et à la minute 0:49:21 Grafikart a bien la même requête que moi. Et si je ne comprends toujours pas où il veut en venir, force est de constater que c'est bien la requête qu'il souhaite obtenir. Même si elle n'a aucun sens (je crois). La différence, c'est que lorsqu'il fait un test sur un post, qu'il l'édite et le modifie, la modification semble bien passer, et la base de données est bien modifiée, (minute 0:49:28) même si on voit furtivement qu'il y a eu un message d'erreur.
Et, en effet, Lotfi, je dirais en d'autres termes : "Qu'est-ce que c'est que cette requête ???"...