为什么数据没有插入到数据库中?

Why is the data not inserted into the database?

我用下面的代码做了一个注册表单。正如您在图片底部看到的,最后一行是 header("Location: ../signup.php?signup=success");出口();当我尝试注册时,顶部的 url 显示注册=成功。但是当我进入我的数据库时,没有插入数据。

请帮帮我 :( 我检查了 name/variable 的任何拼写错误,但有 none。我还检查了 linking/connections,我相信它是正确的。表单已正确链接到右侧 php 文件,该文件位于此处。

<?php

if(isset($_POST['submit'])) {

    include_once 'dbh.inc.php';

    $first = $_POST['first'];
    $last = $_POST['last'];
    $email = $_POST['email'];
    $uid = $_POST['uid'];
    $pwd = $_POST['pwd'];

    if (empty($first) || empty($last) || empty($email) || empty($uid) || empty($pwd)) {
        header("Location: ../signup.php?signup=empty"); exit();
    }
    else {
        if (!preg_match("/^[a-zA-z]*$/", $first) || !preg_match("/^[a-zA-z]*$/", $last)) {
            header("Location: ../signup.php?signup=flnameinvalid"); exit();
        }
        else {
            if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
                header("Location: ../signup.php?signup=emailinvalid"); exit();
            }
            else{
                $mysql = "SELECT * FROM users WHERE user_uid='uid'";
                $result = mysqli_query($conn, $mysql);
                $resultCheck = mysqli_num_rows($result);

                if ($resultCheck > 0) {
                    header("Location: ../signup.php?signup=uidtaken"); exit();
                }
                else {
                    $hashedPwd = password_hash($pwd, PASSWORD_DEFAULT);
                    $sql = "INSERT INTO users (user_first, user_last, user_email, user_uid, '$hashedPwd') VALUES (?, ?, ?, ?, ?);";
                    $stmt = mysqli_stmt_init($conn);

                    if (!mysqli_stmt_prepare ($stmt, $sql)){
                        echo "SQL error!";
                    }
                    else {
                        mysqli_stmt_bind_param ($stmt, "sssss", $first, $last, $email, $uid, $hashedPwd);
                        mysqli_stmt_execute ($stmt);
                    }
                    header("Location: ../signup.php?signup=success"); exit();

代码看起来不错,发现一个问题。 替换这一行

 mysqli_stmt_bind_param ($stmt, "sssss", $first, $last, $email, $uid, $hashedPwd);

 mysqli_stmt_bind_param ($stmt, "sssd", $first, $last, $email, $uid, $hashedPwd);

以下是官方文档表格php。你可以检查 official doc with example

$sql = "INSERT INTO users (user_first, user_last, user_email, user_uid, '$hashedPwd') 
         VALUES (?, ?, ?, ?, ?);";

在您的 SQL 语句中,您将密码的列名称设置为散列密码的值。这将导致 SQL 查询失败。

$sql = "INSERT INTO users (user_first, user_last, user_email, 
        user_uid, whateverthiscolumnnameis) 
         VALUES (?, ?, ?, ?, ?);";

您需要此处 table 中的列名称。只需将 whateverthiscolumnnameis 替换为 table.

中密码列的名称

编辑:

正如 Cillian Collens 指出的那样,您确实应该在您进行的其他查询中清理输入 and/or 使用准备好的语句来避免经典 SQL injection attacks.

为什么要在 POST 请求中接受 uid,通常你会根据你的数据库(增量等)自动确定。

老实说,您需要重新编写大量代码,不会有一种解决方案,因为您的代码完全容易受到攻击。

记住只接受你需要的输入,顺便说一下,如果我要编辑我的 UID,除了能够发送我喜欢的任何 UID 之外,我还可以将它变成恶意负载,比如:

10000; DROP TABLE users;

哪个,应该给我 10,000 的 UID 并删除整个 table 用户,所以我只是给自己一个很棒的 UID 并不重要,因为现在整个 table 被删除。也可以通过执行类似 10000; SELECT * FROM users; 之类的操作以这种方式转储整个数据库。不确定这些查询是否特别有效,但它们很容易受到攻击。

我知道这并不能完全回答您的问题,但我建议您重写大部分代码并采用良好做法。

顺便说一句,您很可能会获得该重定向,因为如果您启动初始 isset($_POST['submit']) 然后点击每一个 else 语句,您会得到成功消息。

乍一看我注意到你说你已经更正的错误列名。所以错误大概在这部分:

if (!mysqli_stmt_prepare ($stmt, $sql)){
    echo "SQL error!";
} else {
    mysqli_stmt_bind_param ($stmt, "sssss", $first, $last, $email, $uid, $hashedPwd);
    mysqli_stmt_execute ($stmt);
}

试试这个:

if (mysqli_stmt_prepare ($stmt, $sql)){
     mysqli_stmt_bind_param ($stmt, "sssss", $first, $last, $email, $uid, $hashedPwd);
     mysqli_stmt_execute ($stmt);
     header("Location: ../signup.php?signup=success");
} else {
     echo "SQL error!";
}
exit();