首页 > 解决方案 > 创建一个新用户并尝试获取会话 id 的 user_id 但获取第一个 id PHP

问题描述

我正在尝试修复我在 PHP 中的注册,当我创建一个新用户时,我的用户 ID 立即成为第一个可用的用户,如果我有 100 个用户并且我创建了一个新用户,那么用户 ID 应该是 101,它在数据库,但在我的会话中它变为 1,如果我删除第一个用户并且唯一可用的用户的 id 为 2,它变为 2。我的代码有什么问题?似乎无法调试它。

<?php 

    $username = $_POST['username'];
    $email =  $_POST['email'];
    $pass = $_POST['pass'];
    $pass2 = $_POST['pass2'];


    $con = mysqli_connect("localhost", "root", "", "smarttime");
    $query = mysqli_query($con,"INSERT INTO users (use_name, use_email, use_pass) values ('$username', '$email', '$pass')");

    $test = mysqli_query($con,"SELECT * from users");

    $row = mysqli_fetch_array($test); 


    if(empty($username) || empty($pass) || empty($email) || empty($pass2))
    {
        header("Location:signup.php");
    }else{
        if($row['use_email'] == $email){
                    header("Location:login.php");
        }else{
                $query;
                session_start();
                $_SESSION['user_id'] = $row['use_id'];
                $_SESSION['nome'] = $row['use_name'];
                header('Location:logged.php');
                exit();

        }
    }

 ?>

html

<!DOCTYPE html>

<html lang="en">





  <head>
    <script src="//code.jquery.com/jquery-1.11.1.min.js"></script>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <title>SmartTime</title>

    <!-- Bootstrap -->
    <link href="css/bootstrap.min.css" rel="stylesheet">
    <link href="css\main.css" rel="stylesheet">

    <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <!-- Include all compiled plugins (below), or include individual files as needed -->
    <script src="js/bootstrap.min.js"></script>

    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
      <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
      <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
  </head>



  <body>  

      <nav class="navbar navbar-expand-lg navbar-light bg-light">
  <a class="navbar-brand" >SmartTime</a>
  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarText" aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">
    <span class="navbar-toggler-icon"></span>
  </button>
  <div class="collapse navbar-collapse" id="navbarText">
    <ul class="navbar-nav mr-auto">
      <li class="nav-item active">
        <a class="nav-link" href="index.php">Home <span class="sr-only">(current)</span></a>
      </li>
    </ul>
    <span class="navbar-text">
    <a href="/login.php" >Login</a>&emsp;
    <a href="/signup.php" >Sign Up</a>
    </span>
  </div>
</nav>

    <div class="container">
        <div class="card card-container">
            <!-- <img class="profile-img-card" src="//lh3.googleusercontent.com/-6V8xOA6M7BA/AAAAAAAAAAI/AAAAAAAAAAA/rzlHcD0KYwo/photo.jpg?sz=120" alt="" /> -->
            <img id="profile-img" class="profile-img-card" src="images/Doge.png" />
            <p id="profile-name" class="profile-name-card"></p>
            <form action="validatesignup.php" method="post" class="form-signin">
                <span id="reauth-email" class="reauth-email"></span>
                <input type="text" id="inputEmail" class="form-control" name="username" placeholder="Username" required>
                <input type="email" id="inputEmail" class="form-control" name="email" placeholder="Email address" required>
                <input type="password" id="inputPassword" class="form-control" name="pass" placeholder="Password" required>
                <input type="password" id="inputPassword" class="form-control" name="pass2" placeholder="Confirm Password" required>
                <button class="btn btn-lg btn-primary btn-block btn-signin" type="submit">Login</button>
            </form><!-- /form -->
            <a href="login.php" class="forgot-password">
                Already have an account? Sign in!
            </a>
        </div><!-- /card-container -->
    </div><!-- /container -->

    </body>
  </html>

新代码

<?php 

    $username = $_POST['username'];
    $email =  $_POST['email'];
    $pass = $_POST['pass'];
    $pass2 = $_POST['pass2'];


    $con = mysqli_connect("localhost", "root", "", "smarttime");

    // Insufficient input
    if(empty($username) || empty($pass) || empty($email) || empty($pass2)) {
        header("Location:signup.php?msg=please+fill+all");
    } else {
        $stmt_email_test = mysqli_prepare($con, 'SELECT use_email FROM users WHERE use_email=?');
        $stmt_email_test->bind_param('s',$email); // 's' for one string
        $stmt_email_test->execute();
        $stmt_email_test->bind_result($email_test);

        if($email_test != null) { // Email exists
            header("Location:login.php");
        } else if( $pass != $pass2 ) { // Check if password repetition is ok
            header("Location:signup.php?msg=passwords+do+not+match");
        } else { // Everything is fine, do insert and fill session
            $stmt = mysqli_prepare($con, "INSERT INTO users (use_name, use_email, use_pass) values (?,?,?)");
            var_dump($stmt->error);
            $stmt->bind_param('sss', $username, $email, $pass); // 'sss' for 3 strings
            $stmt->execute();


            // Get the new user_id
            $new_user_id = mysql_insert_id();

            // Fill Session
            $_SESSION['user_id'] = $new_user_id;
            $_SESSION['name'] = $username;
            header('Location:logged.php');
            exit();

        }
    }

 ?>

标签: php

解决方案


用于mysqli_insert_id获取最后一个 id 并在选择查询中使用,如下所示:-

$query = mysqli_query($con,"INSERT INTO users (use_name, use_email, use_pass) values 
('$username', '$email', '$pass')");
$id = mysqli_insert_id($con);

$res = mysqli_query($con,"SELECT * from users WHERE user_id={$id}");
if($row = mysqli_fetch_assoc($res)) {
 $_SESSION['user_id'] = $row['user_id'];
}

推荐阅读