Stocker toutes les variables dans $_SESSION [Résolu/Fermé]

Signaler
Messages postés
593
Date d'inscription
mardi 8 avril 2008
Statut
Membre
Dernière intervention
11 mai 2018
-
Messages postés
33126
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 juillet 2021
-
Bonjour,

Voila je cherche a apprendre a coder mais la encore je me heurte a un problème, j'ai mis en place un page d'inscription qui fonctionne bien, sur cette même page j'ai mis a la suite une partie connection, mais quand je veux faire ma commande avec ->fecht();
J'ai un message d'erreur :

Fatal error: Uncaught Error: Cannot use object of type stdClass as array
Error: Cannot use object of type stdClass as array

<?php
session_start();
include ('cobdd.php');
if(isset($_POST['formconnexion']))
{
 $pseudoconnect = htmlspecialchars($_POST['pseudoconnect']);
 $mdpconnect = sha1($_POST['mdpconnect']);
 
 if(!empty($pseudoconnect) AND !empty($mdpconnect))
 {
  $requser = $bdd->prepare("SELECT * FROM user WHERE pseudo = ? AND mp = ?");
  $requser->execute(array($pseudoconnect, $mdpconnect));
  $userexist = $requser->rowCount();
  
  if($userexist == 1)
  {
   
   $userinfo = $requser->fetch();
   
   $_SESSION['id'] = $userinfo['id'];
   $_SESSION['nom'] = $userinfo['nom'];
   $_SESSION['prenom'] = $userinfo['prenom'];
   $_SESSION['pseudo'] = $userinfo['pseudo'];
   $_SESSION['mp'] = $userinfo['mp'];

   
   
   
   echo 'ok';
   
  }
  else
  {
   $etat = 'Mauvais identifiant !';
  }
 }
 else
 {
  $etat = 'Tous les champs ne sont pas remplis !';
 }
}
?>



Merci de votre aide.



1 réponse

Messages postés
33126
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 juillet 2021
3 635
Bonjour,

1 - récupère proprement les variables AVANT de les utiliser.
¨Pour cela, utilise l'écriture ternaire... comme par exemple ici : https://www.commentcamarche.net/faq/1391-php-notice-undefined-index

2 - Vu que tu utilises PDO ... active l'affichage des erreurs : https://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs
NB : penses à mettre TOUTES tes requêtes dans des blocs TRY/CATCH comme dans l'exemple du lien)

3 - N'utilises pas ROWCOUNT.
Regarde la doc :
https://www.php.net/manual/fr/pdostatement.rowcount.php
On peut y lire :
ce comportement n'est pas garanti pour toutes les bases de données

A la place .. fais donc un fetchAll puis un COUNT dessus.


Messages postés
593
Date d'inscription
mardi 8 avril 2008
Statut
Membre
Dernière intervention
11 mai 2018
19
Merci de votre réponse pour le 1 je vais modifier cela, pour le 2 j'ai déja activer les erreur voici le fichier cobdd.php:

<?php
try{
$bdd =new PDO('mysql:host=127.0.0.1; 
 dbname=sitebeta; charset=utf8', 'root', '');
 $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
} catch(PDOException $e) {
    die('Erreur : ' . $e->getMessage());
}
?>


Bon après il est vrai que je doit mettre mes requêtes SQL et la tache exécutoire dans des variable distique.

Et utiliser try et catch a chaque requêtes SQL afin de voir les erreurs a chaque bout de code comme vous me l'avais dit il y a quelques temps.

Pour le 3 donc si j'ai bien compris:

$sqlrequete = "SELECT * FROM user WHERE pseudo = ? AND mp = ?";
$data = array($pseudoconnect, $mdpconnect);

try{
 $requser = $bdd->prepare();
  $requser->execute($data);
  $userexist = $requser->fetchAll();

}catch(Exception $e){
echo " Erreur ! ".$e->getMessage();
   echo " Les datas : " ;
  print_r($data);
}




Mais donc COUNT(*) doit être placer dans la requête SQL mais cela sert juste a a compter le nombre de résultats qu'il y a par rapport a la requête si j'ai bien compris ?

Ou je peu l'uttiliser comme cela
$requserexist = $userexist->COUNT();



Merci d'avance pour votre réponse.
Messages postés
33126
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 juillet 2021
3 635 >
Messages postés
593
Date d'inscription
mardi 8 avril 2008
Statut
Membre
Dernière intervention
11 mai 2018

Dans ta connexion... change le PDO::FETCH_OBJ en PDO::FETCH_ASSOC

Puis, dans ton code :
$sql = "SELECT * 
         FROM user 
         WHERE pseudo = :pseudo 
               AND mp = :mp ";
$data = array(':pseudo'=>$pseudoconnect
                         ,':mp'=> $mdpconnect
                         );

try{
  $requser = $bdd->prepare($sql);
  $requser->execute($data);
  $result = $requser->fetchAll();
}catch(Exception $e){
  echo " Erreur ! ".$e->getMessage();
   echo " Les datas : " ;
   print_r($data);
}
 
 $nbresult = !empty($result) ? count($result) : 0; 
  if($nbresult  == 1)   {
     $userinfo =  $result[0];   
     $_SESSION['id'] = $userinfo['id'];
     $_SESSION['nom'] = $userinfo['nom'];
     $_SESSION['prenom'] = $userinfo['prenom'];
     $_SESSION['pseudo'] = $userinfo['pseudo'];
     $_SESSION['mp'] = $userinfo['mp'];
    echo 'ok';
  }  else  {
    $etat = 'Mauvais identifiant !';
  }

Messages postés
593
Date d'inscription
mardi 8 avril 2008
Statut
Membre
Dernière intervention
11 mai 2018
19
Super ça fonctionne, pouvez juste m'expliquer deux petite choses:

Pourquoi changer l'attribue PDO par défaut en PDO::FETCH_ASSOC ?


Pouvez vous m'expliquer cette ligne :
$nbresult = !empty($result) ? count($result) : 0; 


Merci beaucoup.
Messages postés
33126
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 juillet 2021
3 635 >
Messages postés
593
Date d'inscription
mardi 8 avril 2008
Statut
Membre
Dernière intervention
11 mai 2018

  
$userinfo['id']; //  => ASSOCIATIF
  $userinfo->id; // => OBJET