【发布时间】:2013-08-11 17:34:34
【问题描述】:
我对 php 场景还很陌生,但是由于我一直在寻找几个小时来寻找这段代码可能有什么问题,所以我不知所措。由于某种原因,数据库中的 FILTER_VALIDATE_EMAIL 和唯一电子邮件检查不起作用,它们被完全跳过。我知道这一点,因为当提交表单时,它会在最后一个 catch(PDOExceptions $ex) 上踢出一个错误(未显示,但在下面的最后一个代码块之后),而不是设置为之前显示的任何其他错误(此处显示)。在尝试将表单数据插入数据库之前,不会发生(或显示)错误。由于电子邮件索引是唯一的,因此不允许重复插入。所以查询无法运行并且die()'s。我正在尝试发布电子邮件无效或已在表单本身上使用但没有die() 的消息。
首先,我设置了提交空输入的条件,并对所有其他输入重复错误处理,如“fname”所示。
if (isset($_POST['submit'])) {
if(empty($_POST['fname']) ||
empty($_POST['lname']) ||
empty($_POST['email']) ||
empty($_POST['password']))
{
if(empty($_POST['fname']))
{
$fnamerr = "<font color=\"red\">Please enter your first name</font>";
}
然后我验证 !empty:
}
else if (!empty($_POST['fname']) &&
!empty($_POST['lname']) &&
!empty($_POST['email']) &&
!empty($_POST['password']))
{
if(!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL))
{
$emailerr = "<font color=\"red\">Please enter a valid email address</font>";
}
$query = "
SELECT
1
FROM users
WHERE
email = :email
";
$query_params = array(
':email' => $_POST['email']
);
try
{
$stmt = $db->prepare($query);
$result = $stmt->execute($query_params);
}
catch(PDOException $ex)
{
die ("Failed to run query: " . $ex->getMessage());
}
$row = $stmt->fetch();
if($row)
{
$emailerr = "<font color=\"red\">This email address is already registered</font>";
}
这段代码有什么问题?或者可能是完全跳过数据库中的 FILTER_VALIDATE_EMAIL 和唯一电子邮件检查的原因? 提前致谢。
【问题讨论】:
-
我没有看到您试图根据
$emailerr停止脚本,甚至没有将其回显给用户。 -
迈克。我将
$fnamerr插入到表单输入上方的html 中作为<?php echo $fnamerr;?>和其他插入到他们自己的(即$emailerr到<?php echo $emailerr;?>)。 -
看来你需要学习一些基本的调试原理。在脚本的关键位置插入
echo、print_r或var_dump的组合,以查看该部分是否真的被执行,如果没有,为什么。也许你在这里的elseif声明失败了,但我不知道。尝试在它之后回显一些随机字符串。它出现在输出中吗?如果没有,请尝试回显那里使用的各种变量并手动完成逻辑。例如,$_POST['lname']可能为空。 -
谢谢@Mike,我会尝试一下,看看我想出了什么。
标签: php validation email filter email-validation