【问题标题】:Why data isn't showing php mysql为什么数据没有显示 php mysql
【发布时间】:2019-02-20 15:00:57
【问题描述】:

尝试在 index.php 上显示数据,用户名运行良好,电子邮件未显示。

server.php

$query = "SELECT * FROM users WHERE username='$username' AND password='$password'";
$results = mysqli_query($db, $query);
if (mysqli_num_rows($results) == 1) {


  $_SESSION['email'] = $email;
  $_SESSION['username'] = $username;
  $_SESSION['success'] = "You are now logged in";
  header('location: index.php');

index.php

<?php
// Echo session variables that were set on previous page
echo "Your email is: " . $_SESSION['email'] . "<br>";
echo "Your username is: " . $_SESSION['username'] . "";
?>

【问题讨论】:

    标签: php mysql database session


    【解决方案1】:

    您在查询数据后没有获取结果。使用mysqli_fetch_assoc

    注意,我已将 mysqli_real_escape_string 应用于您的 WHERE 条件参数,以解决 SQL 注入相关问题。 Although it is not a fool-proof solution!

    更改如下:

    $query = "SELECT * 
              FROM users 
              WHERE username = '" . mysqli_real_escape_string($db, $username) . 
              " AND password = '" . mysqli_real_escape_string($db, $password) . "'";
    $results = mysqli_query($db, $query);
    if (mysqli_num_rows($results) == 1) {
    
      $row = mysqli_fetch_assoc($db, $results);
      $_SESSION['email'] = $row['email'];
      $_SESSION['username'] =  $row['username'];
      $_SESSION['success'] = "You are now logged in";
    

    请阅读how to prevent SQL injection related issues using Prepared Statements

    【讨论】:

    • mysqli_real_escape_string() 不会解决 SQL 注入问题。为此,您必须使用prepared statements
    • @Zeke 我已经添加了那个位(在您发表评论之前正在编辑)
    • @Zeke 错字! :-)
    • 我仍然认为mysqli_real_escape_string() 甚至不应该被提及,因为它不能解决任何问题。如果您要推荐准备好的语句,那么只需这样写即可。但至少你回答了这个问题。我还要确保选择了数据库,因为我在代码中的任何地方都看不到 mysqli_select_db()(或 mysqli::select_db()),而且 SQL 查询也没有指定任何数据库。
    • 警告:mysqli_real_escape_string() 只需要 2 个参数,1 个在 C:\xampp2\htdocs\server.php 第 81 行给出 警告:mysqli_real_escape_string() 只需要 2 个参数,1 个在 C:\第 82 行的 xampp2\htdocs\server.php 警告:mysqli_num_rows() 期望参数 1 为 mysqli_result,布尔值在第 84 行的 C:\xampp2\htdocs\server.php 中给出
    【解决方案2】:

    这是完整代码,出现$username(不同用户测试)

    if (isset($_POST['login_user'])) {
      $username = mysqli_real_escape_string($db, $_POST['username']);
      $password = mysqli_real_escape_string($db, $_POST['password']);
    
      if (empty($username)) {
        array_push($errors, "Username is required");
      }
      if (empty($password)) {
        array_push($errors, "Password is required");
      }
    
      if (count($errors) == 0) {
        $password = md5($password);
        $query = "SELECT * FROM users WHERE username='$username' AND password='$password'";
        $results = mysqli_query($db, $query);
        if (mysqli_num_rows($results) == 1) {
    
    
          $_SESSION['email'] = $email;
          $_SESSION['username'] = $username;
          $_SESSION['success'] = "You are now logged in";
          header('location: index.php');
        }else {
            array_push($errors, "Wrong username or password combination");
        }
      }
    }
    

    【讨论】:

    • 这是您的解决方案吗?还是对问题进行了编辑?
    【解决方案3】:

    您没有从结果中收到电子邮件,因此您的 $email 变量为空。如果电子邮件在您的用户表中,则需要从结果中分配它。

    【讨论】:

    • 你至少应该展示如何用一些代码来解决它。此外,不仅是$email$username 也是如此。您的回答似乎不完整且含糊不清。
    • 从问题中,“用户名运行良好,电子邮件未显示。”用户名值很可能来自表单输入值,因此它不为空。我在其他答案中包含了代码,但认为这并不总是最好的答案。通常最好自己解决问题,必要时提供一些帮助,但不要交给完整的解决方案。至少我更喜欢这样回答我的问题,有一些方向,但不是整个解决方案。我还意识到,有些问题可能来自在这里为他们完成作业的学生。
    • 我最好考虑聘请编码人员来完成我的项目。
    • @PHP 新手,好吧,你原来的问题的答案在上面 Madhur 的答案中,所以你不需要花钱。我想那是个玩笑。
    • 我理解你的意思,但用户名的工作原因不同,而不是因为 SQL 查询。这就是区别。所以,至少应该提到这一点。我的意思是,查询选择了所有内容,所以一定有原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    相关资源
    最近更新 更多