在使用会话时,如何从PHP中的MySQL表中回显信息。

在使用会话时,如何从PHP中的MySQL表中回显信息。,php,mysql,session-variables,Php,Mysql,Session Variables,我使用会话将用户信息从一个页面传递到另一个页面。然而,我认为我可能使用了错误的概念来满足我的特殊需要。以下是我想做的: 当用户登录时,表单操作被发送到login.php,我在下面提供了它: login.php $loginemail = $_POST['loginemail']; $loginpassword = md5($_POST['loginpassword']); $con = mysql_connect("xxxx","database","pass"); if

我使用会话将用户信息从一个页面传递到另一个页面。然而,我认为我可能使用了错误的概念来满足我的特殊需要。以下是我想做的:

  • 当用户登录时,表单操作被发送到login.php,我在下面提供了它:
  • login.php

    $loginemail = $_POST['loginemail'];     
    
    $loginpassword = md5($_POST['loginpassword']);  
    
    $con = mysql_connect("xxxx","database","pass");  
    if (!$con)  
        {      
      die('Could not connect: ' .mysql_error());  
        }  
    
    mysql_select_db("db", $con);  
    
    $result = mysql_query("SELECT * FROM Members  
    WHERE fldEmail='$loginemail'   
    and Password='$loginpassword'");
    
    
    //check if successful  
    if($result){  
        if(mysql_num_rows($result) == 1){  
                session_start();  
                $_SESSION['loggedin'] = 1; // store session data  
                $_SESSION['loginemail'] = fldEmail;  
        header("Location: main.php"); } 
    }  
    mysql_close($con);  
    
  • 现在,为了在整个网站中使用$_会话['loggedin']来访问需要授权的页面,我制作了一个'auth.php',它将检查用户是否登录
  • 下面提供了“auth.php”:

    session_start();        
    if($_SESSION['loggedin'] != 1){  
    header("Location: index.php"); }  
    
  • 现在的问题是,当您登录时,login.php会通过header将您引导到main.php。如何在main.php上回显MySQL中“fldFullName”列中存储的用户全名?我必须像在login.php中那样再次连接吗?或者有没有其他方法可以简单地从MySQL表中回显用户名?这是我目前在main.php中尝试做的事情,但是没有显示用户名:

    $result = mysql_query("SELECT * FROM Members  
    WHERE fldEmail='$loginemail'     
        and Password='$loginpassword'");  
    
    //check if successful  
    if($result){  
        if(mysql_num_rows($result) == 1){  
            $row = mysql_fetch_array($result);  
              echo '<span class="backgroundcolor">' . $row['fldFullName'] .       '</span><br />' ;  
    
    $result=mysql\u查询(“从成员中选择*
    其中fldEmail=“$loginemail”
    密码=“$loginpassword”);
    //检查是否成功
    如果($结果){
    如果(mysql_num_rows($result)==1){
    $row=mysql\u fetch\u数组($result);
    回显“.$row['fldFullName']”。

  • 我要指出的是,您使用的技术存在一些严重的安全漏洞,但为了避免关于安全性的严重争论,快速修复方法是将
    login.php
    中的
    $row
    存储在会话变量中,然后由您访问。我很惊讶没有
    会话启动()
    login.php
    顶部调用


    不过,我强烈建议您考虑一种范式转换。您不应该保留一个变量来指示登录状态,而应该在会话状态下保留用户名和密码的加密版本。然后,在
    main.php
    的顶部,您每次都会从数据库中请求用户数据,并且您将拥有所有字段您还需要验证用户是否已登录。

    让我指出,您使用的技术存在一些严重的安全漏洞,但为了避免关于安全性的严重争论,快速修复方法是将
    login.php
    中的
    $row
    存储在会话变量中,然后由您访问。我很惊讶在
    login.php
    顶部没有调用
    session\u start()

    不过,我强烈建议您考虑一种范式转换。您不应该保留一个变量来指示登录状态,而应该在会话状态下保留用户名和密码的加密版本。然后,在
    main.php
    的顶部,您每次都会从数据库中请求用户数据,并且您将拥有所有字段您还需要验证用户是否实际登录

    我必须像在login.php中那样再次连接吗

    是的,这就是PHP和mysql的工作方式

    或者有没有其他方法可以简单地从MySQL表中回显用户名

    不可以。要从mysql表中获取内容,必须先连接。
    您可以将connect语句放入某个配置文件中,并将其包含到所有脚本中

    如何在main.php上回显MySQL中“fldFullName”列中存储的用户全名

    您需要一些标识符才能从数据库中获取正确的行。电子邮件可能会起作用,但强烈建议使用自动增量id字段,该字段将存储在会话中。
    现在,您的后一个代码段中没有$loginemail和$loginpassword,是吗

    还有一些关于代码的注释

  • 任何
    标题(“位置:”;
    语句后面必须跟有
    exit;
    。否则将没有任何保护

  • 任何要以引号放入查询的数据都必须使用
    mysql\u real\u escape\u string()
    函数进行转义。没有例外

  • 所以,事情会是这样的

    include $_SERVER['DOCUMENT_ROOT']."/dbconn.php";
    
    $loginemail = $_POST['loginemail'];     
    $loginpassword = md5($_POST['loginpassword']);  
    
    $loginemail = mysql_real_escape_string($loginemail);     
    $loginpassword = mysql_real_escape_string($loginpassword);  
    
    $query = "SELECT * FROM Members WHERE fldEmail='$loginemail' and Password='$loginpassword'";
    $result = mysql_query($query) or trigger_error(mysql_error().$query);
    
    if($row = mysql_fetch_assoc($result)) {  
      session_start();  
      $_SESSION['userid'] = $row['id']; // store session data  
      header("Location: main.php"); 
      exit;
    } 
    
    和main.php部分

    session_start();
    if(!$_SESSION['userid']) {
      header("Location: index.php"); 
      exit;
    } 
    include $_SERVER['DOCUMENT_ROOT']."/dbconn.php";
    
    $sess_userid = mysql_real_escape_string($_SESSION['userid']);
    $query  = "SELECT * FROM Members  WHERE id='$sess_userid'";  
    $result = mysql_query($query) or trigger_error(mysql_error().$query);
    $row = mysql_fetch_assoc($result));
    
    include 'template.php';
    
    我必须像在login.php中那样再次连接吗

    是的,这就是PHP和mysql的工作方式

    或者有没有其他方法可以简单地从MySQL表中回显用户名

    不可以。要从mysql表中获取内容,必须先连接。
    您可以将connect语句放入某个配置文件中,并将其包含到所有脚本中

    如何在main.php上回显MySQL中“fldFullName”列中存储的用户全名

    您需要一些标识符才能从数据库中获取正确的行。电子邮件可能会起作用,但强烈建议使用自动增量id字段,该字段将存储在会话中。
    现在,您的后一个代码段中没有$loginemail和$loginpassword,是吗

    还有一些关于代码的注释

  • 任何
    标题(“位置:”;
    语句后面必须跟有
    exit;
    。否则将没有任何保护

  • 任何要以引号放入查询的数据都必须使用
    mysql\u real\u escape\u string()
    函数进行转义。没有例外

  • 所以,事情会是这样的

    include $_SERVER['DOCUMENT_ROOT']."/dbconn.php";
    
    $loginemail = $_POST['loginemail'];     
    $loginpassword = md5($_POST['loginpassword']);  
    
    $loginemail = mysql_real_escape_string($loginemail);     
    $loginpassword = mysql_real_escape_string($loginpassword);  
    
    $query = "SELECT * FROM Members WHERE fldEmail='$loginemail' and Password='$loginpassword'";
    $result = mysql_query($query) or trigger_error(mysql_error().$query);
    
    if($row = mysql_fetch_assoc($result)) {  
      session_start();  
      $_SESSION['userid'] = $row['id']; // store session data  
      header("Location: main.php"); 
      exit;
    } 
    
    和main.php部分

    session_start();
    if(!$_SESSION['userid']) {
      header("Location: index.php"); 
      exit;
    } 
    include $_SERVER['DOCUMENT_ROOT']."/dbconn.php";
    
    $sess_userid = mysql_real_escape_string($_SESSION['userid']);
    $query  = "SELECT * FROM Members  WHERE id='$sess_userid'";  
    $result = mysql_query($query) or trigger_error(mysql_error().$query);
    $row = mysql_fetch_assoc($result));
    
    include 'template.php';
    

    是的,您必须为每个页面加载重新连接到数据库。只需将该代码放在一个单独的文件中,并使用PHP函数将其包括在内

    您遇到的另一个问题是,main.php中不存在变量
    $loginemail
    $loginpassword
    。您将用户的电子邮件地址存储在$\u会话数组中,因此只需重新加载用户信息:

    $safe_email = mysql_real_escape_string($_SESSION['loginemail']);
    $result = mysql_query("SELECT * FROM Members
      WHERE fldEmail='$safe_email'");
    

    此外,您的代码允许SQL注入攻击。在将任何变量插入SQL查询之前,始终使用该函数并将变量用引号括起来(如上面的代码段所示)。

    是的,您必须重新连接到