You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP POST表单匹配失败求助:$_POST与文件读取值不相等

问题分析与解决办法

嘿,我帮你揪出问题所在了!你的代码里$_POST['Username']和读取文件得到的$temp看起来一样却不相等,核心原因是**fgets()会把每行末尾的换行符(\n)或者回车换行符(\r\n)一起读进来**,而你通过表单提交的用户名是没有这个换行符的。===是严格相等比较,哪怕末尾多了个看不见的换行符,也会判定为不相等,自然出不来"success!"。

给你两个关键的解决步骤,顺便优化下代码逻辑:

  • 读取每行内容后,用trim()函数清理掉字符串两端的空白字符(包括换行符、空格、制表符这些看不见的字符),这样就能拿到纯粹的用户名内容来比较。
  • 把原来的while (feof($file) == false)改成while (($temp = fgets($file, 20)) !== false),这种写法更严谨,不会出现多读一行空内容的情况。

修改后的完整代码如下:

<?php 
if(isset($_POST['submit'])) { 
    if (file_exists('logins.txt')) { 
        echo 'The file was found' . '<br>'; 
        $file = fopen('logins.txt', 'r'); 
        // 改进循环写法,同时读取后立即清理换行符
        while (($temp = fgets($file, 20)) !== false) { 
            $cleanedTemp = trim($temp);
            if ($cleanedTemp === $_POST['Username']) { 
                echo 'success!';
                // 找到匹配项后直接跳出循环,不用继续读文件了
                break;
            } else { 
                echo 'failed' . '<br>'; 
                echo '读取的原始内容(含换行):' . $temp . '<br>'; 
                echo 'POST提交的内容:' . $_POST['Username'] . '<br>'; 
                echo '清理后的内容:' . $cleanedTemp . '<br>'; // 可以直观看到差异
            } 
        }; 
        fclose($file); 
    } 
} 
?>
<HTML> 
<body> 
<form action="" method="post"> 
Username <input type="text" name="Username" size="30" value=""> 
Password <input type="text" name="Password" size="30" value=""> 
<input type="submit" name="submit" value="Login"> 
</form> 
</body> 
</HTML>

额外补充个小技巧:如果你想验证这个换行符的问题,可以在原来的代码里加两行输出字符串长度的代码:

echo '读取内容长度:' . strlen($temp) . '<br>';
echo 'POST内容长度:' . strlen($_POST['Username']) . '<br>';

你会发现前者的长度比后者多1(Windows系统可能多2,因为是\r\n),这就是看不见的换行符搞的鬼~

内容的提问来源于stack exchange,提问作者Dylan Jamieson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 21:52:38