Bonjour,
J'avais posté " Jour 4 problême "Undefined property: Post::$pdo in..." & "Call ...", mais le problème persiste.
L'erreur n'est plus la même mais je n'arrive pas à trouver la solution.
Erreur : Call to a member function prepare() on a non-object
Model.php :
<?php
class Model{
static $connections = array();
public $conf = 'default';
public $table = false;
public $db;
public $pdo;
public function __construct(){
if($this->table === false){
$this->table = strtolower(get_class($this)).'s';
}
$conf = Conf::$databases$this->conf];
if(isset(Model::$connections$this->conf])){
$this->db = Model::$connections$this->conf];
return true;
}
try{
$this->pdo = new PDO('mysql:host='.$conf'host'].';dbname='.$conf'database'].';'
,$conf'login'],$conf'password'],array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
$this->pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
Model::$connections$this->conf] = $this->pdo;
}catch(PDOException $e){
if(Conf::$debug >= 1){
die($e->getMessage());
}else{
die('Impossible de se connecter à la base de donnée');
}
}
}
public function find($req){
$this->sql = 'SELECT * FROM '.$this->table.' as '.get_class($this).' ';
if(isset($req'conditions'])){
$this->sql .= 'WHERE ';
if(!is_array($req'conditions'])){
$this->sql .= $req'conditions'];
}else{
$cond = array();
foreach($req'conditions'] as $k=>$v){
if(!is_numeric($v)){
$v = '"'.mysql_escape_string($v).'"';
}
$cond] = "$k=$v";
}
$this->sql .= implode(' AND ',$cond);
}
}
$pre = $this->pdo->prepare($this->sql);
$pre->execute();
return $pre->fetchAll(PDO::FETCH_OBJ);
}
public function findFirst($req){
return current($this->find($req));
}
}
Lorsque je retire
public $pdo;
J'ai l'ancienne erreur qui s'affiche " Notice: Undefined property: Post::$pdo in /home/cercleescrimegarennois/www/core/Model.php on line 52 Fatal error: Call to a member function prepare() on a non-object in /home/cercleescrimegarennois/www/core/Model.php on line 52"
Lorsque je remplace les $this->pdo par $pdo
J'ai l'erreur suivante qui apparait " Undefined variable: pdo in /home/cercleescrimegarennois/www/core/Model.php on line 53 Fatal error: Call to a member function prepare() on a non-object in /home/cercleescrimegarennois/www/core/Model.php on line 53
Si quelqu'un trouve la solution je le remercie d'avance.
Oui j'ai vérifier, sur la .../pages/render ou /pages/index.php même si elle n'existe pas tout fonctionne il y a juste sur /pages/view/... que sa ne fonctionne pas
As-tu vérifié le contenu de ta variable $this->pdo ?
De plus, il me semble que ta class Model devrait étendre de PDO : class Model extends PDO{ .... }
Je viens de changer
class Model {...}
pour
class Model extends PDO{ .... }
et cela ne fonctionne pas plus.
Lorsque je fais un echo $this->pdo;
J’obtient
Catchable fatal error: Object of class PDO could not be converted to string in /home/cercleescrimegarennois/www/core/Model.php on line 53
Avec un print_r voici se que sa donne
PDO Object ( )
Et pour un var_dump sa donne sa
object(PDO)#7 (0) { }
Bonjour tout le monde,
Quelqu'un aurais une petite idée de se qui se passe pour que je puisse continuer le tutoriel.
Merci d'avance
voila ton code
public function find($req){
$this->sql = 'SELECT * FROM '.$this->table.' as '.get_class($this).' ';
if(isset($req'conditions'])){
$this->sql .= 'WHERE ';<====== ya comme une différence ici
if(!is_array($req'conditions'])){
$this->sql .= $req'conditions'];<======= ici aussi
}else{
$cond = array();
foreach($req'conditions'] as $k=>$v){
if(!is_numeric($v)){
$v = '"'.mysql_escape_string($v).'"';
}
$cond] = "$k=$v";
}
$this->sql .= implode(' AND ',$cond);<======= ici aussi
}
}
$pre = $this->pdo->prepare($this->sql);
$pre->execute();
return $pre->fetchAll(PDO::FETCH_OBJ);
}
voila le mien
public function find($req){
$sql ='SELECT *FROM '.$this->table.' as ' .get_class($this).' ';
if (isset($req'conditions'])) {
$sql.='WHERE ';
if (!is_array($req'conditions'])) {
$sql.=$req'conditons'];
}else{
$cond=array();
foreach ($req'conditions'] as $k => $v) {
if (!is_numeric($v)) {
$v='"'.mysql_escape_string($v).'"';
}
$cond] = "$k=$v";
}
$sql.= implode (' AND ', $cond);
}
}
$pre =$this->db->prepare($sql);
$pre->execute();
return $pre->fetchAll(PDO::FETCH_OBJ);
}
voila :) j'ai pas testé voir si ton code marche mais déjà corrige çà :)
Pourquoi faire $this->sql ? C'est totalement inutile, cette variable n'a d'intérêt que dans cette fonction, remplace les $this->sql par $sql.
Je ne pense pas que se soit cela qui fasse buggé, essaye mais en tout cas tu gagneras en performence avec $sql
Merci pour les réponses (j'avais plus de connection internet c pour sa que je n'ai pas répondu plus tôt)
Le $this->sql est là car sinon pas de connection à la base (l'erreur est celle-ci
Fatal error: Call to a member function prepare() on a non-object in /home/cercleescrimegarennois/www/core/Model.php on line 55 )
Sinon Djins j'ai essayer et cela ne fonctionne pas et si cela ne venais pas du code mais du serveur ??
Je vois des réponse un peu bizarre de partout.
La faute est que $this->sql n'est pas un objet PDO.
Si comme tu dis la fonction PDO fonctionne mal à cause du serveur, ce que je te conseille de faire un test de base sur une page vierge.
C'est à dire tu fais juste un simple PDO et tu rééssaie de faire un prepare dessus.
// Du genre
$connectString = "Tu met ta chaine a la place";
$pdoInstance = PDO($connectString, [le reste]);
$req = "select * from table";
$pdoInstance->prepare($req);
Si tu vois que ça plante juste en faisant simple sur un script vierge alors tu as peut-être un problème serveur. Et là tu peux réinstaller ton wamp.