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
相关产品推荐
相关产品推荐

