Stocker toutes les variables dans $_SESSION

Résolu
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

  1. Modérateur
    Bonjour,

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

    2 - Vu que tu utilises PDO ... active l'affichage des erreurs : https://forums.commentcamarche.net/forum/affich-37584941-php-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.

    1. 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.
    2. Modérateur
      @flo39400Dans 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 !';
        }
      
      
    3. 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.
    4. Modérateur
      @flo39400
        
      $userinfo['id']; //  => ASSOCIATIF
        $userinfo->id; // => OBJET