我正在尝试重新学习我正在从事的当前应用程序项目的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
答案 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字段的名称全部小写,并用_
代替空格。这样可以减少很多这类问题,因为是registerdate
,registerDate
或RegisterDate
。
我还有其他一些与表名有关的事情,但是我不会为您烦恼。
干杯!
答案 1 :(得分:0)
因此,只需在此处添加答案即可,这很简单。我在语句执行的位置(脚本快死了)附近添加了一个try / catch块。发现存在某种重复的占位符用法或不匹配。然后我仔细检查了占位符,发现:registerDate被绑定为:registerdate。固定和繁荣,添加到数据库。谢谢大家的帮助!