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

Eléphanteau du PHP | 10 Messages

09 août 2013, 22:01

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

ViPHP
xTG
ViPHP | 7331 Messages

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 ;)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

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."'");
@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 10 Messages

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

Eléphanteau du PHP | 10 Messages

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()) {

ViPHP
xTG
ViPHP | 7331 Messages

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...

Eléphanteau du PHP | 10 Messages

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

ViPHP
xTG
ViPHP | 7331 Messages

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.

Eléphanteau du PHP | 10 Messages

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...

ViPHP
xTG
ViPHP | 7331 Messages

10 août 2013, 13:43

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

Eléphanteau du PHP | 10 Messages

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()) {
[...]

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

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;
    }
}
@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 10 Messages

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

ViPHP
xTG
ViPHP | 7331 Messages

10 août 2013, 15:59

Oui.

Eléphanteau du PHP | 10 Messages

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...