Php 为什么验证电子邮件会返回错误?
我正在开发一个带有验证的注册/登录系统。注册系统运行良好。例如,当我两次注册同一封电子邮件时,会显示以下消息: 电子邮件已注册 但是,当我使用相同的电子邮件和密码登录时,会发生错误。以下消息显示为验证错误: 电子邮件未注册 即使电子邮件已在数据库中注册 电子邮件验证代码:Php 为什么验证电子邮件会返回错误?,php,database,authentication,Php,Database,Authentication,我正在开发一个带有验证的注册/登录系统。注册系统运行良好。例如,当我两次注册同一封电子邮件时,会显示以下消息: 电子邮件已注册 但是,当我使用相同的电子邮件和密码登录时,会发生错误。以下消息显示为验证错误: 电子邮件未注册 即使电子邮件已在数据库中注册 电子邮件验证代码: <?php public function validateEmail($par) { if (filter_var($par, FILTER_VALIDATE_EMAIL)) { return
<?php
public function validateEmail($par)
{
if (filter_var($par, FILTER_VALIDATE_EMAIL)) {
return true;
} else {
$this->setErro("Invalid Email!");
return false;
}
}
public function validateIssetEmail($email, $action = null)
{
$b = $this->cadastro->getIssetEmail($email);
if ($action == null) {
if ($b > 0) {
$this->setErro("Email already registered!");
return false;
} else {
return true;
}
} else {
if ($b > 0) {
return true;
} else {
$this->setErro("Email not registered!");
return false;
}
}
}
和类密码
<?php
namespace Classes;
use Models\ClassLogin;
class ClassPassword
{
private $db;
public function __construct()
{
$this->db = new ClassLogin();
}
# Create password's hash to save in DB
public function passwordHash($senha)
{
return password_hash($senha, PASSWORD_DEFAULT);
}
# Verify if password's hash is correct
public function verifyHash($email, $senha)
{
$hashDb = $this->db->getDataUser($email);
return password_verify($senha, $hashDb["data"]["senha"]);
}
}
这是错误的部分,我猜您将登录指定为操作,以便可以在函数内部调用cadastro类
$cadastro = new Cadastro();
$b = $cadastro->getIssetEmail($email);
if ($action == null) {
if ($b > 0) {
$this->setErro("Email already registered!");
return false;
} else {
return true;
}
} else {
if ($b > 0) {
return true;
} else {
$this->setErro("Email not registered!");
return false;
}
}
这不是一个答案,但希望它将有助于调试
首先,我要更改您的代码。这是100%的风格选择,但我个人认为它更容易遵循。如果有一个If
语句总是返回
,从技术上讲,您不需要else
。再一次,这是一种风格选择,你不必遵循它
第二,如果可以的话,可以尝试将日志添加到工作流中,这样可以节省大量调试时间。它并不总是一个选项,特别是对于遗留代码库,但是当您可以检查复杂代码时,它是非常棒的。在这个例子中,我只是制作了几个helper方法来转储内容,但通常我会使用类似于monog的东西来写入流,我可以tail
,并且我可以在生产中轻松地将其关闭。在日志记录时,有时这有助于避免出现相同的消息,以便您也可以轻松地找到您所在的确切行号
因此,通过这些更改,尝试在类中运行以下代码:
专用函数日志消息($message)
{
echo$message.PHP\u EOL;
}
私有函数logVariable($variable)
{
变量转储($变量);
}
公共函数validateisetemail($email,$action=null)
{
$this->logVariable($email);
$this->logVariable($action);
$b=$this->cadastro->getIssetEmail($email);
$this->logVariable$b;
如果($action==null){
$this->logMessage('操作为null');
如果($b>0){
$this->logMessage('B大于零');
$this->setErro(“电子邮件已注册!”);
返回false;
}
$this->logMessage('B不大于零');
返回true;
}
$this->logMessage('Action not null');
如果($b>0){
$this->logMessage('B大于零');
返回true;
}
$this->logMessage('B不大于零');
$this->setErro(“电子邮件未注册!”);
返回false;
}
这应该以人类可读的形式记录每一步。您应该能够了解这一点并确定错误所在。例如,在上面的评论中,您说一个变量是0
在一个块中,该块由一个确保不会发生这种情况的检查保护。这条语句看起来很奇怪:return$r=$b->rowconnt()
的确如此。但它在注册用户时效果非常好。:/就在这一行的前面$this->setErro(“电子邮件未注册!”);
打印出$b
的值,看看里面有什么。它打印0。我认为它不是在“搜索”数据(电子邮件)是0
还是“0”“
?在validateisetemail
方法中,逐个条件地执行并转储变量以查看流程代码>。如果我更改并放入$r intead$b,我必须在什么是cadastro之前定义$r?它可能返回了一个无法与0比较的值。我忘了翻译。。。它的意思是“注册”。。。它来自ClassCadstro(ClassRegister),它独立于登录系统。看起来,登录上的验证工作不正常。您打开了一个表单,我可以把它完全放在这个表单上吗?NULL字符串(5)“Login”int(0)动作不为NULL B不大于零
此返回如果第一件事是NULL
,这意味着$email
是空的。因此,我理解如果($action==null)
一旦action不为null,那么代码“忽略”,但是B不大于零,即使有电子邮件……为什么$email
是空的?
# Check directly at the bank if the email is registered
public function getIssetEmail($email)
{
$b = $this->selectDB(
"*",
"users",
"where email=?",
[
$email
]
);
return $r = $b->rowCount(); // returns the amount of rows in the search
}
<?php
namespace Classes;
use Models\ClassLogin;
class ClassPassword
{
private $db;
public function __construct()
{
$this->db = new ClassLogin();
}
# Create password's hash to save in DB
public function passwordHash($senha)
{
return password_hash($senha, PASSWORD_DEFAULT);
}
# Verify if password's hash is correct
public function verifyHash($email, $senha)
{
$hashDb = $this->db->getDataUser($email);
return password_verify($senha, $hashDb["data"]["senha"]);
}
}
$cadastro = new Cadastro();
$b = $cadastro->getIssetEmail($email);
if ($action == null) {
if ($b > 0) {
$this->setErro("Email already registered!");
return false;
} else {
return true;
}
} else {
if ($b > 0) {
return true;
} else {
$this->setErro("Email not registered!");
return false;
}
}