Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么数据没有插入数据库?_Php_Mysql_Mysqli_Wamp - Fatal编程技术网

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

Php 为什么数据没有插入数据库?,php,mysql,mysqli,wamp,Php,Mysql,Mysqli,Wamp,我用下面的代码做了一个注册表格。如图底部所示,最后一行显示headerLocation:../signup.php?signup=success;出口当我尝试注册时,顶部的url显示signup=success。但是当我进入数据库时,数据没有被插入 请帮助我:我检查了名称/变量的拼写错误,但没有。我还检查了链接/连接,我相信它是正确的。表单正确链接到正确的php文件,如下所示 <?php if(isset($_POST['submit'])) { include_once 'd

我用下面的代码做了一个注册表格。如图底部所示,最后一行显示headerLocation:../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();

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

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

下面是php的官方文档表单。你可以查一下

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

$sql = "INSERT INTO users (user_first, user_last, user_email, 
        user_uid, whateverthiscolumnnameis) 
         VALUES (?, ?, ?, ?, ?);";
您需要在此处输入表中列的名称。只需用表中密码列的名称替换WhateVerthisColumnName即可

编辑:


正如Cillian Collens指出的那样,您确实应该清理您在其他查询中的输入和/或使用准备好的语句来避开经典的

为什么在POST请求中接受uid,通常您会根据数据库增量自动确定,等等

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

记住只接受您需要的输入,顺便说一句,如果我要编辑我的UID,除了可以发送任何我喜欢的UID外,我还可以将其作为恶意负载,如:

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

我知道这并不能完全回答您的问题,但我建议您重新编写大部分代码并使用良好的实践


顺便说一句,你很可能得到了重定向,因为如果你启动初始的isset$\u 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();

请在问题中以文本形式发布您的代码,为什么要将哈希密码作为列名发布?@FedericoklezCulloca,对此表示抱歉。我已经更改了,你能帮我吗?添加signup.php中的代码只是指出,即使$hashedPwd包含列名,也不能在列名周围使用单引号。您需要改为使用反勾号。sssd中没有足够的字符来说明所有参数。是否签入正式文档?我发现sssd有5个参数$first、$last、$email、$uid、$hashedPwd,但您只为变量类型提供了4个字符的sssd。仅供参考,不是我做了否决投票。“我不会为这么一个小小的错误去做的。”勒诺沃根诺维亚很高兴知道!如果某个答案对你有效,请将其标记为已接受,以便阅读该问题的其他人知道你的问题已成功回答。为欢呼声干杯。“我不喜欢在回答中大肆宣扬安全性,因为这不是他所期望的答案,但我觉得为了减轻SQL注入攻击,必须注意这点。”CillianCollins同意。安全是我们大家都应该高度关注的事情是的,我认为当人们学习语言,特别是像PHP这样的语言时,养成使用良好安全实践的习惯是很重要的。顺便说一句,mysqli_查询不允许在一个查询中使用多个语句,因此我发布的示例可能不起作用,具体取决于MySQL的版本,但这并不意味着不可能使用其他攻击手段。您仍然可以使用更复杂的负载转储数据库。@JustinPearce,我不明白。我刚开始学这个。我想我已经用我发布的代码使用了准备好的语句。我只是按照youtube教程播放列表上的一些说明来保护我的数据库不受sql注入的影响。我把它命名为user_uid,但实际上是为了获取用户名。对不起,这让人很困惑。但是非常感谢!我从你说的话中学到了一些东西:啊,你向他们请求用户名是有道理的,我假设你接受MySQL表中主键的POST输入,这是一种不好的做法,因为如果是这样的话,它将不是唯一的标识符。无论如何,您仍然需要对其进行消毒,请随时将经过消毒的代码发送给我,我会查看它是否易受攻击。
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();