我写了一段代码来检查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
}
此外,我还有一些建议:
- 使用逗号(,(字符并将文件另存为csv(逗号分隔值(文件。使用逗号,可以防止名称中包含空格的错误
- 尝试编写模块化代码。在这种情况下,您可以创建一个名为usernameExists的函数,如果用户名存在,该函数将返回true,如果不存在,则返回false
- 要比较用户名,请将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;
}
}
?>