我遇到了一些问题,我想要这个脚本:
问题:
当我向提交按钮发送垃圾邮件时,.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";
}
?>
答案 0 :(得分:0)
我不是100%确定文本文件是如何搞乱的,但我想锁定在这里没有帮助,因为当脚本完成(或重新加载)时会释放锁。
看起来你正在“杀死”cutline
正在进行中,其余的行不会被写入。解决此问题的一种方法是将文件的新内容保存在临时变量中,并仅调用fwrite
一次。 (我不确定这是否有效)
另一种可能性是将cutline
的结果写入临时文件,并在cutline
方法完成时将旧文件替换为新文件。这可能发生在方法内部。
如果脚本在不安全状态下被杀死,则无论如何都不会触及现有文件。但是当你设法在cutline
的函数调用之后以及在此行中添加新输入之前设置重新加载页面时,你仍然可以从用户那里放弃新的输入
fwrite($fh, $stringData);
我认为这很难用,因为这个操作非常快。
修改强>
如果这是一个有效的用例,请不要忘记同时使用多个用户测试脚本。如果两个或更多人同时编辑同一个文件,它也会搞砸。所以你最终可能会遇到一些锁定,但这并不能解决这里描述的问题。