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