Php 创建新用户并尝试获取会话id的用户id,但获取第一个id

Php 创建新用户并尝试获取会话id的用户id,但获取第一个id,php,Php,我正在尝试修复我在PHP中的注册,当我创建一个新用户时,我的用户id立即成为第一个可用的用户,如果我有100个用户,我创建了一个新用户,用户id应该是101,它在数据库中,但在我的会话中,它变成了1,如果我删除第一个用户,并且唯一可用的用户id为2,它变成了2。我的代码有什么问题?似乎无法调试它 <?php $username = $_POST['username']; $email = $_POST['email']; $pass = $_POST['pas

我正在尝试修复我在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

新代码

<?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并在select查询中使用,如下所示:-

$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 = "SELECT user_id FROM users WHERE email = '".$email."' ";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    // store the user_id of the person newly registered to $_SESSION['user_id]
    while($row = $result->fetch_assoc()) {
        $_SESSION['user_id] = $row["user_id"];
    }
    header('Location:dashboard.php');
} else {
    echo "No user found!";
}

希望有帮助

我已经做了一个准备好的声明版本+小的修改。 您应该使用准备好的语句来防止sql注入

此外,我强烈建议不要将密码存储为纯文本。Php提供了一种简单而安全的密码存储方法:这就是您所需要的:

<?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 email FROM users WHERE email=?');
        $stmt_email_test->bind_param('s',$email); // 's' for one string
        $stmt_email_test->execute();
        $stmt_email_test->bind_result($email_test);
        $stmt_email_test->close();

        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 (name, email, pass) values (?,?,?)");
            $stmt->bind_param('sss', $username, $email, $pass); // 'sss' for 3 strings
            $stmt->execute();

            // Get the new user_id
            $new_user_id = $stmt->insert_id;
            $stmt->close();

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

        }
    }

 ?>
编辑将$con参数添加到mysqli_prepare

编辑固定的sql错误


编辑添加的接近语句

$test=mysqli\u query$con,从用户中选择*

在这一行中,您必须传递电子邮件或电子邮件和密码才能获得相应的id


$test=mysqli\u query$con,从使用电子邮件=.$email的用户中选择*


这对你有用。。只需将where条件添加到该查询中,即可检索特定的用户详细信息。

这也会干扰我检查电子邮件是否已发送use@JohnDoesCode它可能无法开箱即用,然而,在你的问题中,你只是分配了第一个可以从数据库中检索到的用户——这就是为什么当你删除了id=1的用户后,id变成了2。这个答案中提供的代码向您展示了如何检索刚刚创建的用户的id,以便您可以将其分配给$_SESSION['user_id'],这比只抓取第一个可以找到的用户更有意义。我如何做仍然不会创建这样的会话,user_id=nullI收到此错误致命错误:未捕获错误:在C:\xampp\htdocs\validatesignup.php中调用布尔值上的成员函数bind_param:16堆栈跟踪:在C:\xampp\htdocs\validatesignup.php的第行抛出0{main}16@JohnDoesCode我的错,忘了$con参数。修正了。我没有,我也修正了,在我这边,它在第16行给了我一个致命的错误变量和表有错误的名称,但是现在我在第26行遇到这个错误致命的错误:未捕获的错误:在C:\xampp\htdocs\validatesignup.php:26堆栈跟踪:0{main}中调用一个成员函数bind_param on boolean在这种情况下,sql中肯定仍然存在错误的列名或表名。我不知道您的表结构是电子邮件还是使用电子邮件或用户电子邮件只是根据创建的用户进行更改,但会话没有获得用户id我知道这一点,因为要查看下一页,您需要会话上的用户id,它会重新指向登录页设置会话后,您必须将用户重定向到仪表板变量您可以在if条件下,在while循环之外执行。var_dump$stmt->error;必须是var_dump$con->error;tring52命令不同步;现在无法运行此命令$stmt\u email\u test->close;$stmt\u email\u test->bind\u result$email\u test之后;现在我遇到了致命错误:未捕获错误:对C:\xampp\htdocs\validatesignup.php中未定义的函数mysql\u insert\u id的调用:34堆栈跟踪:在C:\xampp\htdocs\validatesignup.php第34行抛出的0{main}必须是mysqli
<?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 email FROM users WHERE email=?');
        $stmt_email_test->bind_param('s',$email); // 's' for one string
        $stmt_email_test->execute();
        $stmt_email_test->bind_result($email_test);
        $stmt_email_test->close();

        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 (name, email, pass) values (?,?,?)");
            $stmt->bind_param('sss', $username, $email, $pass); // 'sss' for 3 strings
            $stmt->execute();

            // Get the new user_id
            $new_user_id = $stmt->insert_id;
            $stmt->close();

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

        }
    }

 ?>