我正在编写一个小脚本,用于检查用户是否在文件中使用了名为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);
}
如果我第一次输入新的用户名,我现在得到的,一切都好。我第二次输入一个新的用户名时会被发现。问题继续:如果我输入现有用户名,则会添加两次,并显示消息“此用户名已列入白名单”。没有显示。每个用户名都在新行中。
感谢您的时间和帮助!
答案 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
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;
}
}