Page 1 sur 2

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

Posté : 09 août 2013, 22:01
par To175
Salut, j'utilise une fonction mais j'obtient une erreur aidez moi svp...
l'erreur :
Fatal error: Call to a member function fetch() on a non-object in /home1/x/public_html/x.php on line 26
mon code :
$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
        }
Merci

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

Posté : 09 août 2013, 22:17
par xTG
Actives les erreurs de PDO et tu y verras plus clair : http://fr2.php.net/manual/fr/pdo.error-handling.php ;)

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

Posté : 09 août 2013, 22:17
par moogli
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

Posté : 09 août 2013, 23:16
par To175
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

Posté : 10 août 2013, 02:22
par To175
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

Posté : 10 août 2013, 08:27
par xTG
$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

Posté : 10 août 2013, 11:58
par To175
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

Posté : 10 août 2013, 12:40
par xTG
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

Posté : 10 août 2013, 13:13
par To175
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

Posté : 10 août 2013, 13:43
par xTG
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

Posté : 10 août 2013, 13:44
par To175
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

Posté : 10 août 2013, 13:56
par moogli
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

Posté : 10 août 2013, 15:20
par To175
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

Posté : 10 août 2013, 15:59
par xTG
Oui.

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

Posté : 10 août 2013, 16:17
par To175
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...