php - 创建一个新用户并尝试获取会话 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> 
<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();
}
}
?>
解决方案
用于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'];
}
推荐阅读
- sql-server - 为什么“DEFAULT”会导致语法问题
- javascript - 无法在第三方 API 上上传文件
- java - 为什么我的结果与我想要的不同?
- ffmpeg - 添加启用时间条件时,FFmpeg覆盖.mov不起作用
- html - 用于提交表单按钮的 Jquery 不起作用
- c# - 将 32bpp 转换为 8bpp UWP
- python - 在 python 3.8 中理解平台库输出的歧义
- python - 根据字符串中定义的条件填充新列
- android - Android Kotlin coroutines not working as I expected
- java - 在 lambda、方法引用和具有 Function<> 返回值的方法之间进行选择时要考虑的显着差异