3

我正在为我们的网站编写一个基本的邮件列表系统。“subscribe.php”页面使用$_GET参数的方法。我将电子邮件地址添加到文本文件 (maillist.txt) 中。

在添加地址之前,我检查它是否不在文件中。

问题:比较两个相同的字符串返回 false..

我试过的:

  • 我确保 maillist.txt 是 UTF-8
  • 我尝试在 UTF-8 中设置标题
  • 我尝试使用 strcmp()
  • 我尝试使用 utf8_encode 转换两个字符串

这是“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);
?>
4

3 回答 3

0

总结所有所说的:

问题基本上是我没有过滤特殊的电子邮件字符,所以我通过过滤变量来修复它 filter_var($line, FILTER_SANITIZE_EMAIL);

于 2013-09-16T10:48:39.277 回答
0
  1. 您需要将值存储为变量。

  2. 使用修剪这些变量以确保之前或之后有任何额外的空格。

    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/>";
        }
    }
    
于 2013-08-16T05:44:44.697 回答
0

在这里黑暗中拍摄...

  1. 首先,将您的值存储为变量并重用它们,您打印的内容可能与您比较的不同。

  2. 修剪这些变量以确保之前或之后没有任何多余的空格。

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

这甚至可能不是您的问题,但如果您用眼睛看到相同的字符串,这是一个很好的起点。

于 2013-08-16T00:00:47.400 回答