为啥这段代码没有将数据插入数据库?

Posted

技术标签:

【中文标题】为啥这段代码没有将数据插入数据库?【英文标题】:Why this code isn't inserting data into database?为什么这段代码没有将数据插入数据库? 【发布时间】:2016-02-21 12:48:53 【问题描述】:

这是我的注册表单,我同时使用 javascriptphp 来验证表单,javascript 代码在显示验证错误消息方面效果很好,但是 php 代码有问题,当禁用 javascript 时,php 代码应该通过刷新页面显示表单验证错误消息在表单提交时,但没有出现错误消息,也没有插入数据。单击提交时,页面会重新加载,但甚至不会出现表单。

<?php
 error_reporting('E_ALL ^ E_NOTICE');
 if(isset($_POST['reg']))
 $fn = ucfirst($_POST['fname']);
 $ln = ucfirst($_POST['lname']);
 $un = $_POST['username'];
 $em = $_POST['email'];
 $pswd = $_POST['password'];
 $d= date("Y-m-d");
if (strlen($fn) < 2 || strlen($fn) > 15) 
$error =  "First name must be 2 to 15 characters long";
 
elseif (strlen($ln) < 2 || strlen($ln) > 15) 
$error =  "Last name must be 2 to 15 characters long";

elseif($em=="")
$error =  "Email cannot be empty";

elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) 
$er = "Invalid email format";

elseif($pswd=="")
$error =  "Fill your password";

elseif($pswd!=$pswd2)
$error =  "Password and Confirm password do no match";

else

$pswd = password_hash($pswd, PASSWORD_DEFAULT);
$stmt = $db->prepare("INSERT INTO table1 (username,firstname,lastname,email,password) VALUES (:username,:firstname,:lastname,:email,:password)");  
$stmt->execute(array(':username'=>$un,':firstname'=>$fn,':lastname'=>$ln,':email'=>$em,':password'=>$pswd));

if ($stmt->rowCount() == 1) 
 header("Location:login.php");
 
else 
echo "Error occured please try again.";


?>

<form action="" method="post">
<input type="text" name="fname" id="fn" placeholder="First Name"/><br />
<input type="text" name="lname" id="ln"  placeholder="Last Name"/><br />
<input type="text" name="username" id="un" placeholder="Username" class="username" /><br />
<input type="email" name="email" id="em" placeholder="Email"/> <br />
<input type="password" name="password" id="pswd" placeholder="Password"/><br />
<input type="password" name="password2" id="pswd2" placeholder="Confirm Password"/><br />
<input type="submit" id="submit" name="reg" value="Create an Account">
<center><div id="er"><?php echo $error ?></div></center>
</form>

【问题讨论】:

你的数据库连接代码在哪里?? 把你的错误报告改成ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL);,然后你就可以看到发生了什么。 你开启了 PHP Errors 吗? @Styphon 我正在使用 xampp 我认为错误是默认开启的? 【参考方案1】:

你应该回显$error而不是$er

<center><div id="er"><?php echo $error; ?></div></center>

【讨论】:

【参考方案2】:

你做错了:

$stmt->execute(array(':username'=>$un,':firstname'=>$fn,':lastname'=>$ln,':email'=>$em,':password'=>$pswd));

您应该使用“用户名”而不是“:用户名”。像这样:

$stmt->execute(array('username'=>$un,'firstname'=>$fn,'lastname'=>$ln,'email'=>$em,'password'=>$pswd));

【讨论】:

【参考方案3】:

您的代码中有一些不一致的地方。

在开始时,您将 $_POST['email'] 分配给 $em,但后来您针对名为 $email 的变量进行验证,此时该变量不存在。

$em = $_POST['email'];
.
.
.
elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) 
    $er = "Invalid email format"; //should maybe be $error

然后是密码验证:

elseif($pswd!=$pswd2)
    $error =  "Password and Confirm password do no match";

$pswd2 从未在您的代码中定义。

$stmt ist 在您的验证的 else 块中定义,但您在验证后使用它来获取行数。因此,如果您的任何 if 语句为真,这将导致错误。

如果你把那部分代码改成这样会更好:

else
    $pswd = password_hash($pswd, PASSWORD_DEFAULT);
    $stmt = $db->prepare("INSERT INTO table1 (username,firstname,lastname,email,password) VALUES (:username,:firstname,:lastname,:email,:password)");
    $stmt->execute(array(':username'=>$un,':firstname'=>$fn,':lastname'=>$ln,':email'=>$em,':password'=>$pswd));

    if ($stmt->rowCount() == 1) 
        header("Location:login.php");
    
    else 
        echo "Error occured please try again.";
    

毕竟您似乎没有激活错误报告。

【讨论】:

以上是关于为啥这段代码没有将数据插入数据库?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能用这个表单将数据插入我的数据库?

为啥我的改造代码没有在数据库中插入数据?

为啥这段代码会消耗这么多堆?

如何将数据 RSS 插入数据库

为啥这些值没有被插入到数据库中?

从表单插入 sql 表时遇到问题 [重复]