file_put_contents写入异常求助:写入内容与预期哈希值不符
嘿,我来帮你拆解这个奇怪的问题——你已经做了不少调试工作,确认哈希计算是对的,但写入文件的内容始终不对,这确实挺让人头疼的!
先梳理下你的核心问题:
- 调试输出的哈希值是正确的(比如输入
hugo得到f0a3e0cbd8776ace8d3069ce2942e9f1) - 但FTP查看的目标文件里,内容始终是对应
null输入的哈希3293ac630c13f0245f92bbb1766e1616 - 即使删除文件、去掉哈希函数,写入结果也不符合预期
结合你给出的代码,我整理了几个最可能的原因和对应的调试/修复步骤:
1. 相对路径导致写入了错误的文件
这是最常见的“诡异写入”问题根源!你调试时输出的路径./bdd/xxx/mdp.txt是相对路径,它的实际指向取决于PHP脚本的当前工作目录,而这个目录可能和你预期的不一样(比如Web服务器的文档根目录、脚本所在子目录等)。
修复/调试方法:
把相对路径换成绝对路径,确保写入的是你FTP查看的那个文件:
// 用__DIR__获取当前脚本所在的绝对目录,拼接出目标文件的绝对路径 $filePath = __DIR__ . '/bdd/' . $_SESSION["login"] . '/mdp.txt'; // 输出绝对路径,确认和FTP里的路径一致 echo "实际写入路径:" . $filePath . "<br>"; // 替换原来的file_put_contents file_put_contents($filePath, $crypt);
如果输出的绝对路径和你FTP里查看的路径不一样,那就是你之前找错了文件!
2. 文件缓存或权限问题
有些共享主机或服务器会开启文件缓存,导致你FTP看到的不是最新的文件内容;或者文件创建后权限设置异常,导致后续写入没有真正生效。
调试方法:
在写入后立即读取文件内容,确认写入是否成功:
file_put_contents($filePath, $crypt); // 写入后马上读取并输出 $writtenContent = file_get_contents($filePath); echo "写入后立即读取的内容:" . $writtenContent . "<br>";
如果这里输出的是正确的哈希值,那说明写入是成功的,问题出在FTP查看的缓存——你可以手动刷新FTP连接,或者等待几分钟再查看;如果读取的还是错误值,那就要检查文件权限(确保PHP进程有写入权限)。
3. 变量被意外覆盖
有没有可能在no_check_timer()函数或者其他地方,$crypt变量被意外修改了?比如这个函数里有全局变量操作,或者引用传递修改了它。
调试方法:
在file_put_contents前再次输出$crypt,确认它的值没有被篡改:
$crypt = hash($algo, htmlspecialchars($_POST["mdp"])); echo "计算后的哈希:" . $crypt . "<br>"; // 调用no_check_timer后再输出一次 no_check_timer(); echo "调用函数后的哈希:" . $crypt . "<br>"; // 写入前最后确认一次 echo "即将写入的哈希:" . $crypt . "<br>"; file_put_contents($filePath, $crypt);
如果某一步的$crypt变成了错误值,那就要去检查no_check_timer()函数的代码了。
4. 代码逻辑的小瑕疵(顺带修复)
你的else分支里有个小问题:$crypt变量只在if分支里定义,else分支里的echo $crypt会触发“Undefined variable”错误,虽然这不是当前问题的根源,但还是建议修复:
else { // 这里可以定义一个默认值,或者直接去掉$crypt的输出 echo $_POST["mdp"]." | ".$_POST["mdp2"]." | 未计算哈希 | ".$filePath; echo "<p/><span class='erreur'>ERROR : password & pass confirmation do not match.</span><br/>"; footer(true); }
内容的提问来源于stack exchange,提问作者Hugo7

