2016-07-29 21 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)); 
    } 
} 

ので、私は最後には成功しませんpart:複数の値をtxtファイルに入れる。

どうすればいいですか?

+0

'$ _POST ['checkboxvote']'は配列です。キーとしての配列は期待通りではありません。 –

答えて

1

使用キーとして$checkbox変数を。また、ループ内のファイルには書き込まないでください。配列を更新してから、ファイルに一度だけ書き込みます。

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を使用する必要があります。

例:あなたのforeachループでは

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

は、あなたが正しいです$_POST['checkboxvote']をループされています。しかし、$checkboxが要素です。

第2に、値を$resultsのインデックスに挿入すると、それらを結果のデータとして必要とするので、implodeがそれらを結合します。

最後に、file_put_contents()をforeachループ外に呼び出す必要があります。複数回呼び出すと正しく動作するように見えますが、ループごとにファイルを上書きすることで時間が無駄になります。

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

私は2番目のコードブロックは、あなたのvote_result.txtファイルにデータを保存するためにヒットHTTPエンドポイントであると仮定しています。

現在、そのファイルに現在入っている内容を取得し、それを変数$resultに割り当てています。これは、スクリプトから実際に返信することはないため、実行する必要はありません。

POSTパラメータ配列checkboxvoteを使用し、値を区切るカンマ付きの文字列として保存するコードが必要です。以下のような何か:implode()ので、あなたのファイルに書き込むときには、すでに1つの文字列にあなたの配列を破壊するループのために必要はありません

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

。今

、あなたは以下のパラメータを使用してスクリプトにポスト:

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

あなたのvote_result.txt次のようになります。値をインクリメントするとき$results

owl,chicken,deer 
+1

これはうまくいかず、カウントが増えません。例えば、3人が 'owl'に投票し、2人は 'deer'に投票しました。 –

+1

@BrandonHorsley 'implode()'は配列を文字列に変換します。既にすべての値が文字列形式である場合は、配列を実行してはいけません。 –

+1

私は 'implode'が何をしているのか理解していますが、彼は各オプションに投票した人の数を数え続けようとしています。この解決策は最後の人投票のみを格納します。 –

関連する問題