0

私はウェブサイトのために非常に単純なphp投票システムを書こうとしています。基本的に、投票は3行のテキストファイルに集計されます。各行は単なる数字です。投票のない投票ファイルは次のようになります。

0
0
0

これが私が使用しているphpです:

$file = "votes.txt";
$votes = file($file); 
$votes[0] = intval($votes[0]) + 1;
$voteWrite = strval($votes[0]) . "\n" . strval($votes[1]) . "\n" . strval($votes[2]);
file_put_contents($file, $voteWrite);

したがって、配列はテキストファイルの各行を保持します。これが最初のオプションに投票するためのコードである場合、その行の値は1ずつ増加し、配列全体が1つの文字列に連結された後にファイルに書き戻されます。 、配列の行を保持します。理想的には、テキストファイルは次のようになります。

1
0
0

しかし、代わりにそれは読みます:

10
0

誰かがこれがなぜであるか教えてもらえますか?phpは本当に私と一緒に働きたくない...ありがとう。

編集:

私はこのfile()のものを本当に理解していません...これが私が設定したテストです:

$file = "votes.txt";
$votes = file($file); 
$option1 = $votes[0];
$option2 = $votes[1];
$option3 = $votes[2];

続いて、JavaScriptで:

alert(<?php echo $option1; ?>);
alert(<?php echo $option2; ?>);
alert(<?php echo $option3; ?>);

テキストファイルは、3行で28、3、および49を読み取ります。アラートは、「28」、「450」、および「未定義」を返します。なんてこったい?

4

3 に答える 3

0

このようなものが役立つかもしれません:

// Define the whole path of where the file is
$fileName = '/var/home/votes/votes.txt';

// Check if the file exists - if not create it
if (!file_exists($fileName))
{
    $data = array('0', '0', '0');
    $line = implode("\n", $data);
    file_put_contents($line, $fileName);
}

// The file exists so read it
$votes = file($fileName);

// What happens if the file does not return 3 lines?
$vote_one   = isset($votes[0]) ? intval($votes[0]) : 0;
$vote_two   = isset($votes[1]) ? intval($votes[1]) : 0;
$vote_three = isset($votes[2]) ? intval($votes[2]) : 0;

$vote_one++;

$line = "{$vote_one}\n{$vote_two}\n{$vote_three}";
file_put_contents($line, $fileName);

str_valを削除して、エラーチェックを行う以外はほとんど何もしませんでした。それを試してみてください、それはもっとうまくいくかもしれません。

これとは別の保存方法を選択した方がはるかに良いかもしれません。フォーマットを少し変更すると、将来の柔軟性が大幅に向上しますが、この決定はあなた次第であり、制約が何であるかによって異なります。

json_encodejson_decodeなどを使用すると、構造化データもファイルに保存して、以前と同じように取得でき、UTF8で安全です。

したがって、そのルートを選択した場合、コードは次のようになります。

// Define the whole path of where the file is
$fileName = '/var/home/votes/votes.txt';

// Check if the file exists - if not create it
if (!file_exists($fileName))
{
    $data = array('0', '0', '0');
    $line = json_encode($data);
    file_put_contents($line, $fileName);
}

// The file exists so read it
$line = file_get_contents($fileName);
$data = json_decode($line, TRUE);

$data[0] = intval($data[0]) + 1;

$line = json_encode($data);
file_put_contents($line, $fileName);

json_decodeは、データをデコードするときに連想配列を作成するために、2番目のパラメーターとしてTRUEを必要とします。

HTH

于 2012-09-24T02:39:38.930 に答える
0

情報をシリアル化された配列として保存できない理由はありますか? そうでない場合は、次の解決策を検討してください。

$file = "votes.txt";
$votes = file_get_contents($file); 
$votes = $votes ? unserialize($votes) : array(0,0,0);

$votes[0] += 1;

file_put_contents($file, serialize($votes));

このファイルを他の言語または他の目的で再利用している場合は、JSON の提案が適切であると思います。または、単に CSV のようにカンマ区切りで値を保存することもできます。

あなたの例が機能しない理由については、よくわかりません。ゼロと行末の解釈は、場合によっては風変わりな場合があります。ゼロの値がどこかで PHP を動かし、行を空として解釈しているのだろうか? 次のような開始votes.txtファイルを試してみてください。

1     
1
1

まだそのように動作しているかどうかを確認してください。

于 2012-09-24T04:05:43.023 に答える
0

さて、奇妙な数値は、配列値の周りに intval() を使用せず、file_put_contents の代わりに @file_put_contents を使用した結果でした...しかし、この道を進むことはできません。十分に考えていませんでした。 PHP は私のニーズに対応できません。

于 2012-09-25T07:03:34.087 に答える