Partage
  • Partager sur Facebook
  • Partager sur Twitter

Variable indéfinie

[Erreur] [MySQL]

    3 avril 2020 à 14:56:16

    Bonjour,

    j'ai un problème au niveau d'une variable où je ne saisis pas où est l'erreur. J'ai deux tables dans mysql, et sur une page php je voudrais récupérer la valeur de l'ID de l'utilisateur qui est créé dans l'espace membre, pour pouvoir récupérer cette valeur et pouvoir l'utiliser dans une action Sql mais j'ai un souci, lorsque je crée une nouvelle fonction avec $_SESSION['auth']->id  pour récupérer juste l'id il me met que $_session est une variable indéfinie. Comme ceci : 

    ( ! ) Notice: Undefined variable: _SESSION in C:\wamp64\www\espace\Calendrier\public\index.php on line 7
    Call Stack
    #TimeMemoryFunctionLocation
    1 0.0029 409104 {main}( ) ...\index.php:0

    ( ! ) Notice: Trying to get property 'id' of non-object in C:\wamp64\www\espace\Calendrier\public\index.php on line 7
    Call Stack
    #TimeMemoryFunctionLocation
    1 0.0029 409104 {main}( ) ...\index.php:0

    Donc j'ai essayé en dessous de mettre  ID : <?=$_SESSION['auth']->id?>  pour voir si l'utilisateur est bien connecté et si il me ressort une valeur et oui il m'en ressort une. Alors pourquoi ici il me ressort une valeur alors qu'au dessus la variable $_SESSION n'existe pas.

    Voici le code ci dessous de l'index:

        <?php 
        require '../src/bootstrap.php';
        require '../src/Calendar/Month.php';
        require '../src/Calendar/Events.php';
        require '../../inc/functions.php';
        $pdo = get_pdo();
        $user_id = $_SESSION['auth']->id;
        $events = new Calendar\Events($pdo);
        $month = new Calendar\Month($_GET['month'] ?? null, $_GET['year'] ?? null);
        $days = new Calendar\Month($_GET['days'] ?? null);
        $start = $month->getStartingDay();
        $start = $start->format('N') === '1' ? $start : $month->getStartingDay()->modify('last monday');
        $weeks = $month->getWeeks();
        $end = (clone $start)->modify('+' . (6+7 * ($weeks -1)) . 'days');
        $events = $events->getEventsBetweenByDay($start, $end);
        require '../views/header.php';
        require '../inc/header.php';
        ?>
    
        <?php if (isset($_GET['success'])) :?>
          <div class="container">
            <div class="alert">
              L'événement a bien été enregistré
            </div>
          </div>
        <?php endif; ?>
    
        <h1>Bonjour <?= $_SESSION['auth']->first_name; ?></h1>
        <p> ID : <?= $_SESSION['auth']->id; ?>
    
    <div class="toDay">
        <?= $month->toStringNow(); ?>
    </div>
    
    <div class="calendar">
        <div class="d-flex">
          <h1>
          <a href="?month=<?= $month->previousMonth()->month; ?>&year=<?= $month->previousMonth()->year; ?>" class="btn">&lt;</a>
          <?= $month->toString(); ?>
          <a href="?month=<?= $month->nextMonth()->month; ?>&year=<?= $month->nextMonth()->year; ?>" class="btn">&gt;</a>
          </h1>
        </div>

    Merci d'avance, bon confinement prenez soin de vous

    -
    Edité par TimotheiChartier1 6 avril 2020 à 22:12:35

    • Partager sur Facebook
    • Partager sur Twitter
      3 avril 2020 à 15:15:18

      Bonjour.

      Est-ce que tu initialises la session dans un des fichiers que tu inclues de la ligne 2 à 5 ?

      Si ce n'est pas le cas, il te faut le faire, d'où l'erreur.

      • Partager sur Facebook
      • Partager sur Twitter

      Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.

        3 avril 2020 à 16:20:35

        > Undefined variable: _SESSION

        Signifie que tu n'as pas fait de session_start(); préalable.

        • Partager sur Facebook
        • Partager sur Twitter
          5 avril 2020 à 11:29:04

          Bonjour en effet je n'ai en aucun cas fais de session_start. Et dans  les fichiers que j'inclues de la ligne 2 à 5 il y avait un fichier avec :

          function logged_only(){
            if (session_status() == PHP_SESSION_NONE){
          
              session_start();
            
            }
            if(!isset($_SESSION['auth'])){
              $_SESSION['flash']['danger'] = "Vous n'avez pas le droit d'acceder à cette page";
              header('Location: login.php');
              exit();
            }
          }

          Je pensais que faire un session_start ici aurait fonctionné mais non il faut faire un session start dans le fichier directement.

          Je vous remercie de votre aide !

          Bonne continuation et bonne journée 

          • Partager sur Facebook
          • Partager sur Twitter
            5 avril 2020 à 13:51:40

            Fait attention, la session est conditionnée. Si tu ouvres une session à côté, ton test est court-circuité...

            De plus, tu nous montres une fonction que tu n'appelle JAMAIS dans ton code. Si tu l'appelles à la ligne 6, tu devrait y voir plus clair.

            La prog c'est pas de la magie, il faut lire les scripts ;)

            -
            Edité par christouphe 5 avril 2020 à 13:52:55

            • Partager sur Facebook
            • Partager sur Twitter
              5 avril 2020 à 15:54:17

              Bonjour,

              Mauvais titre

              Le titre est un élément important qui ne doit pas être négligé. N'oubliez pas cette règle simple : le titre idéal résume la question que vous allez poser en une petite phrase. Il doit permettre aux visiteurs de se repérer facilement dans le forum visité et d'identifier le sujet à sa seule lecture.

              Vous pouvez utiliser divers préfixes comme [Erreur], [MySQL], [Compatibilité], etc... Aussi, pensez à consulter les règles propres à chaque forum (visibles dans les topics épinglés en haut des sections).

              De plus, choisir un bon titre permet de rendre plus faciles les recherches des autres membres.

              Les titres de type "besoin d'aide" ou "problème" ne sont pas tolérés.

              Pour modifier votre titre, éditez le premier message de votre sujet.

              (titre originel : Variable indéfinie)

              • Partager sur Facebook
              • Partager sur Twitter

              Pas d'aide concernant le code par MP, le forum est là pour ça :)

                6 avril 2020 à 21:16:03

                Bonsoir,

                j'ai à nouveau un problème, j'ai donc démarré ma session dans la page index mais maintenant je voudrais utiliser la variable $user_id pour pourvoir comparé l'id de l'utilisateur avec un autre id et d'afficher que ceux qui sont égaux, voici le code:

                <?php
                
                namespace Calendar;
                
                class Events {
                
                  private $pdo;
                
                  public function __construct(\PDO $pdo){
                    $this->pdo = $pdo;
                  }
                
                  public function getEventsBetween (\DateTime $start, \DateTime $end) : array{
                    $sql = "SELECT * FROM events WHERE id_user = '$user_id' AND start BETWEEN '{$start->format('Y-m-d')}' AND '{$end->format('Y-m-d')}' ORDER BY start ASC";
                    $statement = $this->pdo->query($sql);
                    $results = $statement->fetchAll();
                    return $results;
                  }

                Voici ce qu'il m'affiche : 

                ( ! ) Notice: Undefined variable: user_id in C:\wamp64\www\espace\Calendrier\src\Calendar\Events.php on line 14

                Merci de votre aide et soutien.

                • Partager sur Facebook
                • Partager sur Twitter
                  6 avril 2020 à 21:23:47

                  Bonsoir,

                  Tu as un problème de portée des variables.

                  Dans ta fonction, user_id n'existe que dans celle-ci donc il faut la passer en paramètre.

                  Et respecte la demande de modération sinon ton sujet sera fermé

                  • Partager sur Facebook
                  • Partager sur Twitter
                    6 avril 2020 à 21:32:48

                    Bonsoir,

                    J'ai donc fait comme ceci :

                      public function getEventsBetween (int $user_id, \DateTime $start, \DateTime $end) : array{
                        $sql = "SELECT * FROM events WHERE id_user = '$user_id' AND start BETWEEN '{$start->format('Y-m-d')}' AND '{$end->format('Y-m-d')}' ORDER BY start ASC";
                        $statement = $this->pdo->query($sql);
                        $results = $statement->fetchAll();
                        return $results;
                      }

                    J'avais fait cela auparavant et j'avais vu cette erreur et c'est la première fois que j'ai vu ce genre d'erreur : 

                    ( ! ) Fatal error: Uncaught TypeError: Argument 1 passed to Calendar\Events::getEventsBetween() must be of the type int, object given, called in C:\wamp64\www\espace\Calendrier\src\Calendar\Events.php on line 21 and defined in C:\wamp64\www\espace\Calendrier\src\Calendar\Events.php on line 13

                    Merci d'avance.

                    (J'essaie de changer le titre)

                    • Partager sur Facebook
                    • Partager sur Twitter
                      6 avril 2020 à 21:35:02

                      Pour changer le titre il faut éditer ton 1er message

                      comment appelles-tu cette méthode avec le $user_id en paramètre ?

                      • Partager sur Facebook
                      • Partager sur Twitter
                        6 avril 2020 à 21:35:58

                        Alors on y est presque:

                        n'utilises pas query mais le trytique prepare/bindvalue/execute => la doc est là, et le cours aussi

                        ne concatènes JAMAIS les variables dans la requête => bindvalue

                        • Partager sur Facebook
                        • Partager sur Twitter
                          6 avril 2020 à 21:36:24

                          Parce que tu as appelé ta méthode avec $_SESSION['auth'] au lieu de $_SESSION['auth']->id, me trompe-je ?

                          Sinon il faut changer le typehinting pour object ou, mieux, le nom de ta classe, du premier paramètre pour passer ton objet et changer $user_id en $user_id->id dans la requête (du coup, il vaudrait mieux dans ce cas changer le nom de la variable $user_id en $user ou quelque chose dans ce genre).

                          Et j'approuve le message ci-dessus de christouphe, même si tes variables/données ne présentent a priori aucun risque, ne serait-ce que pour la lisibilité et par principe, il serait vivement conseillé de binder tes valeurs.

                          -
                          Edité par julp 6 avril 2020 à 21:42:26

                          • Partager sur Facebook
                          • Partager sur Twitter
                            6 avril 2020 à 21:54:17

                            J'appel avec $_SESSION['auth']->id

                            Pour mettre en paramètre $user_id je dois le mettre au même niveau que \DateTime $start?

                            Vous me conseiller alors d'utiliser cela: $sth->bindValue(':calories'$caloriesPDO::PARAM_INT); pour pouvoir avoir une valeur correcte et pour qu'il y ai aucun probleme lors de ma requete ? 

                            • Partager sur Facebook
                            • Partager sur Twitter
                              6 avril 2020 à 21:56:13

                              Montre voir le code de ton appel. Ce sera plus simple pour te répondre.

                              > Vous me conseiller alors d'utiliser cela: $sth->bindValue(':calories', $calories, PDO::PARAM_INT); pour pouvoir avoir une valeur correcte et pour qu'il y ai aucun probleme lors de ma requete ?

                              Oui, en adaptant bien sûr mais c'est l'idée, oui (et ça implique de préparer la requête, pas juste de faire des binds - je précise, sait-on jamais).

                              -
                              Edité par julp 6 avril 2020 à 21:58:03

                              • Partager sur Facebook
                              • Partager sur Twitter
                                6 avril 2020 à 22:01:00

                                  public function getEventsBetween (\DateTime $start, \DateTime $end) : array{
                                    $user_id = $_SESSION['auth']->id;
                                    $sql = "SELECT*FROM events WHERE id_user = :user ANDstartBETWEEN '{$start->format('Y-m-d')}' AND '{$end->format('Y-m-d')}' ORDER BYstartASC";
                                    $sql->bindValue(':user', $user_id, PDO::PARAM_INT);
                                    $statement = $this->pdo->query($sql);
                                    $results = $statement->fetchAll();
                                    return $results;
                                  }
                                Voici le code que j'ai fait avec la méthode (il marche pas) 
                                Mais le code suivant si il marche:
                                  public function getEventsBetween (\DateTime $start, \DateTime $end) : array{
                                    $user_id = $_SESSION['auth']->id;
                                    $sql = "SELECT*FROM events WHERE id_user = '$user_id' ANDstartBETWEEN '{$start->format('Y-m-d')}' AND '{$end->format('Y-m-d')}' ORDER BYstartASC";
                                    $statement = $this->pdo->query($sql);
                                    $results = $statement->fetchAll();
                                    return $results;
                                  }

                                -
                                Edité par TimotheiChartier1 6 avril 2020 à 22:15:12

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  6 avril 2020 à 22:04:05

                                  Je te demandais l'appel de ta méthode mais tu me donnes son code ... Avec $_SESSION['auth'](->id) directement utilisée dans celle-ci, tu limites grandement sa réutilisation aussi.

                                  > et ça implique de préparer la requête, pas juste de faire des binds - je précise, sait-on jamais

                                  lol, PDO::query = requête non préparée, pour préparer la requête tu dois utiliser la méthode PDO::prepare à la place

                                  Merci pour la 404, tout ça pour ajouter les tags [Erreur] [MySQL] qui n'apportent strictement rien dans le titre. Je ne donne pas cher de ta peau si un modérateur passe par là :

                                  • code pas inséré proprement via le bouton </>
                                  • un titre qui n'est toujours pas correct
                                  • manque évident de recherche

                                  -
                                  Edité par julp 6 avril 2020 à 22:09:52

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    6 avril 2020 à 22:11:35

                                    Oupsi pardon au début je mettait en paramètre comme ceci :

                                    public function getEventsBetween (int $user_id,\DateTime $start, \DateTime $end) : array{



                                    Mais merci pour ces conseilles !

                                    (j'utilise les </> comme tu peux voir ci-dessus)

                                    je débute sur le forum donc j'ai encore du mal avec tous les tags etc...

                                    -
                                    Edité par TimotheiChartier1 6 avril 2020 à 22:17:54

                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Variable indéfinie

                                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                    • Editeur
                                    • Markdown