Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么验证电子邮件会返回错误?_Php_Database_Authentication - Fatal编程技术网

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;
        }
    }