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 :

Erreur PDO : Call to a member function fetch() on a non-object


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 47
    Points : 25
    Points
    25
    Par défaut Erreur PDO : Call to a member function fetch() on a non-object
    Bonjour à tous !
    Je viens solliciter votre aide car je suis confronté à un problème assez bizarre avec PDO ... Voici mon code :

    Je me connecte à ma base
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    try {
        $DB = new PDO($dsn, $user, $password);
    }
    catch (PDOException $e) {
        $error[] =  "Connexion échouée : " . $e->getMessage();
    }
    Puis j'effectue une requete qui fonctionne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $req = $DB->query("ma requete");
    $res = $req->fetch(PDO::FETCH_ASSOC);
    Puis je tente de faire une requete similaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $req = $DB->query("ma requete 2");
    $res = $req->fetch(PDO::FETCH_ASSOC);
    Et la j'ai mon erreur :
    Fatal error: Call to a member function fetch() on a non-object...
    J'ai testé la requete avec phpMyAdmin et je récupère bien des données. Plus étrange encore, j'effectue la même requete qui fonctionne un peu plus haut et la, ça ne marche plus...
    Pour que ça fonctionne, je obligé de remettre le code de connexion à la base (try { $DB = new PDO($dsn, $user, $password); ...).

    Je suis sous Ubuntu (Karmic) et j'ai développé cette page sous Windows (et là ça marche sans problème). J'ai essayé de convertir les CRLF en LF mais ça ne change rien...

    Merci d'avance pour votre aide !

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut
    Je suis très intéressé par ce fil !

    J'ai le même genre de souci : plantage de PDO sur Linux mais tout OK sous Windows...

    Je pense que ça vient de la lib PDO Linux qui plante parce que j'ai testé d'attaquer la même base sous Linux à partir de mon code sur mon poste local Windows et je n'ai pas d'erreur...

    J'ai ce pb lorsque j'effectue bcp de requêtes sur la même connexion PDO. Le seul moyen que j'ai trouvé est de changer mon enchaînement de requêtes pour "soulager" la connexion PDO...

    Pour info, la librairie PDO installée sur mon serveur Linux est celle correspondant à la version de MySQL installée, soit 5.0.67.
    Sous Windows, je n'ai aucun souci, et pourtant ma lib PDO est en 5.0.51a alors que MySQL est en 5.1.30...

    Quelles sont tes versions de MySQL et PDO (sous Linux) ,
    • Mon blog PHP : http://blog.alterphp.com
    • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein

  3. #3
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Déja pour bien commencer, assurez-vous que PDO affiche les erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $dbc = new PDO($dsn, $user, $password);
    $dbc->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    Concernant le problème de numerodix, si tu es obligé de redefinir $DB, on peut se demande ce qu'il vaut avant la ligne qui pose problème ?
    Et s'il ne vaut plus rien, se demander a quel endroit du code il perd sa valeur.

    Quelle version de PHP utilisez-vous, je sais qu'en 2008 (je ne saurais pas dire quelle version de PHP j'utilisais), PDO me posait des problème de perte de connexion et j'etais obligé de spécifier certains paramètres, ce qui n'est plus le cas dans les versions actuelles.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut
    Voici un exemple de déclarations de connexion :

    <config/si_database.php>
    Code php : 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
    23
    class SI_DB_CONFIG
    {
        var $ops = array(
            'driver' => 'mysql',
            'persistent' => false,
            'host' => DB_URL,
            'login' => 'ops',
            'password' => 'opsmdp',
            'database' => 'ref_ops',
            'prefix' => '',
            'encoding' => 'utf8'
        );
     
        public function opsConn()
        {
            return new PDO('mysql:host='.$this->ops['host'].';dbname='.$this->ops['database'],
                            $this->ops['login'], $this->ops['password'], 
                            array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
                                   PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                                   PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
                                   PDO::ATTR_PERSISTENT => false));
        }
    }

    Le fichier qui contient toutes les connexions est chargé par tous les fichiers nécessitant un accès à la base. J'utilise donc tout le temps les même fonctions pour les ouvrir...

    Exemple d'ouverture d'une connexion :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    require_once('config/si_database.php');
     
    $dbConfig = new SI_DB_CONFIG();        
    $dbOps = $dbConfig->opsConn();

    J'utilise PHP 5.1.6 sur le serveur Linux...
    • Mon blog PHP : http://blog.alterphp.com
    • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut
    Apparemment ajouter ces 2 lignes de code pour chaque PDOStatement fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $req = $DB->query("ma requete 2");
    $res = $req->fetch(PDO::FETCH_ASSOC);
    
    $req->closeCursor();
    $req = null;
    • Mon blog PHP : http://blog.alterphp.com
    • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein

  6. #6
    Membre éclairé Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Points : 845
    Points
    845
    Par défaut
    La doc:
    If you do not fetch all of the data in a result set before issuing your next call to PDO::query(), your call may fail. Call PDOStatement::closeCursor() to release the database resources associated with the PDOStatement object before issuing your next call to PDO::query().
    http://php.net/manual/en/pdo.query.php

Discussions similaires

  1. [MySQL] Call to a member function fetch() on a non-object
    Par stade13 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 05/02/2013, 23h13
  2. [MySQL] Problème de INNER JOIN + Call to a member function fetch() on a non-object in
    Par jlee_xxx dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 05/03/2012, 12h15
  3. [MySQL] Fatal error: Call to a member function fetch() on a non-object
    Par tonnebrre dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 24/10/2011, 13h46
  4. [SQL-Server] Call to a member function fetch() on a non-object
    Par geo54 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 08/05/2010, 00h05
  5. [PDO] Fatal error: Call to a member function fetch() on a non-object
    Par blopjerem dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 03/12/2009, 11h53

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