Stocker toutes les variables dans $_SESSION

Résolu
flo39400 Messages postés 659 Statut Membre -  
jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   -
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. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
     
    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.

    0
    1. flo39400 Messages postés 659 Statut Membre 21
       
      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.
      0
      1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832 > flo39400 Messages postés 659 Statut Membre
         
        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 !';
          }
        
        
        0
    2. flo39400 Messages postés 659 Statut Membre 21
       
      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.
      0
      1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832 > flo39400 Messages postés 659 Statut Membre
         
          
        $userinfo['id']; //  => ASSOCIATIF
          $userinfo->id; // => OBJET
        
        0