Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.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 - Fatal编程技术网

Php 如何知道它是否';输入的电子邮件或用户名

Php 如何知道它是否';输入的电子邮件或用户名,php,Php,大家好,我想问我的html表单的问题,需要输入用户名/电子邮件,你可以把。 然后它通过用户名或电子邮件搜索数据库中是否存在该帐户(如果是)。 脚本可以工作,但只能与电子邮件一起工作。 我的问题是如何在输入字段中识别用户是否写了用户名或电子邮件?现在它会同时检查这两个选项,但由于某些原因,它无法检测到仅键入用户名的电子邮件 function getUserEmailExist( $input ) { global $database; if( preg_match

大家好,我想问我的html表单的问题,需要输入用户名/电子邮件,你可以把。 然后它通过用户名或电子邮件搜索数据库中是否存在该帐户(如果是)。 脚本可以工作,但只能与电子邮件一起工作。

我的问题是如何在输入字段中识别用户是否写了用户名或电子邮件?现在它会同时检查这两个选项,但由于某些原因,它无法检测到仅键入用户名的电子邮件

function getUserEmailExist( $input )
    {
    global $database;

        if( preg_match( '/^[a-z0-9]+([_\\.-][a-z0-9]+)*@([a-z0-9]+([\.-][a-z0-9]+)*)+\\.[a-z]{2,}$/i', $input ) ) {
            $type = 2;
            $get = $database->checkExistRecovery( $input, $type );
        }

        if( preg_match( '/[^0-9A-Za-z]/', $input ) ) {
            $type = 1;
            $get = $database->checkExistRecovery( $input, $type );
        }

        if( $get ) {
            $this->updateRecover( $input, $type );
        } else {     
            return false;
        }
    }

您需要在下面的声明中移动您的电子邮件

因为如果输入是一封电子邮件,它无论如何都会匹配第二个preg匹配。 所以您正在覆盖$type变量

固定的

    function getUserEmailExist( $input )
    {
        global $database;

        if( preg_match( '/[A-Za-z0-9]+/', $input ) ) {
            $type = 1;
            $get = $database->checkExistRecovery( $input, $type );
        }

if( preg_match( '/^[a-z0-9]+([_\\.-][a-z0-9]+)*@([a-z0-9]+([\.-][a-z0-9]+)*)+\\.[a-z]{2,}$/i', $input ) ) {
            $type = 2;
            $get = $database->checkExistRecovery( $input, $type );
        }

        if( $get ) {
            $this->updateRecover( $input, $type );
        } else {     
            return false;
        }
    }

我想你希望你的第二个正则表达式是
/[A-Za-z0-9]+/
。您当前正在查找不包含这些字符的任何内容。

为什么要关心所有验证逻辑?我看不到您的实际DB查询,但您似乎可以轻松地执行以下操作:

SELECT * FROM users
WHERE email = ? OR username = ?

在哪里?将是电子邮件或用户名值。

所以问题是您的第二个正则表达式不起作用?您希望它检测什么?对于您的用户名检查,您正在检查负
^
字符集。也就是说,它不可能是
[0-9A-Z-az]
。嗯,让我试试。但我已经试过了,也许这次能奏效。不,它不起作用了,还是一样也许我做了些什么来处理它?但我并不认为,因为电子邮件可能只适用于类型是的,我真的不明白为什么,因为你刚才告诉我我这么做了,是的,我先替换了用户名,然后是电子邮件,但仍然不起作用,可能在复制你的电子邮件时我的代码中有一些错误,谢谢。@karolis如果你想知道为什么,阅读对您的问题的评论;)您使用了一个负数字符集,当他更新代码时,他从用户名检查集中删除了
^
。可能是密码恢复,因此他知道要提取哪个记录以允许更改,等等。尽管我认为仍然应该使用
用户名=?或者email=?
然后在该语句中准备两次值。是的,我知道我自己有两个原因不这样做:第一,编码一些需要更安全的东西。secound-我已经通过将它们按$type分开来检查数据库是否存在示例:if type==1搜索用户名if type==2搜索email@Jon当然,这里最好是事先准备好的声明。不过,我确实认为查看每个电子邮件/密码和用户名/密码组合很重要。你不能只做
WHERE(email=?或username=?)密码=?
@MikeBrant完全同意用户登录-我没有看到正在处理的密码,并假设它是为了找到用户名或电子邮件,然后获取电子邮件并向用户发送密码恢复链接或类似内容-我没有假设它是为了验证目的^^@karolis您可能会考虑将此类信息发布到codereview.stackexchange.com或类似网站以获取反馈。就个人而言,如果您是我团队中的一名开发人员,我会质疑从该方法中实际调用
UpdateRecover()
方法的逻辑。这个方法名为
getUserEmailExist()
,IMO应该这样做,而且只能这样做(通过电子邮件/用户名验证用户是否存在,并将用户id返回给调用方)。然后,调用方可以根据响应决定是否触发
UpdateRecover()