PHP分数分配

时间:2012-06-27 14:39:21

标签: php arrays loops

我有一个网页,人们可以在0到10之间发布一个数字。

每天一次有一个乐透单号生成。我希望我的PHP脚本检查所有用户的发布号码,并为相对的赢家(或输家)分配+1或-1的分数。

问题是,一旦我向DB查询获胜用户列表,我想更新他们的“得分”字段(在“用户”表中)。我在考虑这样的循环(伪代码)

foreach winner{
    update score +1
}

但这意味着如果有100名获胜者,则会有100个查询。有没有办法用一个查询进行某种批量插入?

提前致谢。

3 个答案:

答案 0 :(得分:1)

您没有指定数字的存储方式。如果有大量的人发帖,一个很好的选择是使用数据库来存储他们的数字。

例如,您可以使用名为lotto的表格,其中包含三个字段:posted_numberscoreemail。在posted_number字段上创建(非唯一!)索引。

create table lotto (posted_number integer(1) unsigned, score integer, email varchar(255), index(posted_number));

要更新他们的分数,您可以执行两个查询:

update lotto set score = score+1 where posted_number = <randomly drawn number here>
update lotto set score = score-1 where posted_number = <randomly drawn number here>

答案 1 :(得分:1)

我假设您正在使用带有sql的数据库,并建议您可能希望执行类似

的操作
UPDATE `table` SET `score`=`score`+1 WHERE `number`=3;

和相应的-1为输家(奇怪的,不能看到-1的理由)。

虽然没有更多细节,但我无法提供进一步的帮助。

答案 2 :(得分:0)

我们假设我们有一个名为postsusers的数据表。 显然,users包含赌徒的数据(方便的id字段和points的点数),posts包含post_id行的ID字段user_id,即用户的ID和value,已发布的号码本身。

现在您只需要在脚本中实现以下SQL查询:

UPDATE users INNER JOIN posts ON users.id = posts.user_id SET users.points = (users.points + 1) WHERE posts.value = 0;

最后用0替换随机抽取的数字。

此查询会做什么?使用INNER JOIN构造,它将在两个表之间创建链接。自动地,如果posts.value与我们的号码匹配,则链接 posts.user_idusers.id,知道哪个用户必须修改他/她points。如果有人赌博0,而他的ID(posts.user_id)为8170points字段将针对user.id = 8170的用户进行更新。

如果您更改查询以使其成为(users.points - 1)WHERE posts.value != 0,您将获得扣除一分的非赢家。它可以根据需要进行调整。

请注意!每次每日抽奖后,需要截断或存档posts表。

另一种选择是存储投注该号码的用户的时间戳(time()),并在执行时检查存储的时间戳...是否在该开始和结束之间当天或不。

只是一个提示:您可以使用图形数据库软件(如Microsoft Access或LibreOffice Base)将您的JOIN等模拟显示在图形显示上。它使初学者更容易为这些问题建模很多。如果您不想安装桌面软件,那么尝试安装phpMyAdmin也是另一种解决方案。


修改

非关系型数据库

如果您要使用非关系型数据库,首先需要获取所有获胜者ID

SELECT user_id FROM posts WHERE value=0;

这将为您提供多行结果。现在,您需要逐个完成此结果,然后执行以下查询:

UPDATE users SET points=(users.points + 1) WHERE id=1;

0是绘制的中奖号码,1是要更新的用户的并发id。)

不使用MySQL的关系功能,但使用MySQL数据库,脚本将如下所示:

<?php
$number = 0; // This is the winning number we have drawn

$result = mysql_query("SELECT user_id FROM posts WHERE number=" .$number);

while ( $row = mysql_fetch_assoc($result) )
{
    $curpoints_result = mysql_query("SELECT points FROM users WHERE user_id=" .$row['user_id']);
    $current_points = mysql_fetch_assoc($curpoints_results);

    mysql_query("UPDATE users SET points=" .($current_points['points'] + 1). " WHERE user_id=" .$row['user_id']);
}
?>

while构造使这个循环运行,直到结果的每一行(获胜者列表)都被更新。

哦和:我知道 MySQL是一个关系数据库,但它就是这样:示例。< / em>的