【问题标题】:How to store a return result from an SQL statement in a PHP session variable如何将 SQL 语句的返回结果存储在 PHP 会话变量中
【发布时间】:2017-08-14 23:48:37
【问题描述】:

我昨天在这里遇到了同样的问题,但我稍微更改了代码。我试图在用户登录时获取用户的用户 ID 并将其存储为会话变量。我不知道我做错了什么,因为当我尝试将此会话变量传递到另一个 php 文件中的另一个 SQL INSERT 语句时,它不起作用。如果我将局部变量传递给 INSERT 语句,它会起作用并将所有值插入我的数据库中。当我尝试传递会话变量时,它不起作用。

这是我声明会话变量的登录文件:

<?php
 session_start();

$db =mysqli_connect("localhost", "root", "", "project_website1");

if(isset($_POST['Login_Btn']))  {


    $email = mysql_real_escape_string($_POST['email']);
    $password = mysql_real_escape_string($_POST['password']);

    $id_retrieve = mysqli_query("SELECT user_id FROM userdetails WHERE email='$email'");
    $retrieved_id = mysqli_fetch_row($id_retrieve);


    $password = md5($password);// Decrypt hash of password stored in database

    $mySQLQuery = "SELECT * FROM userdetails WHERE email='$email' AND password='$password'";
    $resultOfQuery = mysqli_query($db, $mySQLQuery);

    if (mysqli_num_rows($resultOfQuery) == 1) {
        $_SESSION['user_id'] =  $retrieved_id[0];
        header("location: User_Home_Page.html");
    }else{          
        $_SESSION['message'] = "Login Fail";
        header("location: User_Login.html");

    }

}
?>

这是我尝试插入此会话变量的文件:

<?php
  session_start();
$db =mysqli_connect("localhost", "root", "", "project_website1");
if(isset($_POST['upload_btn'])){


    $user_id = $_SESSION[ 'user_id' ];
    $taskTitle = mysql_real_escape_string($_POST['tasktitle']);
    $taskDescription = mysql_real_escape_string($_POST['TaskDescription']);

    $file = rand(1000,100000)."-".$_FILES['file_document']['name'];
    $file_loc = $_FILES['file_document']['tmp_name'];
    $file_size = $_FILES['file_document']['size'];
    $file_type = $_FILES['file_document']['type'];
    $folder="uploads/";

    move_uploaded_file($file_loc,$folder.$file);

    $numPages = mysql_real_escape_string($_POST['number_of_pages']);
    $numWords = mysql_real_escape_string($_POST['number_of_words']);
    $deadlineClaim = mysql_real_escape_string($_POST['deadline_claim']);
    $deadlineComplete = mysql_real_escape_string($_POST['deadline_complete']);

    $sql = "INSERT INTO task(user_id, title, description, file, file_type, file_size, pg_num, num_words, deadline_claim, deadline_completion) VALUES( '$user_id', '$taskTitle', '$taskDescription', '$file', '$file_type', '$file_size', '$numPages', '$numWords', '$deadlineClaim', '$deadlineComplete')";
    mysqli_query($db, $sql);
    header("location: User_Home_Page.html");

}

?>

如果有人能提供解决方案,我将不胜感激。

【问题讨论】:

  • 尝试将此mysqli_fetch_row 更改为mysqli_fetch_array,然后将此变量$_SESSION['user_id'] = $retrieved_id[0]; 更改为$_SESSION['user_id'] = $retrieved_id['user_id']; 并尝试var_dump($_SESSION); 这将显示所有会话名称和值
  • 仍然没有解决问题,我该把 var_dump($_SESSION);部分代码?
  • session_start();
  • 仍然没有运气,真的很困惑过去几天一直在寻找解决方案,似乎没有任何工作。
  • 那一刻我会让你的代码工作

标签: php html mysql sql session


【解决方案1】:

首先,您不需要 2 个查询,因为您需要一个查询,根据用户必须登录的数据获取 user_id。

因此,在此查询中,您首先检查电子邮件和密码以匹配该用户,如果匹配,您将获得更多基于mysqli_num_rows0

当你检查这个并且它有效时,你使用mysqli_fetch_array,所以你可以随意使用它的数据。

如果一切正常,您可以删除error_reportingini_setvar_dump,这只是为了测试,如果存在则给您错误

这是您的代码:

<?php

// turn on error reporting
error_reporting(1);
ini_set('error_reporting', E_ALL);

// start session
session_start();

// debug session
var_dump($_SESSION);

// database connection
$db = mysqli_connect("localhost", "root", "", "project_website1");

if(isset($_POST['Login_Btn']))
{

    $email = mysql_real_escape_string($_POST['email']);
    $password = mysql_real_escape_string($_POST['password']);

    // Decrypt hash of password stored in database
    $password = md5($password);

    // get all data from userdetails table
    $mySQLQuery = "SELECT * FROM userdetails WHERE email='$email' AND password='$password'";
    $resultOfQuery = mysqli_query($db, $mySQLQuery);

    // if query return more that 0 rows
    if (mysqli_num_rows($resultOfQuery) > 0)
    {
        // fetch data
        $uid = mysqli_fetch_array($resultOfQuery);

        $_SESSION['user_id'] = $uid['user_id'];
        header("location: User_Home_Page.html");
        exit();
    }
    else
    {          
        $_SESSION['message'] = "Login Fail";
        header("location: User_Login.html");
        exit();
    }

}

?>

编辑: 不要使用md5 不安全使用password_hash()password_verify() 来确保您的密码安全。

【讨论】:

  • 非常感谢您的完美作品!是的,我计划使用站点盐来散列密码,md5 仅用于第一个演示的目的。再次感谢!
  • 没问题 :) 乐于助人
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-23
  • 1970-01-01
  • 1970-01-01
  • 2017-06-26
  • 2015-06-11
  • 2013-08-06
  • 1970-01-01
相关资源
最近更新 更多