【问题标题】:var_dump array returning my string, double?var_dump 数组返回我的字符串,双倍?
【发布时间】:2019-04-26 08:17:55
【问题描述】:

经过几个小时的研究,到目前为止我自己还没有找到合适的解决方法,所以我来了!

我目前正在从事一个学校项目,该项目使用 login.php 验证器文件来检查用户是否填写了所有输入等,并创建会话。

require "config.inc.php";

    $query = ("SELECT username, password, active FROM *DATABASE* WHERE username='".$username."' AND password='".$password."' AND active='1'") or die(mysql_error());
    $result = mysqli_query($mysqli, $query);
    $match  = mysqli_num_rows($result);

    if($match > 0){
       //Directing to account page
       header("Location:account.php");

       //User info search
       $queryID = ("SELECT id FROM *DATABASE* WHERE username='".$username."' AND password='".$password."' AND active='1'") or die(mysql_error());
       $resultID = mysqli_query($mysqli, $queryID);
       $id = mysqli_fetch_assoc($resultID);

       $queryNAME = ("SELECT name FROM *DATABASE* WHERE username='".$username."' AND password='".$password."' AND active='1'") or die(mysql_error());
       $resultNAME = mysqli_query($mysqli, $queryNAME);
       $naam = mysqli_fetch_assoc($resultNAME);

       //Session user info
       $_SESSION['id'] = $id;
       $_SESSION['naam'] = $naam;

这只是验证器的一小部分,但正如您所见,它会重定向到帐户页面(这很好),并且应该为在数据库中找到的名称和 ID 创建会话。

然后帐户页面再次接收会话并将其转换为具有以下代码的变量;

  //SESSIONS
  require 'session.php'; //CHECKS IF SESSION IS VALID, IF NOT: RETURN TO HOME

  //VARIABLES
  if (isset($_SESSION['naam']) && isset($_SESSION['id']) && isset($_SESSION['username'])) {
    print_r($_SESSION['naam']); //Debug purposes
    print_r($_SESSION['id']);
    print_r($_SESSION['username']);
    $id = implode($_SESSION['id']); //Convert to String
    $naam = implode($_SESSION['naam']);
    $username = ($_SESSION['username']); //Already a string, this was a variable used in the POST form
    var_dump($naam);
  } else {
    echo "No sessions"; //Debug purposes
  }

当我在我的帐户页面上回显用户名时,它会完美地显示用户名,我认为这是因为用户名一直都是以字符串开头的。

然而,当我回显 naam 变量时,即使数据库中的 naam 只是管理员,它也会显示“AdministratorAdministrator”。

这是我的 print_r 结果:

Array ( [0] => Administrator [name] => Administrator )
Array ( [0] => 23 [id] => 23 ) 
admin
string(26) "AdministratorAdministrator"

关于如何确保每当我回显 naam 变量时,它只显示管理员一次,而不是两次的任何线索?谢谢!

【问题讨论】:

  • //header("Location:account.php");// 在会话中存储值之前重定向!!!,重定向应该在代码的最后一行。也使用退出;重定向后
  • 哇!这是多么尴尬,非常感谢:)
  • 你也不能混用不同的mysql api。
  • 这对 SQL 注入开放,使用准备好的语句。另外,不要存储纯文本密码,使用password_hash()
  • 您的or die(mysql_error() 代码正在设置一个字符串值,通常它们应该在mysqli_query() 调用中(如果确实如此的话)并且正如@FunkFortyNiner 指出的那样它应该是mysqli_error($mysqli)

标签: php mysql arrays session login


【解决方案1】:

您只需要在 Session 中保存您需要的数据

$_SESSION['id'] = $id['id'];
$_SESSION['naam'] = $naam['name'];

在您的情况下,您将保存函数 mysqli_fetch_assoc 的整个结果,这是一个数组,您可以从文档中看到:

http://php.net/manual/en/mysqli-result.fetch-assoc.php

【讨论】:

    猜你喜欢
    • 2011-07-08
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多