使用PHP读取和搜索txt文件的问题

时间:2012-03-11 23:07:59

标签: php

我正在编写一个小脚本,用于检查用户是否在文件中使用了名为whitelist.txt的用户名。如果找不到用户名,则添加。这是脚本:

$fh = @fopen("whitelist.txt", 'a+');
$stringData = $_POST[usr]. "\n";
if ($fh)
    {
        while (!feof($fh))
        {
            $buffer = fgets($fh);
            if (strpos($buffer, $stringData) == TRUE)
                echo "This username is already whitelisted.";
            elseif (strpos($buffer, $stringData) == FALSE) {
                    fwrite($fh, $stringData);
                    echo "Username ". $stringData. " is now whitelisted.";
                    }
        }
        fclose($fh);
    }

如果我第一次输入新的用户名,我现在得到的,一切都好。我第二次输入一个新的用户名时会被发现。问题继续:如果我输入现有用户名,则会添加两次,并显示消息“此用户名已列入白名单”。没有显示。每个用户名都在新行中。

感谢您的时间和帮助!

5 个答案:

答案 0 :(得分:1)

这样的事情:

$file = 'whitelist.txt';
$contents = file_get_contents($file);
if (strpos($contents, $stringData) === FALSE)
{
    $contents .= "\r\n" . $stringData;
    file_put_contents($file, $contents);
    echo 'Added ' . $stringData . ' to whitelist.';
}
else
{
    echo 'Already whitelisted.';
}

是的,请注意这是三个相同的标志。您可能遇到的问题是== FALSE匹配$ stringData是第一个结果的情况(因此为0,我们都知道FALSE == 0):)

答案 1 :(得分:1)

编辑添加:接受的答案很棒。作为一个对应点,我已经修改了你的代码,如果你想继续逐行读取而不是一次只读 - 文件不太可能变得如此之大,以至于在一个块中执行它是一个问题,但是做出那种假设总是让我有些紧张。


我在这里看到了几个问题:

即使您在文件中找到用户名,也会继续执行文件的其余部分,从而获得误报。尝试:

if (strpos($buffer, $stringData) == TRUE) {
    echo "This username is already whitelisted.";
    break;
}

只要脚本找到与提交的用户名不匹配的行,而不是当它到达文件末尾时,您的else if就会触发。您需要在循环外部移动该检查,以便只添加一次新用户名。总而言之,现在:

$fh = @fopen("whitelist.txt", 'a+');
$stringData = $_POST[usr]. "\n";
if ($fh)
    {
        $found = false;
        while (!feof($fh))
        {
            $buffer = fgets($fh);
            if (strpos($buffer, $stringData) == TRUE) {
                echo "This username is already whitelisted.";
                $found = true;
                break;
        }
        if (!$found) {
            fwrite($fh, $stringData);
            echo "Username ". $stringData. " is now whitelisted.";
        }
        fclose($fh);
    }

答案 2 :(得分:0)

从字符串数据变量中删除\ n。这没有用。 同时使用===

检查来自strpos的结果是否为true或false
strpos() === TRUE

0和false与==相同。

答案 3 :(得分:0)

如果没有深入研究编写代码的方式背后的原因,我会说@marramgrass解决了最初的问题。但是,我建议使用file()将文件读入数组。然后你就可以这样做一个简单的检查:

if(strtolower($_POST[usr]) == $Array[index])
{
    echo 'Username is already whitelisted';
}

这样逻辑很简单,而且你没有处理strpos。

答案 4 :(得分:0)

我不喜欢你已经打开文件进行写作而没有发现匹配是否发生

$username = "thegreatone";
$lines = file("yourfile.txt");
foreach($line as $no => $line) {
    if(strstr($line,$username)) {
       //Now start the hand
       $fp = fopen('whitelist.txt', 'a+');
       fwrite($fp, '\r\n'.$username);
       fclose($fp);

       //Since the search was true... no need to continue the loop
       break;    
    } 
}