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
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 需要 TRUE 作为第二个参数,以便在解码数据时创建关联数组。

高温高压

于 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 回答