我正在为我们的网站编写一个基本的maillist系统。 “subscribe.php”页面使用$_GET
方法作为参数。我在一个文本文件(maillist.txt)中添加了电子邮件地址。
在添加地址之前,我会检查它是否在文件中。
问题:比较两个相同的字符串会返回false ..
我尝试了什么:
这是“subscribe.php”代码:(我删除了所有正则表达式和isset检查)
<?php
// UTF-8 ----> things I've added, trying to solve the problem
header('Content-Type: text/html; charset=utf-8');
ini_set('default_charset', 'utf-8');
ini_set("auto_detect_line_endings", true);
$email = strip_tags($_GET['email']); // For safety
$maillist = fopen('maillist.txt', 'r+');
// Check if email is already in the database
$insert = true;
while ($line = fgets($maillist)) {
$line = rtrim($line, "\r\n");
if (utf8_encode($line) == utf8_encode($email)) { // $line == $email returns false
echo $line . "=" . $email . "<br/>";
$insert = false;
break;
} else echo $line . "!=" . $email . "<br/>";
}
if ($insert) {
fputs($maillist, $email . "\n");
echo 'Success';
} else echo "Fail";
fclose($maillist);
?>
答案 0 :(得分:0)
在黑暗中拍摄......
首先,将您的值存储为变量并重复使用,您可能会打印不同于您所比较的内容。
修剪这些变量以确保之前或之后没有任何无关的空格。
while ($line = fgets($maillist)) {
$line = rtrim($line, "\r\n");
//the two variables you want to compare
$lineValue = trim(utf8_encode($line));
$email = trim(utf8_encode($email));
//compare them them out
if ($lineValue == $email) {
echo $lineValue . "==" . $email . "<br/>"; //compare the trimmed variables
$insert = false;
break;
} else {
echo $lineValue . "!=" . $email . "<br/>";
}
}
这可能不是你的问题,但如果你用眼睛看相同的字符串,这是一个很好的起点..
答案 1 :(得分:0)
您需要将值存储为变量。
使用修剪这些变量来确保之前或之后的任何额外空格。
while ($line = fgets($maillist)) {
$line = rtrim($line, "\r\n");
//the two variables you want to compare
$lineValue = trim(utf8_encode($line));
$email = trim(utf8_encode($email));
//compare them them out
// "===" means "Identical" True if x is equal to y, and they are of same type
if ($lineValue === $email) {
echo $lineValue . "==" . $email . "<br/>"; //compare the trimmed variables
$insert = false;
break;
} else {
echo $lineValue . "!=" . $email . "<br/>";
}
}
答案 2 :(得分:0)
总结所说的一切:
问题基本上是我没有过滤特殊的电子邮件字符,所以我通过filter_var过滤变量来修复它($ line,FILTER_SANITIZE_EMAIL);