2016-07-29 54 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'的作用,但他希望保持有多少人爲每個選項投票。該解決方案僅存儲最後的人投票。 –

相關問題