Précédent   Forum du club des développeurs et IT Pro > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 02/01/2013, 16h33   #1
hugodu28
Membre habitué
 
hugues dupont
Pompier
Inscription : janvier 2010
Messages : 316
Détails du profil
Informations personnelles :
Nom : hugues dupont
Localisation : France

Informations professionnelles :
Activité : Pompier

Informations forums :
Inscription : janvier 2010
Messages : 316
Points : 114
Points : 114
Par défaut erreur syntaxe fetch()

bonjour,

je viens d'acheter la revue "web design" sur savoir tout faire avec php et Mysql.
C'est une petite bible.

Je viens d'essayer un tuto où quelques erreurs de syntaxes y étaient.
Après correction de quelques unes, il me reste celle là.
Je ne sais pas d'où ça vient.

message erreur
Code :
Fatal error: Call to a member function fetch() on a non-object in F:\EasyPHP-5.3.9\www\tuto php\login.php on line 29
code du formulaire
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php
include("config.php");
 
//Vérification que la page est appelée en POST
if(!$_SERVER["REQUEST_METHOD"]=="POST"){
	die("Accès non autorisé");
}
 
//Vérification entrée login et password
if(strlen($_POST["username"])<=0 or strlen($_POST["password"])<=0){
	die("Vous devez entrer un nom d'utilisateur et un mot de passe");
}
 
//Le cas échéant, on crée les variables et on hashe le password.
 
$username = $_POST["username"];
$password = hashPassword($_POST["password"]);
 
//test identifiant psword
$check_credentials_query = $mysql->prepare("SELECT * FROM users WHERE user_name=:username AND user_password=:password");
$check_credentials = $check_credentials_query->execute(array('password' => $password, 'username' => $username));
 
if($check_credentials_query->rowCount() == 1) {  
 
//On démarre les sessions.
 
	session_start();
	session_name("dispo_SPV"); 
	$userdata=$check_credentials->fetch();
	$_SESSION["authenticated"] = true;
	//	On crée un token à usage unique puis on le crypte en utilisant le même cryptage que le mot de passe.
 
	$_SESSION["token_uncrypted"] = uniqid();
	$_SESSION["token"] = hashpassword($_SESSION["token_uncrypted"]);
 
	//On redirige le visiteur vers la page protégée de votre choix.
 
	header("Location: userarea.php");
	exit();
} else {
    die("Mauvais couple d’identifiants.");
}
 
?>
hugodu28 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 17h03   #2
Exia93
Membre Expert
 
Homme
Étudiant
Inscription : avril 2012
Messages : 602
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2012
Messages : 602
Points : 1 053
Points : 1 053
Bonjour,

c'est normal la fonction execute() de PDO renvoi un booléen et non un PDO::Statement.

Tu doit passer par ta variable $check_credentials_query pour pouvoir utiliser ta méthode fetch().

Ce qui donnera :
Code :
1
2
3
ligne 21 : $check_credentials_query->execute(array('password' => $password, 'username' => $username)); 
/* Suite du code */
ligne 29 : $userdata=$check_credentials_query->fetch();
Exia93 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/01/2013, 17h58   #3
hugodu28
Membre habitué
 
hugues dupont
Pompier
Inscription : janvier 2010
Messages : 316
Détails du profil
Informations personnelles :
Nom : hugues dupont
Localisation : France

Informations professionnelles :
Activité : Pompier

Informations forums :
Inscription : janvier 2010
Messages : 316
Points : 114
Points : 114
Merci ça fonctionne.
Mais au fait à qui sert cette variable?
hugodu28 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 18h19   #4
Exia93
Membre Expert
 
Homme
Étudiant
Inscription : avril 2012
Messages : 602
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2012
Messages : 602
Points : 1 053
Points : 1 053
Si j'ai bien compris ta question,

$check_credentials_query stocke le "résultat" de ta requête, mais tu ne peut pas l'exploiter comme ça,

il faut que tu passe par la méthode fetch() (ou fetchAll() mais elle retourne le résultat différemment) du résultat, cette méthode va donner chaque ligne du résultat à un tableau, objet (selon le paramètre que tu donne à la méthode fetch()),

et c'est via ce tableau ou cette objet que tu peut utiliser les informations reçu de la base de données.
Exia93 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 23h17   #5
hugodu28
Membre habitué
 
hugues dupont
Pompier
Inscription : janvier 2010
Messages : 316
Détails du profil
Informations personnelles :
Nom : hugues dupont
Localisation : France

Informations professionnelles :
Activité : Pompier

Informations forums :
Inscription : janvier 2010
Messages : 316
Points : 114
Points : 114
En fait ce que je ne comprend pas c'est à quoi ça sert d'avoir cette valeur dans la session .
À quoi peut elle servir plus tard ?
hugodu28 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 23h24   #6
sabotage
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 16 466
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 16 466
Points : 21 273
Points : 21 273
$check_credentials_query n'est pas stocké dans la session.
Par contre effectivement ta ligne
Code :
$userdata=$check_credentials->fetch();
ne sert à rien.
Si tu souhaites avoir les informations sur l'utilisateur connecté dans la session il faudrait
Code :
$_SESSION["userdata"]=$check_credentials->fetch();
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/01/2013, 12h07   #7
hugodu28
Membre habitué
 
hugues dupont
Pompier
Inscription : janvier 2010
Messages : 316
Détails du profil
Informations personnelles :
Nom : hugues dupont
Localisation : France

Informations professionnelles :
Activité : Pompier

Informations forums :
Inscription : janvier 2010
Messages : 316
Points : 114
Points : 114
ok si j'ai bien compris ton explication, cette fonction me permet via un tableau, d'avoir tous les renseignements sur l'utilisateur (tous les champs de la table) et de les utiliser dans d'autre formulaires?

Effectivement, je viens de voir que j'avais supprimé une ligne vue que la première fonction ne marchait pas.

Code :
1
2
$userdata=$check_credentials_query->fetch();
$_SESSION=$userdata;
c'est la première fois que je vois une déclaration de session sans attribut du type ["xxxx"]. Quelle est l'intêret????

Je comprend vite mais il faut m'expliquer longtemps
hugodu28 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2013, 13h30   #8
sabotage
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 16 466
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 16 466
Points : 21 273
Points : 21 273
$_SESSION se comporte comme une variable tableau normale.

dans ton code $userdata est un tableau contenant par exemple $userdata['username']
donc tu obtiendras $_SESSION['username'] etc.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/01/2013, 14h27   #9
hugodu28
Membre habitué
 
hugues dupont
Pompier
Inscription : janvier 2010
Messages : 316
Détails du profil
Informations personnelles :
Nom : hugues dupont
Localisation : France

Informations professionnelles :
Activité : Pompier

Informations forums :
Inscription : janvier 2010
Messages : 316
Points : 114
Points : 114
G compris.
MERCIIIIIIIIIIII

Tes explications sont super simples à comprendre et ça c'est cool.
hugodu28 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 22h15.


 
 
 
 
Partenaires

Hébergement Web