存储在 .txt 文件中的计数器不递增
Counter stored in .txt file not incrementing
所以我刚刚编辑了我发布的代码,使其更易于阅读...
第一个代码块是我的计数器代码,用于点击成功提交按钮。但由于某种原因,即使提交成功,$Total 的值也不会增加 1。
<?php
$f = fopen('count.txt', 'r+'); // use 'r+' instead
$total = fgets ($f);
flock($f, LOCK_EX); // avoid race conditions with concurrent requests
$total = (int) fread($f, max(1, filesize('count.txt'))); // arg can't be 0
/*if someone has clicked submit*/
if (isset($_POST['submit'])) {
rewind($f); // move pointer to start of file so we overwrite instead of append
fwrite($f, ++$total);
}
fclose($f);
?>
这是我用来提交表单的提交按钮。
<input type="reset" value="Formular löschen" style="width:49%" />
<input type="submit" name="submit" value="Formular absenden" style="width:49%" />
我正在尝试将此男女同校用于我的俱乐部,以便当人们提交表格时,他们会获得作为参考号的号码,该号码也会在发送的电子邮件中发送给他们。
我真的希望有一种无需数据库的简单方法。
马克
如果您想了解我的意思,问题是什么,here 是代码实现的页面。
发生这种情况是因为您在将其写入文件之前从未设置 $total
。
您需要通过从文件中读取其值来设置 $total
,如下所示:
$total = fgets ($f)
在 fopen
函数调用之后。
但是,如果没有独占文件锁,您可能会遇到并发问题,因此您可能会丢失一些提交计数。
首先,当您操作文件时,您可能会发现一些有用的提示:
- 您必须始终检查文件和文件夹的权限,以确保安全。
- 小心多线程代码,当多个线程同时更改文件时,您可能会得到非常意外的结果,因此请尝试像您一样使用锁来控制它。
我想你错过了 <form>
标签,所以我不得不自己发明一个。
使用此代码作为指南来制作您自己的代码:
<form method="post" action="test.php">
<input type="submit" name="submit" value="Submit" />
</form>
<?php
// Thread-safe <-- Use me
function incrementFile ($file){
$f = fopen($file, "r+") or die("Unable to open file!");
// We get the exclusive lock
if (flock($f, LOCK_EX)) {
$counter = (int) fgets ($f); // Gets the value of the counter
rewind($f); // Moves pointer to the beginning
fwrite($f, ++$counter); // Increments the variable and overwrites it
fclose($f); // Closes the file
flock($fp, LOCK_UN); // Unlocks the file for other uses
}
}
// NO Thread-safe
function incrementFileSimplified ($file){
$counter=file_get_contents('count.txt');
$counter++;
file_put_contents('count.txt', $counter);
}
// Catches the submit
if (isset($_POST['submit'])) {
incrementFile("count.txt");
}
?>
希望对您有所帮助! :)
所以我刚刚编辑了我发布的代码,使其更易于阅读...
第一个代码块是我的计数器代码,用于点击成功提交按钮。但由于某种原因,即使提交成功,$Total 的值也不会增加 1。
<?php
$f = fopen('count.txt', 'r+'); // use 'r+' instead
$total = fgets ($f);
flock($f, LOCK_EX); // avoid race conditions with concurrent requests
$total = (int) fread($f, max(1, filesize('count.txt'))); // arg can't be 0
/*if someone has clicked submit*/
if (isset($_POST['submit'])) {
rewind($f); // move pointer to start of file so we overwrite instead of append
fwrite($f, ++$total);
}
fclose($f);
?>
这是我用来提交表单的提交按钮。
<input type="reset" value="Formular löschen" style="width:49%" />
<input type="submit" name="submit" value="Formular absenden" style="width:49%" />
我正在尝试将此男女同校用于我的俱乐部,以便当人们提交表格时,他们会获得作为参考号的号码,该号码也会在发送的电子邮件中发送给他们。
我真的希望有一种无需数据库的简单方法。
马克
如果您想了解我的意思,问题是什么,here 是代码实现的页面。
发生这种情况是因为您在将其写入文件之前从未设置 $total
。
您需要通过从文件中读取其值来设置 $total
,如下所示:
$total = fgets ($f)
在 fopen
函数调用之后。
但是,如果没有独占文件锁,您可能会遇到并发问题,因此您可能会丢失一些提交计数。
首先,当您操作文件时,您可能会发现一些有用的提示:
- 您必须始终检查文件和文件夹的权限,以确保安全。
- 小心多线程代码,当多个线程同时更改文件时,您可能会得到非常意外的结果,因此请尝试像您一样使用锁来控制它。
我想你错过了 <form>
标签,所以我不得不自己发明一个。
使用此代码作为指南来制作您自己的代码:
<form method="post" action="test.php">
<input type="submit" name="submit" value="Submit" />
</form>
<?php
// Thread-safe <-- Use me
function incrementFile ($file){
$f = fopen($file, "r+") or die("Unable to open file!");
// We get the exclusive lock
if (flock($f, LOCK_EX)) {
$counter = (int) fgets ($f); // Gets the value of the counter
rewind($f); // Moves pointer to the beginning
fwrite($f, ++$counter); // Increments the variable and overwrites it
fclose($f); // Closes the file
flock($fp, LOCK_UN); // Unlocks the file for other uses
}
}
// NO Thread-safe
function incrementFileSimplified ($file){
$counter=file_get_contents('count.txt');
$counter++;
file_put_contents('count.txt', $counter);
}
// Catches the submit
if (isset($_POST['submit'])) {
incrementFile("count.txt");
}
?>
希望对您有所帮助! :)