为什么检查 txt 文件中的重复项对存储在 txt 文件第一行的信息不起作用?

  • 本文关键字:txt 文件 一行 不起作用 信息 存储 php
  • 更新时间 :
  • 英文 :


我写了一段代码来检查txt文件中重复的用户输入。当我单击按钮时,它只从users.txt中的第二行进行检查。这意味着,如果我插入与第一行相同的重复项,它将不起作用。

if(isset($_POST['button1'])) {
$username1 = $_POST['username'];    
$usernames = array();
$users = fopen("users.txt", "r"); //open file
while (!feof($users)) {
$line = fgets($users, 4096); //read one line
list ($firstname, $lastname, $username) = explode(" ", $line);
if (empty($usernames)) {
$usernames[] = $username1;
} else {
if (in_array($username1, $usernames)) {
echo "Duplicate username: " . $username1 ;
} else {
$usernames[] = $username1;
}
}
}
fclose($users); #close file
}
?>
<form method="post">
<input type="text" id="username" name="username">
<span id="err_u" style="color:red;visibility: hidden;">* Required</span>
<label for="username" >@gmail.com</label>
<input type="submit" name="button1" class="button" value="Check ID" />
</form>

将代码更改为:

<?php
if (isset($_POST['button1'])) {
$username1 = $_POST['username'];
$usernames = array();
$users = fopen("users.txt", "r"); //open file
while (!feof($users)) {
$line = fgets($users, 4096); //read one line
list($firstname, $lastname, $username) = explode(" ", $line);
$usernames[] = (string)$username;
}
if (empty($usernames)) {
$usernames[] = $username1;
} else {
if (in_array($username1, $usernames)) {
echo "Duplicate username: " . $username1;
} else {
$usernames[] = $username1;
}
}
fclose($users); #close file
}
?>
<form method="post">
<input type="text" id="username" name="username">
<span id="err_u" style="color:red;visibility: hidden;">* Required</span>
<label for="username">@gmail.com</label>
<input type="submit" name="button1" class="button" value="Check ID" />
</form>

您有一些逻辑问题。

$usernames从不为空。所以你可以更换这个


if (empty($usernames)) {
$usernames[] = $username1;
} else {
if (in_array($username1, $usernames)) {
echo "Duplicate username: " . $username1;
} else {
$usernames[] = $username1;
}
}

通过这个


if (in_array($username1, $usernames)) {
echo "Duplicate username: " . $username1;
} else {
$usernames[] = $username1;
}

此外,$username1是发布的用户名,没有理由将其放入$usernames集合中。

然后你可以更换这个


if (in_array($username1, $usernames)) {
echo "Duplicate username: " . $username1;
} else {
$usernames[] = $username1;
}

通过这个


if (in_array($username1, $usernames)) {
echo "Duplicate username: " . $username1;
}

此外,您不需要收集用户名。您只需要检查循环中的当前值。如果值与$username1匹配,则用户名存在。使用break,我们可以终止循环并防止内存泄漏。

参见代码


if (isset($_POST[ 'button1' ])) {
$username1 = $_POST[ 'username' ];
$users     = fopen("users.txt", "r"); //open file
while ( ! feof($users)) {
$line = fgets($users, 4096); //read one line
list ($firstname, $lastname, $username) = explode(" ", $line);
if (strtolower($username) == strtolower($username1)) {
echo "Duplicate username: ".$username1;
break;
}
}
fclose($users); #close file
}

此外,我还有一些建议:

  1. 使用逗号(,(字符并将文件另存为csv(逗号分隔值(文件。使用逗号,可以防止名称中包含空格的错误
  2. 尝试编写模块化代码。在这种情况下,您可以创建一个名为usernameExists的函数,如果用户名存在,该函数将返回true,如果不存在,则返回false
  3. 要比较用户名,请将trim和strtolower应用于值

这里是最终代码

<?php
function usernameExists($username1)
{
$exists = false;

if (file_exists('users.csv')) {
$users = fopen("users.txt", "r");

$username1 = trim($username1);
$username1 = strtolower($username1);
while ( ! feof($users)) {
$line = fgets($users, 4096);
list ($firstname, $lastname, $username) = explode(",", $line);

$username = trim($username);
$username = strtolower($username);
if ($username == $username1) {
$exists = true;
break;
}
}
fclose($users);
}

return $exists;
}
// the logic is very simply now
if (isset($_POST[ 'button1' ])) {
$username1 = $_POST[ 'username' ];

if (usernameExists($username1)) {
echo "Duplicate username: ".$username1;
}
}
?>

最新更新