我遇到了一些问题,我希望这个脚本:
- 打开test.txt文件。
- 检查用户是否在txt文件中添加了文本。
- 如果用户添加了任何文本,删除现有行并替换为新的行。从$ _POST。
- 如果用户没有设置,在test.txt中添加$_POST
问题:
当我垃圾邮件提交按钮时,.txt将会混乱。有人知道怎么核对吗,这样就不会出错了?请不要建议MYSQL,我需要这些在。txt文件。
谢谢。
function cutline($filename,$line_no=-1) {
$strip_return=FALSE;
$data=file($filename);
$pipe=fopen($filename,'w');
$size=count($data);
if($line_no==-1) $skip=$size-1;
else $skip=$line_no-1;
for($line=0;$line<$size;$line++)
if($line!=$skip)
fputs($pipe,$data[$line]);
else
$strip_return=TRUE;
return $strip_return;
}
if ($userid = 1) {
if(!isset($_POST['submit'])){
?>
<center><form action="" method="POST">
<b>HWID</b>
<input type="text" name="HWID" />
<input type="submit" value="Add HWID" name="submit">
</form>
</center>
<?php
}else{
$userid= 1;
$userid = "user=" . $userid;
$file = "test.txt";
$lines = file($file);
$count = 1;
foreach ($lines as $e) {
if(strpos($e, $userid) !== FALSE){
cutline($file,$count);
++$count;
}
}
$fh = fopen($file, 'a') or die("can't open file");
$stringData = $userid . $_POST['HWID'] . "n";
fwrite($fh, $stringData);
}
}
}else{
echo "You're not logged in";
}
?>
我不是100%确定文本文件是如何搞乱的,但我猜锁在这里不会有帮助,因为锁在脚本完成(或重新加载)时被释放。
看起来你只是在进程中"杀死"你的cutline
,其余的行将不会被写入。解决这个问题的一种方法是将文件的新内容保存在一个临时变量中,并且只调用fwrite
一次。(我不能100%确定这是否会工作)
另一种可能是在cutline
方法完成后,将cutline
的结果写入临时文件并用新文件替换旧文件。这可以发生在方法内部。
无论哪种方式,如果脚本在不安全状态下被终止,现有文件都不会被触及。但是,在cutline
函数调用之后,在
fwrite($fh, $stringData);
我认为这很难强制执行,因为这个操作非常快。
编辑:如果这是一个有效的用例,不要忘记同时使用多个用户测试脚本。如果两个或更多的人同时编辑同一个文件,它也会搞砸。所以你最终可能会使用一些锁,但这并不能解决这里描述的问题。