IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Call to a member function prepare() on a non-object [PDO]


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 18
    Points : 9
    Points
    9
    Par défaut Call to a member function prepare() on a non-object
    Salut à tous.

    Je suis en train d'essayer un truc classique avec PDO : appeler des classes et les hydrater avec des données.
    J'utilise un modèle que j'utilise sur pas mal d'autres sites à moi et après plusieurs heures de recherches : j'en reviens à vous.

    La page qui pose probleme me renvoie le message :
    Fatal error: Call to a member function prepare() on a non-object in /homepages/33/d498484054/htdocs/class/modele.class.php on line 11
    Voici l'extrait de la page en question :
    crea.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $id = intval($_GET['id']);
    $query = $db->query("SELECT id from crea where id = ".$id."");
    if($result = $query->fetch()){
    	$crea = new Crea($result['id']);
    (...)
    Avant cela je fait appel à server.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    session_start();
    $db = new PDO('mysql:host=xxx;dbname=xxx;charset=utf8','xxx','xxx', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
    include_once('class/import.php');
    Qui lui même fait appel à import.php pour inclure les classes "Crea" et "Modele"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    include_once("modele.class.php");
    include_once("crea.class.php");
    crea.class.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    class Crea extends Modele{
    	public function __construct($id){
    		$this->addKey("id");
    		$this->addKey("title");
    		$this->addKey("description");
    		$this->addKey("link");
    		$this->tableName = "crea";
    		parent::__construct($id);
    	}
    }
    ...et enfin le debut de modele.class.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <?php
    class Modele{
    	public $table = array();
    	protected static $db;
    	public $tableName="none";
    	protected $error=false;
    	public function __construct($value){
    		$this->addKey("id");
    		$obj =self::$db->prepare("SELECT * FROM ".$this->tableName." WHERE id=?;"); // Erreur ici
    		$obj->execute(array($value));
    		if($obj->rowCount()==1){
    			$obj->setFetchMode(PDO::FETCH_OBJ);
    			foreach ($obj->fetch() as $key => $value)
    				$this->hydratePrivate($key,$value);
    		}
    		else if($value=!-1)
    			$this->error="Aucun élément trouvé: id=".$value."(".$this->tableName.")";
    	}
    	public static function setPdo($_db){
    		self::$db = $_db;
    	}
    (...)
    Donc pour moi : il veux me dire que $db n'existe pas : HORS je l'ai bien déclaré dans server.php non ?
    J'ai vérifié mes includes si il n'y avait pas un soucis de sous répertoires ou une connerie du genre mais apparemment non !

    PDO est marqué comme activé dans phpinfo().
    Je suis chez *soupir* 1&1.

    Comme je l'ai dit j'ai déja utiliser cette structure des dizaines de fois et c'est la première fois que je galère sur un truc pareil !
    Help !

    Merci d'avance

  2. #2
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 835
    Points
    2 835
    Par défaut
    Difficile de répondre comme ça, avec des bouts de code.

    Quoi qu'il en soit le message est explicite et vous l'avez compris : la variable que vous pensez être un objet n'en est pas un !
    Etes-vous dans une classe ? une fonction ? Les includes ont bien été fait AVANT l'utilisation de la variable ?

    Testez peut-être avec $GLOBALS['db'] plutôt que $db !

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    J'ai testé en local et ça fonctionne.

    Merci de l'aide en tout cas.

  4. #4
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Moi je vois deux choses :
    • Une variable $db
    • un membre statique protégé Modele::$db

    Ce sont deux choses bien distinctes et il est normal que, après que tu as initialisé $db, Modele::$db soit toujours indéfini.

    Apparemment Modele::$db est utilisé dans le constructeur de la classe. Il faut donc que la fonction Modele::setPdo ait été appelée avant la première instanciation de Modele.




    Autre chose :
    Oulà. Je vais décomposer le contenu de ce if.
    1. la variable $value
    2. l'opérateur d'affectation =
    3. l'expression !-1 qui est équivalente à false (tous les nombres valent true sauf zéro)

    Au final on a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    else if ($value = false)
    Après quoi la variable $value contient la valeur true et la branche de ce if n'est jamais suivie. Ce n'est sans doute pas ce que tu as voulu faire.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/02/2014, 23h49
  2. Réponses: 16
    Dernier message: 23/05/2013, 10h35
  3. [PDO] Fatal error: Call to a member function prepare() on a non-object
    Par nu_tango dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 20/12/2012, 08h33
  4. Call to a member function prepare() on a non-object
    Par KenConnor dans le forum Langage
    Réponses: 8
    Dernier message: 20/01/2011, 22h11
  5. [PDO] Call to a member function prepare() on a non-object
    Par Invité dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 15/07/2009, 14h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo