【问题标题】:Why isn´t my sql-stament inserting data into my database? [duplicate]为什么我的 sql-stament 没有将数据插入到我的数据库中? [复制]
【发布时间】:2019-09-27 08:53:26
【问题描述】:

最近我使用 php 和 mysql 数据库构建了一个登录系统。我手动输入了所有用户,所以我接下来要做的是建立一个注册功能。但是由于某种原因,数据并没有出现在我的数据库中。

这是我的注册页面:

<div class="login">
    <div class="background">
        <img src="../pic/skyscrapers.jpg"></img>
        <div class="logbox">
            <form class="form-register" action="../func/func_register3.php" method="POST">
                <h1>Registrierung</h1>
                <div class="user">
                    Choose your username:<br>
                    <label for="frm_user">username</label>
                    <input type="text" name="frm_user" id="frm_user" placeholder="Benutzername" required autofocus>
                    <br>
                    <br>
                    Choose your password:<br>
                    <label for="frm_pass">Password</label>
                    <input type="password" name="frm_pass" id="frm_pass" placeholder="Password" required>
                    <br>
                    <br>
                    Repeat your password:<br>
                    <label for="frm_pass_rep">Repetition</label>
                    <input type="password" name="frm_pass_rep" placeholder="Password"><br>
                    <br>
                    <br>
                </div>
                <button name="btn_register" id="btn_register" type="submit">register</button>
            </form>
        </div>
    </div>
</div>

这是带有寄存器逻辑的 php 文件:

<?php

if (isset($_POST['btn_register'])) {
        include("../inc/db_connect.php");

        //Form fields -> php-variables
        $frm_user = $_POST['frm_user'];
        $frm_pass = $_POST['frm_pass'];
        $frm_pass_rep = $_POST['frm_pass_rep'];

        $stmt = $dbh->prepare("INSERT INTO tbl_users (username, password) VALUES (:frm_user, :frm_pass)");
        $stmt->bindParam(':frm_user', $frm_user);
        $stmt->bindParam(':frm_pass', $frm_pass);

    if ($stmt->execute() == true):
        echo "All good!";
        else:
        {
            echo "The statement has not been executed!";
            echo "<br>";
            echo print_r($stmt->errorInfo, true);
            echo "<br>";
            echo $stmt->errorCode();
        }
        endif;
}

输出是“语句尚未执行!23000”,这是真的,没有数据进入数据库...我已经尝试过使用不同类型的浏览器并使用另一个数据库。登录工作非常好,两个文件,一个带有 login-logik 的文件以及一个带有 register-logik 的文件,都使用相同的文件连接到数据库。我会非常感谢有关如何解决此问题的各种想法。

【问题讨论】:

  • 永远不要存储纯文本密码!请使用 PHP 的built-in functions 来处理密码安全问题。如果您使用低于 5.5 的 PHP 版本,您可以使用 password_hash() compatibility pack在散列之前不需要escape passwords 或对它们使用任何其他清理机制。这样做会更改密码并导致不必要的额外编码。
  • 你检查过你的错误日志吗?
  • 您的$stmt 可能没问题,但您实际上并没有检查$stmt-&gt;execute() 上的返回值
  • 你的陈述是一个对象。在查询失败后,它不会神奇地转换为布尔值false。是的,你需要检查execute()的返回值。
  • echo "The statement has not been executed: " . print_r($stmt-&gt;errorInfo, true); 获取相关的实际错误

标签: php mysql database pdo


【解决方案1】:

我猜你的 id 列是自动增量的。您应该将其从查询中删除:

$stmt = $dbh->prepare("INSERT INTO tbl_users (username, password) VALUES (:frm_user, :frm_pass)");

或者如果不是自动增量,或者你想给它一个值,你应该为它插入一个值:

$stmt = $dbh->prepare("INSERT INTO tbl_users (id, username, password) VALUES (:id,:frm_user, :frm_pass)");

【讨论】:

  • 我会建议您不要回答有这么多漏洞的问题。答案可能是正确的,但可能会付出一些努力以使其安全。
  • 此答案不再反映帖子内容。查询中的任何地方都没有引用 ID。
  • @nacho 是的,id 列是自动增量的。我刚刚删除了它,又试了一次,但得到了相同的结果……为了给你关于表格的更多信息,有四列。 int(11) 类型的“id”是主键并自动递增,“username”是 varchar(25) 类型,“password”是 varchar(22) 类型,“admin”是 tinyint(1)。管理员默认设置为 0,这意味着用户没有管理员权限。
  • “我猜” - 不要猜。
猜你喜欢
  • 2019-05-03
  • 2013-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多