对于简单的投票系统,我将值放入.txt文件中。 这是我使用的数组:
$quickpolloptions = ['Mozilla', 'Chrome', 'Opera', 'IE', 'Safari'];
这是表格:
<form method="post" id="quickpoll">
foreach ($quickpolloptions as $key => $value) {
echo "<tr>";
echo "<td>";
echo "<label>$value</label>";
echo "</td>";
echo "<td>";
echo "<input type='checkbox' name='checkboxvote[]' value='$key'><br>";
echo "</td>";
echo "</tr>";
}
<input type="submit" value="Submit">
</form>
这是我存储数据的方式:
$result_file = "data/vote_result.txt";
if (file_exists($result_file)) {
$results = explode(',', file_get_contents('data/vote_result.txt'));
} else {
// start with zeros if you don't have a file yet
$results = array_fill(0, count($quickpolloptions), 0);
}
// below i am trying to read each value fromn checkbox and store in .txt file
if (isset($_POST['checkboxvote'])) {
foreach ($_POST['checkboxvote'] as $checkbox) {
$results[$_POST['checkboxvote']]++;
file_put_contents('data/vote_result.txt', implode(',', $results));
}
}
所以我在最后一部分没有成功:在txt文件中放入多个值。
我该怎么做?
答案 0 :(得分:1)
我认为$results[$_POST['checkboxvote']]++;
应为$results[$checkbox]++;
请注意,如果两个人同时投票,您的实施容易受到竞争条件的影响。
您应该使用文件锁或考虑具有事务保护的RDBMS。
示例:强>
if (isset($_POST['checkboxvote'])) {
/* lock the file to prevent a race condition */
$file_handle = fopen($result_file, 'a+');
$locked = flock($file_handle, LOCK_EX);
/* retrieve the results now that we are locked */
$results = fgets($file_handle);
if ($results !== false) {
$results = explode(',', $results);
} else {
$results = array_fill(0, count($quickpolloptions), 0);
}
/* update the results */
foreach ($_POST['checkboxvote'] as $checkbox) {
$results[$checkbox]]++;
}
/* write them to the file and unlock */
ftruncate($file_handle, 0);
fputs($file_handle, implode(',', $results));
flock($file_handle, LOCK_UN);
fclose($file_handle);
}
答案 1 :(得分:1)
在你的foreach循环中,你循环$_POST['checkboxvote']
这是正确的。但是$checkbox
是元素。
其次,您将值插入到$results
的索引中,您需要将它们作为结果的数据,因此内部会将它们组合在一起。
最后,您应该在foreach循环之外调用file_put_contents()
。如果你多次调用它会看起来工作正常但是每次循环都会覆盖你的文件会浪费时间。
foreach ($_POST['checkboxvote'] as $checkbox) {
$results[] = $checkbox;
file_put_contents('data/vote_result.txt', implode(',', $results));
}
或
foreach ($_POST['checkboxvote'] as $key => $checkbox) {
$results[] = $_POST['checkboxvote'][$key];
file_put_contents('data/vote_result.txt', implode(',', $results));
}
答案 2 :(得分:1)
在递增值时,使用$checkbox
变量作为$results
的键。另外,不要写入循环内的文件。只需更新数组,然后写入文件一次。
if (isset($_POST['checkboxvote'])) {
foreach ($_POST['checkboxvote'] as $checkbox) {
$results[$checkbox]++;
}
file_put_contents('data/vote_result.txt', implode(',', $results));
}
答案 3 :(得分:-1)
我假设第二个代码块是一个HTTP端点,您可以将其保存到vote_result.txt
文件中。
您现在正在获取该文件中当前内容的内容,并将其分配给变量$result
- 您实际上从未实际需要做的事情将其作为脚本的响应返回。
您需要的只是将checkboxvote
的POST参数数组作为代码保存的代码,并将其保存为逗号分隔值的字符串。类似的东西:
if(isset($_POST['checkboxvote'])){
file_put_contents('data/vote_result.txt', implode(',', $_POST['checkboxvote']));
}
在写入文件时,您不需要for循环,因为implode()
已经将数组分解为一个字符串。
现在,当您使用以下参数POST到脚本时:
checkboxvote[]='owl'
checkboxvote[]='chicken'
checkboxvote[]='deer'
您的vote_result.txt
将如下所示:
owl,chicken,deer