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 :

Error: Call to a member function fetch()


Sujet :

PHP & Base de données

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    779
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 779
    Points : 178
    Points
    178
    Par défaut Error: Call to a member function fetch()
    Bonjour,

    J’ai besoin de votre aide concernant une erreur « Call to a member function fetch() » que je rencontre depuis la installation de la mise à jour 3.2.5 de WampServer.

    Je ne suis pas certain, elle doit être provoquée par la version plus récente de PHP 7.3.21 ?

    Comment corriger ce problème.

    Merci d’avance pour vos réponses.

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 101
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 101
    Points : 8 211
    Points
    8 211
    Billets dans le blog
    17
    Par défaut
    1. Nous donner du code
    2. Checker ta connexion PDO / ta requête préparée (voir la methode PDO/PDOStatement::errorInfo()
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    779
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 779
    Points : 178
    Points
    178
    Par défaut
    Bonjour,

    En fait je me viens de me rendre compte qu’après le clic sur mon bouton « Enregistrement suivant » si le ou les champs « nom, prenom, id » sont vides cela provoque « Error: Call to a member function fetch() ».

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    @$nom = $_POST['nom'];
    @$prenom = $_POST['prenom'];
    @$id = $_POST['id'];
     
    $sql = "SELECT * FROM personnes WHERE (nom,prenom,id) > ('$nom','$prenom',$id) ORDER BY nom,prenom,id LIMIT 1";
     
    $result=$bdd->query($sql);		
    $data = $result->fetch(PDO::FETCH_ASSOC);
    Et là quelle est la syntaxe si $data > 1 alors …

    Merci d’avance pour vos réponses.

  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 101
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 101
    Points : 8 211
    Points
    8 211
    Billets dans le blog
    17
    Par défaut
    Il faut généralement éviter les @ (surtout pendant le développement), ça cache les erreurs et rend le code difficile à débuguer.

    Tu peux remplacer ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    @$nom = $_POST['nom'];
    @$prenom = $_POST['prenom'];
    @$id = $_POST['id'];
    Par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $nom = isset($_POST['nom']) ? $_POST['nom'] : null;
    $prenom = isset($_POST['prenom']) ? $_POST['prenom'] : null;
    $id = isset($_POST['id']) ? $_POST['id'] : null;
    Ou avec du PHP moins vieillot :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $nom = $_POST['nom']) ?? null;
    $prenom = $_POST['prenom'] ?? null;
    $id = $_POST['id'] ?? null;
    Voire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $_POST['nom'] ??= null;
    $_POST['prenom'] ??= null;
    $_POST['id'] ??= null;
    Dans les 2 cas les isset() et ?? évitent les notices, et libre à toi de remplacer les null par toute autre valeur par défaut.

    Bon ensuite théoriquement tu ne devrais pas traiter un formulaire incomplet, non ?

    Donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (!isset($_POST['nom'], $_POST['prenom'], $_POST['id'])) {
        // Formulaire non soumis ou incomplet
        // Message d'erreur, redirection, etc.
    } else {
        // Requête SQL avec les paramètres valorisés
    }

    Et pour finir, le fond du problème, est que si $id est vide ta requête donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM personnes
    WHERE (nom, prenom, id) > ('Dupont', 'Antoine', )
    ORDER BY ...
    Ce qui est incorrect.

    Au dessus je parlais de PDO::errorInfo(), il aurait fallu l'utiliser ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $sql = "...";
     
    $result=$bdd->query($sql);		
    if ($result === false) { // Erreur ?
        echo '<pre>'
        echo $sql;
        print_r($bdd->errorInfo());
        echo '</pre>';
        exit;
    }
    $data = $result->fetch(PDO::FETCH_ASSOC);
    La solution est de délimiter $id par des ' dans ta requête SQL ou de lui donner une valeurs par défaut.

    (et dans un 2nd temps de ne pas oublier d'échapper tes valeurs avec $bdd->quote() sinon c'est la porte ouverte à toutes les injections SQL malicieuses)

    Désolé pour le pâté,
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    779
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 779
    Points : 178
    Points
    178
    Par défaut
    Bonjour,

    Merci pour toutes vos explications.

    Voici mon code corrigé :
    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
    <?php
    }elseif($_POST['suivant']){
    $nom = $_POST['nom'];
    $prenom = $_POST['prenom'];
    $id = $_POST['id'];
     
    $sql = "SELECT * FROM personnes WHERE (nom,prenom,id) > ('$nom','$prenom', '$id') ORDER BY nom,prenom,id LIMIT 1";
     
    $result=$bdd->query($sql);
    if ($result === false) { // Erreur ?
    echo '<script>alert("Les champs du formulaire sont vides sélectionner le premier ou un enregistrement!");</script>';
    	?>
    	      <script> history.go(-1); </script> 				
    	<?php
    	exit;
    }		
    $data = $result->fetch(PDO::FETCH_ASSOC);	
    
    J’ai donc supprimé les @ des variables, délimité $id par des ' dans ta requête SQL (grossière erreur de ma part) et ça fonctionne parfaitement.

    @ +

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    779
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 779
    Points : 178
    Points
    178
    Par défaut
    Re bonjour,

    J’ai un petit souci.

    J’ai supprimé l’@ de }elseif(@$_POST['suivant']){ et maintenant le message suivant s’affiche :
    ! Notice : Unfined index : suivant in C:\wamp64\www\...
    Est-ce obligatoire de le supprimer ?

    @ +

  7. #7
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 101
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 101
    Points : 8 211
    Points
    8 211
    Billets dans le blog
    17
    Par défaut
    J'ai déjà répondu à ce point
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

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

Discussions similaires

  1. [PDO] Fatal error: Call to a member function fetch() on a non-object
    Par CyberCat_ dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 20/03/2015, 07h54
  2. [MySQL] Fatal error: Call to a member function fetch() on a non-object
    Par Saoualah dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 14/07/2014, 09h30
  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, 12h46
  4. [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, 10h53

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