【问题标题】:Adding data to MySQL DB with PDO not working使用 PDO 将数据添加到 MySQL DB 不起作用
【发布时间】:2018-08-19 04:20:30
【问题描述】:

我正在尝试为我正在处理的当前应用程序项目重新学习我的 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

【问题讨论】:

  • 您真的看到Failed to add data 打印了吗?如果不是,那你怎么知道插入失败?
  • 因为当我查看我的数据库表时,其中有 0 行。但是并没有说添加数据失败,也没有说数据添加成功。
  • 那么你的代码可能在插入调用之前就失败了。你应该检查你的连接逻辑。
  • 连接成功完成。 conn.php 中有一个成功通过检查的回声。如果我在文件末尾添加回声,它不会执行。如果我在执行的 if($stmt->execute()) { 行之前运行它。所以它在执行部分失败了。有没有办法查询 $stmt 变量的错误?
  • See here 了解如何在 PDO 中使用 try catch ...我猜你会看到一些东西。

标签: php mysql pdo


【解决方案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。 Include 在找不到文件时不会给你一个错误。

更改您的验证以帮助您的最终用户

 $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

}

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

命名约定(意见): 我总是用_ 替换空格来命名所有小写的数据库字段。这减少了很多此类问题,因为是registerdateregisterDate 还是RegisterDate

我还做了一些与表名相关的其他事情,但我不会让你厌烦。

干杯!

【讨论】:

    【解决方案2】:

    所以只是在这里添加答案,很简单。我在语句正在执行的位置(以及脚本正在死亡的位置)周围添加了一个 try/catch 块。发现有某种重复的占位符使用或不匹配。然后我仔细检查了占位符,发现:registerDate 被绑定为:registerdate。固定和繁荣,添加到数据库。感谢大家的帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-29
      • 2019-03-21
      • 2012-04-26
      • 2013-06-26
      • 2022-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多