使用PDO将数据添加到MySQL数据库不起作用

时间:2018-08-19 04:20:31

标签: php mysql pdo

我正在尝试重新学习我正在从事的当前应用程序项目的Web开发技能。我已经验证了我的PHP后端正在从前端的HTML / JS表单获取传递给它的数据。但是,当我提交表格时,网页没有提及任何错误。一切看起来都很好,直到我查看数据库并且没有添加任何内容为止。在数据添加成功或添加失败之后,我看不到最后的回声。

register.php

<?php
    include "conn.php";

    if(empty($_POST['firstName']) || empty($_POST['lastName']) || empty($_POST['email']) || empty($_POST['password']) || empty($_POST['pin'])) {
        echo "<br>Error: Please fill out all required fields.";
    } else if($_POST['password'] != $_POST['confirmPassword']) {
        echo "<br>Error: Passwords do not match.";
    } else if($_POST['pin'] != $_POST['confirmPin']) {
        echo "<br>Error: Pin codes do not match.";
    } else if(strlen($_POST['password']) > 20 || strlen($_POST['password']) < 8) {
        echo "<br>Error: Passwords must be between 8 and 20 characters in length.";
    } else if(strlen($_POST['pin']) != 4) {
        echo "<br>Error: Pin codes must be a maximum of 4 characters.";
    } else if(strlen($_POST['firstName']) > 50 && strlen($_POST['lastName']) > 50 && strlen($_POST['email']) > 50) {
        echo "<br>Error: First Name, Last Name, and E-mail fields must be shorter than 50 characters in length.";
    } else if(!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
        echo "<br>Error: You must use a valid e-mail address.";
    } else {
        echo "<br><br>Successfully checked all data!";

        $options = [
            'cost' => 12,
        ];
        $hash = password_hash($_POST['password'], PASSWORD_BCRYPT, $options);
        $numericPin = (int)$_POST['pin'];
        $currentDateTime = date("Y-m-d H:i:s");

        $stmt = $conn->prepare("INSERT INTO account (firstName, lastName, email, password, pin, registerDate) VALUES (:firstName, :lastName, :email, :password, :pin, :registerDate)");
        $stmt->bindParam(":firstName", $_POST['firstName']);
        $stmt->bindParam(":lastName", $_POST['lastName']);
        $stmt->bindParam(":email", $_POST['email']);
        $stmt->bindParam(":password", $hash);
        $stmt->bindParam(":pin", $numericPin);
        $stmt->bindParam(":registerdate", $currentDateTime);

        if($stmt->execute()) {
            echo "<br><br>Data added successfully";
        } else {
            echo "<br><br>Failed to add data";
        }
    }
?>

MySQL数据库结构: MySQL DB Structure Picture Link

2 个答案:

答案 0 :(得分:1)

您的占位符拼写错误

":registerdate"

您在SQL中拥有此

 $stmt = $conn->prepare("INSERT INTO account (firstName, lastName, email, password, pin, registerDate) VALUES (:firstName, :lastName, :email, :password, :pin, :registerDate)");

特别是:registerDate:registerdate,此处的大小写很重要。

其他一些事情:

include更改为require,请问您自己脚本在没有脚本的情况下是否可以运行,好吧。然后它必须是require。找不到文件时,包含不会给您错误。

更改验证以帮助最终用户

 $errors = [];
if(empty($_POST['firstName']) || empty($_POST['lastName']) || empty($_POST['email']) || empty($_POST['password']) || empty($_POST['pin']))
    $errors[] ="<br>Error: Please fill out all required fields.";

if($_POST['password'] != $_POST['confirmPassword'])
   $errors[] ="<br>Error: Passwords do not match.";

if($_POST['pin'] != $_POST['confirmPin'])  ....

然后计算数组

if(count($errors) > 0 ){
    echo implode("\n", $errors);
}else{
    //--- do insert

}

这样,您可以一次向他们显示所有错误。否则,他们必须提交,更正,提交,更正等等。。。这将非常令人沮丧,而您要做的最后一件事就是使您的用户感到沮丧,他们可能会离开。我拥有并将离开的站点不会立即向我显示错误,我宁愿找到一个站点,该站点提供我想要的正确构建的内容,然后处理甚至无法进行正确验证的站点。这让我想知道该网站上还有什么不值得信任的。 (但这就是我,我在这件事上有经验)。

命名约定(意见): 我总是将DB字段的名称全部小写,并用_代替空格。这样可以减少很多这类问题,因为是registerdateregisterDateRegisterDate

我还有其他一些与表名有关的事情,但是我不会为您烦恼。

干杯!

答案 1 :(得分:0)

因此,只需在此处添加答案即可,这很简单。我在语句执行的位置(脚本快死了)附近添加了一个try / catch块。发现存在某种重复的占位符用法或不匹配。然后我仔细检查了占位符,发现:registerDate被绑定为:registerdate。固定和繁荣,添加到数据库。谢谢大家的帮助!