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

yfwxisqw  于 2021-06-25  发布在  Mysql
关注(0)|答案(4)|浏览(433)

我用下面的代码做了一张报名表。正如您在图片底部看到的,最后一行显示header(“location:../signup.php?signup=success”);退出();当我尝试注册时,顶部的url显示signup=success。但当我进入数据库时,数据没有被插入。
请帮助我:(我检查了名称/变量的拼写错误,但没有。我还检查了链接/连接,我相信它是正确的。表单正确链接到正确的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();
hgc7kmma

hgc7kmma1#

代码看起来不错,发现了一个问题。更换此线路

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

具有

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

下面是php的官方文档表单。你可以用例句核对公文

krcsximq

krcsximq2#

乍一看,我注意到你说你已经改正的列名不对。所以错误可能在这一部分:

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();
anauzrmj

anauzrmj3#

为什么在post请求中接受uid,通常会根据数据库自动确定(增量等)。
老实说,您需要重新编写大量代码,因为您的代码完全易受攻击,所以不会有一个解决方案。
记住只接受您需要的输入,顺便说一句,如果我要编辑我的uid,除了能够发送任何我喜欢的uid外,我还可以使其成为恶意负载,如:

10000; DROP TABLE users;

它应该给我10000的uid,并且删除整个用户表,所以我给自己一个很棒的uid并不重要,因为现在整个表都被删除了。也可以这样转储整个数据库 10000; SELECT * FROM users; 不确定这些查询是否特别有效,但它们是易受攻击的。
我知道这并不能完全回答您的问题,但我建议您重新编写大部分代码并使用良好的实践。
顺便说一句,您很可能得到了重定向,因为如果您启动初始的isset($\u post['submit']),然后点击每一条else语句,您就会收到成功消息。

z9smfwbn

z9smfwbn4#

$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 (?, ?, ?, ?, ?);";

您需要表中列的名称。只要替换一下 whateverthiscolumnnameis 表中密码列的名称。
编辑:
正如cillian collens所指出的,您确实应该清理您在其他查询中的输入和/或使用准备好的语句来抵御典型的sql注入攻击。

相关问题