PHP SESSION 未定义变量

PHP SESSION undefined variable

enter image description here 晚上好,我正在做一个小型 uni' 项目。我正在创建一个网站,人们可以在其中 post 使用 PHP 出售他们使用过的物品或将它们与另一个对象交换(一种 ebay,但简单 100000 倍),这对我来说是新的。为简单起见,在填写连接表单 (connexion.php) 后,用户将被重定向到他自己的个人资料 (profil.php),其中会显示他的用户名和电子邮件(在从数据库中获取它们之后)。如下图:

///////////connexion.php : //////////

<?php
session_start(); 
try
{
    $bdd = new PDO('mysql:host=localhost;dbname=espace_membre;charset=utf8', 'root', '');
}
catch (Exception $e)
{
        die('Erreur : ' . $e->getMessage()); //message d'erreur au cas où la connexion échoue
}

if(isset($_POST['formconnect']))  //vérifie que le bouton pour se connecter est enclenché 
{
  $mailconnect = htmlspecialchars($_POST['mailconnect']); 
  $mdpconnect = sha1($_POST['mdpconnect']);
  if(!empty($mailconnect) AND !empty($mdpconnect))
  {
     $requser=$bdd->prepare("SELECT * FROM membres WHERE email = ? AND mdp= ?");  
     $requser->execute(array($mailconnect,$mdpconnect));
     $userexist=$requser->rowcount(); 
     if($userexist==1)
     {
          $userinfo=$requser->fetch();
          $_SESSION['id']=$userinfo['id'];
          $_SESSION['pseudo']=$userinfo['pseudo'];
          $_SESSION['email']=$userinfo['email'];
          header("Location: profil.php?id=".$_SESSION['id']);
     }
     else
     {
      $erreur="password or mail not valid" ; 
     }
  }
  else
  {
    $erreur =" please complete all inputs " ; 
  }
}
 ?>

连接后,用户将被重定向到他的个人资料,名为 profil.php,如下所示:

<?php
session_start();

 
//tentative de connexion à la base de donnée 
try
{
    $bdd = new PDO('mysql:host=localhost;dbname=espace_membre;charset=utf8', 'root', '');
}
catch (Exception $e)
{
        die('Erreur : ' . $e->getMessage()); //message d'erreur au cas où la connexion échoue
}


if(isset($_GET['id']) AND $_GET['id'] > 0)
{
  $getid=intval($_GET['id']);
  $requser= $bdd -> prepare('SELECT * FROM membres WHERE id= ?');
  $requser->execute(array($getid));
  $userinfo=$requser->fetch();


[the table where my users infos are stored. membres means members in french][1]

<html>

<head>
    <title>Profil de <?php echo $userinfo['pseudo']?></title>    
    <meta charset='utf-8'>
</head>

  <div align="center">
         <h3>profil TROKI</h3>
        <br/>
        
        
      <h3>les annonces de <?php echo $userinfo['pseudo']?> </h3>
          pseudo = <?php echo $userinfo['pseudo']?> <br/> //this one works
           mail = <?php echo $userinfo['email']?> <br/>  //this one works too

           <?php 
            if (isset($_SESSION['id']) AND $userinfo['id']==$_SESSION['id']) 
            {
             ?>
              //everything here is visible only when the user is logged in 
             <h>Bienvenue dans ton profil <?php echo $userinfo['pseudo']?> </h2> 
             <a href="editionprofil.php"> éditer mon profil</a> 
             <a href="modifiermdp.php">modifier mon mot de passe</a>
             <a href="deconnexion.php"> se déconnecter</a>
             <a href="formulaireajout.php"> ajouter une annonce</a>
            
             <?php 
            }
           ?>
    </div>

 <?php    
  }
   else
   ?>
</html>

每当我想打印类似

的东西时
  <h2>welcome to your profile,<?php echo $userinfo['pseudo']?> </h2>

变量 $userinfo['pseudo'] 变成我用户的昵称,这就是我想要的。

但是,由于我不知道的原因,我无法让这些变量在任何其他页面上工作并且我不断收到此错误:

** 注意:未定义变量:C:\wamp\www\projet2\formulaireajout.php 中第 64 行的 userinfo**

我已经创建了另一个页面供用户填写表格以post某事

 <?php
session_start();
try
{
    $bdd = new PDO('mysql:host=localhost;dbname=espace_membre;charset=utf8', 'root', '');
}
catch (Exception $e)
{
        die('Erreur : ' . $e->getMessage()); //message d'erreur au cas où la connexion échoue
}

// ////////////////////////////////////////////////////////////////////////////////////////////////
if(isset($_SESSION['id']))
{   echo "ok"; // I'm getting "ok" so this condition is verified
 }

else
{
  //echo "lol";
  header('location:connexion.php');
} 
if(isset($_GET['id']) AND $_GET['id'] > 0)
{
  $getid=intval($_GET['id']);
  $requser= $bdd -> prepare('SELECT * FROM membres WHERE id= ?');
  $requser->execute(array($getid));
  $userinfo=$requser->fetch();
}

<!DOCTYPE html>
<html>
<head>
    <title>Ajouter une annonce</title>
</head>
<body>
    <h3>You can post your things here,<?php echo $userinfo['pseudo']?></h3> // here, $userinfo generates an undefined variable error ! 
    <div align="center">
    'some extra code deleted'

</body>
</html>

嗯,我的问题是,如果我的 $userinfo 是在 profile.php 页面中定义的,为什么它会在我创建的所有其他页面中生成错误?我究竟做错了什么 ? (这个项目大约占了我学期分数的60%,所以我遇到了麻烦,我无法解决它)

感谢您的阅读,祝您有愉快的一天!

在连接页面上,您将 URL 中的 ID 传递到个人资料页面,如下所示: header("Location: profil.php?id=".$_SESSION['id']); 个人资料页面上正在寻找 $_GET['id' 的函数]要设置就满足了,因为id设置在URL.

但是,如果我是用户并点击这些链接:

  • editionprofil.php
  • modifiermdp.php
  • deconnexion.php
  • formulaireajout.php

ID 未在 URL 或页面请求中传递,但您的代码仍在寻找要在这些页面上设置的值以及下面的代码片段:

if(isset($_GET['id']) AND $_GET['id'] > 0)
{
  $getid=intval($_GET['id']);
  $requser= $bdd -> prepare('SELECT * FROM membres WHERE id= ?');
  $requser->execute(array($getid));
  $userinfo=$requser->fetch();
}

因为 $_GET['id'] 没有设置这个变量 $userinfo 没有被定义为以后在你的代码中使用。仅当 $_GET['id'] 已设置且大于 0 时才会设置。

我的建议是,由于您已经在会话中设置了用户 ID,因此请在其他页面上调用 $_SESSION 变量。所以只要你现在在文件的顶部继续启动会话并且你不结束或销毁会话,你应该能够访问其他页面上的 $_SESSION 数组的值:

      $_SESSION['id']=$userinfo['id'];
      $_SESSION['pseudo']=$userinfo['pseudo'];
      $_SESSION['email']=$userinfo['email'];

对于您已在会话中设置的值,只需稍后在其他页面的代码中回显这些值即可。所以调用它应该在其他页面上有效:

<?php echo $_SESSION['pseudo']?></h3>

如果您当然想销毁会话 and/or 取消设置用户“注销”时的值。此外,由于值在会话中,您不需要在每个页面上为相同的值执行数据库查找,除非它们将要更改或您正在寻找尚未存储在会话中的新数据。

希望对您有所帮助。