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

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Call to a member function fetch() on a non-object

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

par xTG » 10 août 2013, 18:49

PDO::prepare prépare la requête. Il est inutile de préparer une requête sans argument, c'est du temps CPU perdu pour rien.
Donc il est normal d'avoir une requête préparée avec des arguments.
Arguments que tu renseignes à la ligne 2 dans le execute.

Le principe d'une requête préparée c'est de la préparer et de l'exécuter avec plusieurs arguments différents.
C'est plus rapide que d'exécuter X execute sur une requête préparée avec X arguments différents que d'exécuter X query contenant chacune une requête dont l'argument diffère (et qui n'aura pas été préparée).

Vois cela comme si tu avais à servir des invités chez toi.
Si tu n'as pas fait la vaisselle pour X assiettes bah tu es obligé de le faire pour chaque convive qui arrive.
Or faire une grosse vaisselle utilise moins d'eau que de faire X fois la vaisselle avec peu d'assiette.

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

par To175 » 10 août 2013, 16:17

Merci,
Pourtant ligne 3 j'utilise $recherche et ligne 1 je l'ai défini étant la préparation de requête mais je n'ai pas défini le pseudo qui vient après...

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

par xTG » 10 août 2013, 15:59

Oui.

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

par To175 » 10 août 2013, 15:20

Merci,
Est ce que ce code fait bien ce que j'ai écrit en commentaire s'il vous plait?
$recherche = $pdo->prepare('SELECT * FROM profil WHERE pseudo= :pseudo'); //prépare ma requête
$recherche->execute(array('pseudo' => $pseudo)); //exécution de la requête
    if ($row1 = $recherche->fetch()) { //on vérifie si la requête renvoie des resultats
	//s'il y a résultat...
}else{
//sinon autre chose...
}
Merci

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

par moogli » 10 août 2013, 13:56

pff vous répondez trop vite :/

pour le 'array' c'est parce que fetch retourne un tableau, donc utilise l'index que tu veux pour pour obtenir les données de la requête.

ajouter un try /catch ou tester le retour d'une fonction c'est primordial pour ne pas te trouver dans cette situation.

pour ce que tu souhaite faire un select count(*) as nb from lenomdelatable etc etc suffit.

maintenant si tu affiche les erreurs, que tu execute ledernier code qui est indiqué dans ci dessus
<?php
$username = $_SESSION['username'];
$password = $_POST['password'];
$password = sha1($password);

        if($username&&$password)
        {
        //Cherche mot de passe
$mdp = $pdo->prepare('SELECT * FROM table WHERE username= :username AND password= :password');
        $mdp->execute(array('username' => $username, 'password' => $password));
        
    if ($row2 = $mdp->fetch()) {[...]
tu a forcément une erreur avec l'utilisation du mot clef table qui n'est pas à sa place.
et ceci est indiqué justement par le message d'erreur fournit par le SGBD.
tu ne peux le voir car tu ne le récupère pas.

Par exmeple tu faire ceci
<?php
/**
 * Récupère le message d'erreur et lève une exception
 * @param $object
 * @throws Exception
 */
function parsePdoError($object) {
    if (is_a($object, 'PDO') || is_a($object, 'PDOStatement')) {
        $err = $object->errorInfo();
        throw new Exception($err);
    } else {
        throw new Exception('Erreur inconnue !');
    }
}

try {
    $pdo = new PDO('mysql:host=localhost;dbname=mediatheque', 'mediatheque', 'mediatheque');
    $stmt = $pdo->prepare('SELECT count(*) as nb FROM authme WHERE username= :username AND password= :password');
    if ($stmt === false) {
        // gestion de l'erreur
        parsePdoError($pdo);
    } else {
        $stmt->bindValue(':username', $_POST['username']);
        $_POST['password'] = sha1($_POST['password']);
        $stmt->bindValue(':password', $_POST['password']);
        $ret = $stmt->execute();
        if ($ret === false) {
            // erreur
            parsePdoError($stmt);
        } else {
            $data = $stmt->fetch();
            if ($data['nb'] != 0) {
                // le compte existe
            } else {
                // le compte n'existe pas
            }
        }
        $stmt->closeCursor();
    }
} catch (Exception $e) {
    xdebug_var_dump($e);
}
// Attention la clause finally c'est à partir de php 5.5 si ce n'est pas ton cas enlève la et met le code qui se trouve dedans à la fin du try (fermeture de la connexion "pdo")
finally {
    // fermeture de la connexion si ouverte
    if (!empty($pdo)) {
        $pdo = null;
    }
}
@+

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

par To175 » 10 août 2013, 13:44

Merde l'erreur a disparue #-o
Cependant elle a laissée une trace, il y a écrit "Array" parceque j'ai fait echo $res; ... :?
Est ce que c'est normal si j'ai ce code?
$mdp = $pdo->prepare('SELECT * FROM table WHERE username= :username AND password= :password');
        $mdp->execute(array('username' => $username, 'password' => $password));
	$res = $mdp->fetch(PDO::FETCH_ASSOC);
echo $res; //ici l'affichage de se fameux Array
    if ($row2 = $mdp->fetch()) {
[...]

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

par xTG » 10 août 2013, 13:43

Avec le mode warning tu n'as que la ligne d’instanciation de l'objet PDO à modifier.

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

par To175 » 10 août 2013, 13:13

Actives la gestion des erreurs PDO... Sinon c'est comme chercher une aiguille dans une botte de foin la nuit.
CF mon premier message dans ce topic.
Merci,
Sauf que j'aimerais faire ça sans avoir a tout changer mon code, et selon les tuto, je ne vois pas comment faire...

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

par xTG » 10 août 2013, 12:40

Actives la gestion des erreurs PDO... Sinon c'est comme chercher une aiguille dans une botte de foin la nuit.
CF mon premier message dans ce topic.

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

par To175 » 10 août 2013, 11:58

Merci,
Je souhaitais enfait tester l'existence de l'utilisateur dans la table "profil", si l'utilisateur existe pas on le crée, sinon on continue le code.
Est ce que ce code fait ça ou l'inverse ?
--
Bon j'ai essayé qqch :
$username = $_SESSION['username'];
$password = $_POST['password'];
$password = sha1($password);

	if($username&&$password)
	{
	//Cherche mot de passe
$mdp = $pdo->prepare('SELECT * FROM table WHERE username= :username AND password= :password');
        $mdp->execute(array('username' => $username, 'password' => $password));
	
    if ($row2 = $mdp->fetch()) {[...]
Et j'ai cette erreur :

Code : Tout sélectionner

Fatal error: Call to a member function exec() on a non-object in /home1/mecraft/public_html/x.php on line 62

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

par xTG » 10 août 2013, 08:27

$pdo = new PDO('mysql:host=x.x.x;dbname=x', 'x', 'x');
    $req = $pdo->query("SELECT * FROM profil WHERE pseudo=".$pseudo."");
    if ($row1 = $req->fetch()) {
        //quelque chose
	}else{
        //quelque chose d'autre
        }
Sauriez vous m'expliquer ce que fait ce code s'il vous plait, j'ai un doute. merci
Il récupère les n-uplets dont le pseudo est égal à $pseudo.
Ton if te permet de récupérer le premier résultat de la requête, s'il y a des résultats (au moins un) tu es dans le cas "quelque chose".
Si la requête ne renvoie rien tu es dans le cas "quelque chose d'autre"
$username = $pdo->quote($_SESSION['username']);
$password = $_POST['password'];
$password = sha1($password);

        if($username&&$password)
        {
        //Cherche mot de passe
        $mdp = $pdo->query("SELECT * FROM authme WHERE username='".$username."' AND password='".$password."'");
        }
       
    if ($row2 = $mdp->fetch()) {
Même principe ici sauf que c'est un peu le bazar...
Le premier if n'a pas de raison d'exister ou est mal utilisé. Si c'est pour éviter de faire une requête sur des variables vides ou inexistantes il vaut mieux utiliser la fonction empty().
Le second if est mal placé, il devrait être dans le premier if, car sinon la variable $mdp peut ne pas exister...

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

par To175 » 10 août 2013, 02:22

salut,

requête foireuse, query retourne false.

d'ailleurs ta requête n'est pas syntaxiquement correct !
une chaîné en SQL doit être délimiter par des quote ( ' )
<?php
$req = $pdo->query("SELECT * FROM profil WHERE pseudo='".$pseudo."'");
@+
Merci, mais vous auriez une explication à cela svp?
$username = $pdo->quote($_SESSION['username']);
$password = $_POST['password'];
$password = sha1($password);

	if($username&&$password)
	{
	//Cherche mot de passe
	$mdp = $pdo->query("SELECT * FROM authme WHERE username='".$username."' AND password='".$password."'");
	}
	
    if ($row2 = $mdp->fetch()) {

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

par To175 » 09 août 2013, 23:16

salut,

requête foireuse, query retourne false.

d'ailleurs ta requête n'est pas syntaxiquement correct !
une chaîné en SQL doit être délimiter par des quote ( ' )
<?php
$req = $pdo->query("SELECT * FROM profil WHERE pseudo='".$pseudo."'");
@+
MMMMMMMMMMMMMMMMMerrrrrcimercimercimercimerci
$pdo = new PDO('mysql:host=x.x.x;dbname=x', 'x', 'x');
    $req = $pdo->query("SELECT * FROM profil WHERE pseudo=".$pseudo."");
    if ($row1 = $req->fetch()) {
        //quelque chose
	}else{
        //quelque chose d'autre
        }
Sauriez vous m'expliquer ce que fait ce code s'il vous plait, j'ai un doute. merci

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

par moogli » 09 août 2013, 22:17

salut,

requête foireuse, query retourne false.

d'ailleurs ta requête n'est pas syntaxiquement correct !
une chaîné en SQL doit être délimiter par des quote ( ' )
<?php
$req = $pdo->query("SELECT * FROM profil WHERE pseudo='".$pseudo."'");
@+

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

par xTG » 09 août 2013, 22:17

Actives les erreurs de PDO et tu y verras plus clair : http://fr2.php.net/manual/fr/pdo.error-handling.php ;)