2016-07-29 34 views
0

对于简单的投票系统,我将值放入.txt文件中。 这是数组我使用:如何将多个值从复选框添加到.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

'$ _POST ['checkboxvote']'是一个数组。数组作为一个关键不是你所期望的。 –

回答

1

使用$checkbox变量为重点,以$results递增值时, 。另外,不要写入循环内的文件。只需更新数组,然后写入文件一次。

if (isset($_POST['checkboxvote'])) { 
    foreach ($_POST['checkboxvote'] as $checkbox) { 
     $results[$checkbox]++; 
    } 
    file_put_contents('data/vote_result.txt', implode(',', $results)); 
} 
+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

在你的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)); 
} 
+0

我不认为这些都会工作,因为HTML不会提交未选中的复选框,但我同意file_put_contents肯定应该在循环之外。 –

0

我假设第二个代码块是你打将数据保存到您的vote_result.txt文件的HTTP端点。

您正在获取该文件中当前内容,并将其分配给变量$result--这是您不需要执行的操作,因为您从未实际将其作为脚本的响应返回。

您只需要将POST参数数组为checkboxvote的代码保存为一个字符串,并用逗号分隔这些值。喜欢的东西:

if(isset($_POST['checkboxvote'])){ 
    file_put_contents('data/vote_result.txt', implode(',', $_POST['checkboxvote'])); 
} 

因为implode()写入文件时,您不需要在for循环的阵列已经分解成一个字符串。

现在,当您发布与下面的参数脚本:

checkboxvote[]='owl' 
checkboxvote[]='chicken' 
checkboxvote[]='deer' 

vote_result.txt看起来像:

owl,chicken,deer 
+1

这是行不通的,它不会增加他的数量,例如3人投了'猫头鹰',2人投了'鹿'。 –

+1

@BrandonHorsley'implode()'把数组变成一个字符串。如果已经具有字符串格式的所有值,则不应该通过数组运行。 –

+1

我明白'implode'的作用,但他希望保持有多少人为每个选项投票。该解决方案仅存储最后的人投票。 –

相关问题