Création cookie.

Résolu/Fermé
Max747 Messages postés 258 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 11 janvier 2024 - 22 janv. 2018 à 11:40
Max747 Messages postés 258 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 11 janvier 2024 - 23 janv. 2018 à 10:25
Bonjour,

Dans le but de créer une connexion automatique pour les participants à mon jeu QCM sur les échecs, j'ai mis en oeuvre ces codes que voici pour une connexion à la base de données:
<?php
try 
{
  $connection = new PDO("mysql:host=localhost;dbname=cookie; charset=utf8", 'root', '', 
  array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));  
} 
catch ( Exception $e ) 
{
  echo "Connection à MySQL impossible : ", $e->getMessage();
  die();
}
?>

Puis pour lire la base de données afin d'installer un cookie sur l'ordi client voici le scrypt qui me pose problème pour la lecture de la table "users":
$error = false;
$user = $connection->row('SELECT id, username, password FROM users WHERE username=:username AND password=:password', array(
			'username' => $_POST['username'],
			'password' => md5($_POST['password'])
                        ));
														
setcookie('auth', $user->id . '-----' . sha1($user->username . $user->password . $_SERVER['REMOTE_ADDR']), time() + 3600 * 24 * 100, '/', 'localhost', false, true);   	
		if($user)
		{
			$_SESSION['Auth'] = (array)$user;
			header('Location:index.php');
		}else{
			$error = true;
			}

Et voici le message d'erreur retourné:



Je sais que c'est la ligne 2 uniquement qui est en cause par row.
Mais je ne parviens pas à résoudre ce problème qui d'après moi se rapporte aux objets PDO.
C'est ainsi que je sollicite votre aide qui me permettra de terminer ce petit travail qui simplifiera la connexion des membres accédant à mon site.
Merci d'avance.
A voir également:

4 réponses

jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 718
22 janv. 2018 à 12:45
Bonjour,

Le message est clair ... il ne connait pas l'instruction row dans la ligne
$connection->row

Il te manque un query ... et ou du prepare/execute.
Seulement après avoir exécuté ta requête tu pourras en récupérer son contenu via un fetch.
https://www.php.net/manual/fr/pdostatement.fetch.php

Je t'invite également à appliquer ceci :
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs
(tout .. et pas juste la connexion que tu as déjà mis en place)

Et aussi cela (juste au cas où.. )
https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code

.
1
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 718
22 janv. 2018 à 20:42
<?php

Oui ..y'a à redire :-)

Voici ton code corrigé :
//récupération PROPRE des variables AVANT de les utiliser
$username = !empty($_POST['username']) ? $_POST['username'] : NULL;
$password = !empty($_POST['password']) ?  md5($_POST['password']) : NULL;

$error = false;
$errMsg = NULL;

if($username && $password){
//préparation de la requête et de ses variables
$sql = "SELECT id, username, password FROM users WHERE username=:username AND password=:password";
$datas = array( ':username' => $username, ':password' => $password);

//traitement de la requete
try{
  $user = $connection->prepare($sql); 
  $user->execute($datas);
  $result = $user->fetch(PDO::FETCH_ASSOC); // on récupère la première ligne de résultat
}catch(Exception $e){
  $errMsg[] = "Erreur dans la requete ".$sql . " => " . $e->getMessage();
  $error = true;
}
  
  if(!empty($result)){
    setcookie('auth', $user->id . '-----' . sha1($user->username . $user->password . $_SERVER['REMOTE_ADDR']), time() + 3600 * 24 * 100, '/', 'localhost', false, true);   	
    $_SESSION['Auth'] = $result;
    header('Location:login.php');
    exit(); //toujours mettre un exit apres une redirection !
  }else{
    $error = true;
    $errMsg[] = "Aucun résultat trouvé ";
  }
}else{
  $error = true;
  $errMsg[] = "User ou Password non rempli ";
}

if($error){
  echo "<br> ERROR !!";
  if(!empty($errMsg)){
    foreach($errMsg as $err){
        echo "<br>".$err;
    }
  }
}


Note que le md5 n'est plus une méthode fiable pour gérer des password... désormais pour vérifier les mots de pass en php il est conseillé d'utiliser la fonction password_verify

Voici un exemple :
https://forums.commentcamarche.net/forum/affich-34340900-login-password-php#7


1
Max747 Messages postés 258 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 11 janvier 2024
22 janv. 2018 à 17:17
Bonsoir,

J'ai essayé ce scrypt et ça fonctionne désormais:
$error = false;
$user = $connection->prepare("SELECT id, username, password FROM users WHERE username=:username AND password=:password"); 
													 $user->execute (array(
														'username' => $_POST['username'],
														'password' => md5($_POST['password'])));
														
														
													setcookie('auth', $user->id . '-----' . sha1($user->username . $user->password . $_SERVER['REMOTE_ADDR']), time() + 3600 * 24 * 100, '/', 'localhost', false, true);   	
													if($user)
														{
														$_SESSION['Auth'] = (array)$user;
														header('Location:login.php');
														}else{
															$error = true;
															  }

Aurais tu quelque chose à ajouter?
Merci pour ton aide.
A bientôt.
0
Max747 Messages postés 258 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 11 janvier 2024
23 janv. 2018 à 10:25
Bonjour,

Merci pour ces codes améliorés auxquels je vais m' employer à utiliser désormais.
Bien sûr j'ai encore appris avec toi.Et pour cela je t'en remercie infiniment!
A la première lecture des détails, je n'ai pas tout compris.
C'est ainsi que je vais m' orienter vers les nombreuses documentations dont je dispose en PHP dans les livres, e-book et sur internet pour tenter de comprendre toutes les subtilités d'un scrypt établit dans les règle de l'art.
Cette façon d'apprendre par la recherche permet surtout de mieux retenir ce que l'on acquiert ainsi.

Encore merci.
A une prochaine fois pour un autre demande d'aide.
Sujet résolut me concernant.

Cordialement.
0