我想只允许特定的电子邮件域名。其实我做到了。我想问的是为什么我的第一个代码根本不起作用。
我只是想学习PHP,这个问题可能看起来很愚蠢,对不起。 这是我的代码:
function check_email_address($email) {
$checkmail = print_r (explode("@",$email));
$container = $checkmail[1];
if(strcmp($container, "gmail.com")) {
return true;
}else {
return false;
}
}
答案 0 :(得分:4)
查看strcmp()
的文档,它将返回两个字符串中相同的0,因此这是您要进行的检查。此外,正如其他回答者所提到的那样,当你不应该使用时,你正在使用print_r()
。
无论如何,这就是我将如何完成这个功能 - 它更简单,只使用一行代码:
function check_email_address($email) {
return (strtolower(strstr($email, '@')) == 'gmail.com');
}
它使用strstr()
函数和strtolower()
函数获取域名并将其更改为小写,然后检查它是否为gmail.com
。然后它返回该比较的结果。
答案 1 :(得分:2)
这是因为你正在使用print_r
。它完全不符合你的期望。删除它:
$checkmail = explode("@", $email);
您可以在此处找到有关print_r
的文档:
http://php.net/print_r
除此之外,您可以使用以下内容(它更短):
$parts = explode("@", $email);
return (strcmp($parts[1], "gmail.com") == 0);
答案 2 :(得分:1)
以下行无法正常工作:
$checkmail = print_r (explode("@",$email));
这意味着您尝试将print_r()
的返回值分配到$checkmail
,但实际上并没有返回任何内容(如果您没有提供第二个可选参数价值true
)。
即使这样,它也会得到一个包含数组结构的字符串,而$container
的值为r
,因为它是Array
中的第二个字母。
结论:如果您的行没有拨打print_r()
,那么它就会按计划运行(只要您确保将strcmp()
与{{1}进行比较},因为这意味着字符串是相同的。)
0
有趣的是,我刚刚意识到这也可以通过使用Edit:
来实现:
substr()
答案 3 :(得分:0)
不需要print_r; explode返回一个列表。在风格方面(至少我的风格)不需要将该列表的第N个元素分配给另一个变量,除非您打算在其他地方使用它。因此,
$c = explode('@',$mail);
if(strcmp($c[1],'gmail.com') == 0) return true;
return false;
答案 4 :(得分:0)
你想:
if(strcmp($container, "gmail.com")==0)
而不是
if(strcmp($container, "gmail.com"))
哦!当然没有内联print_r()
。
更好:
return strcmp($container, "gmail.com")==0;