[英]FILTER_VALIDATE_EMAIL and unique email check in db not working
我对php场景还很陌生,但是由于我一直在寻找数小时的这段代码可能出了什么问题,所以我很茫然。 由于某种原因,数据库中的FILTER_VALIDATE_EMAIL和唯一电子邮件检查不起作用,它们已被完全跳过。 我知道这是因为提交表单时,它会在最后一个catch(PDOExceptions $ex)
上踢出一个错误(未显示,但是在下面的最后一个代码块之后),而不是设置为之前显示的任何其他错误(显示为这里)。 在尝试将表单数据插入数据库之前,不会发生任何错误(或不会显示任何错误)。 由于电子邮件索引是唯一的,因此不允许重复插入。 因此查询无法运行,并且die()
失败。 我正在尝试发布以下消息:电子邮件无效或不带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>";
}
此代码有什么问题? 或者是完全跳过db中的FILTER_VALIDATE_EMAIL和唯一电子邮件检查的原因? 提前致谢。
http://php.net/manual/zh/function.filter-var.php确实返回了过滤后的值,因此
$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
if(false !== $email) {
$query = "
SELECT
1
FROM users
WHERE
email = :email
";
$query_params = array(
':email' => $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>";
}
else {
// ...insert record...
}
}
else {
$emailerr = "<font color=\"red\">Please enter a valid email address</font>";
}
我终于想通了,对于可能正在寻找相同信息的任何人。
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>";
}
同样,对于姓氏,电子邮件和密码是否为空,我也做了同样的事情。 然后:
} else if(!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL))
{
$emailerr = "<font color=\"red\">Please enter a valid email address</font>";
$submitted_firstname = htmlentities($_POST['fname'], ENT_QUOTES, 'UTF-8');
$submitted_lastname = htmlentities($_POST['lname'], ENT_QUOTES, 'UTF-8');
$submitted_email = htmlentities($_POST['email'], ENT_QUOTES, 'UTF-8');
} else if (!empty($_POST['fname']) &&
!empty($_POST['lname']) &&
!empty($_POST['email']) &&
!empty($_POST['password']))
{
$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)
{
$emailerr2 = "<font color=\"red\">This email address is already registered</font>";
$submitted_firstname = htmlentities($_POST['fname'], ENT_QUOTES, 'UTF-8');
$submitted_lastname = htmlentities($_POST['lname'], ENT_QUOTES, 'UTF-8');
$submitted_email = htmlentities($_POST['email'], ENT_QUOTES, 'UTF-8');
} else
{
然后,我运行用于将信息插入db表的代码。 效果很好。 希望没有其他事情出现。 感谢您的评论和帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.