PHP分数分配

PHP分数分配,php,arrays,loops,Php,Arrays,Loops,我有一个网页,人们可以发布一个介于0和10之间的数字 每天都会有一次乐透单号码生成。我希望我的PHP脚本检查所有用户发布的数字,并为相对的赢家(或输家)分配+1或-1的分数 问题是,一旦我在DB中查询获胜用户的列表,我想更新他们的“分数”字段(在“用户”表中)。我在想这样的循环(伪代码) 但这意味着如果有100个优胜者,那么将有100个查询。有没有一种方法可以通过一个查询进行某种批量插入 提前感谢。您没有指定数字的存储方式。如果有大量的人发帖,一个好的选择是使用数据库来存储他们的号码 例如,您可

我有一个网页,人们可以发布一个介于0和10之间的数字

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

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

但这意味着如果有100个优胜者,那么将有100个查询。有没有一种方法可以通过一个查询进行某种批量插入


提前感谢。

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

例如,您可以有一个名为
lotto
的表,表中有三个字段:
posted\u number
score
email
。在
posted\u 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>
update lotto set score=score+1,其中过账号码=
更新乐透设置分数=分数-1,其中张贴的号码=

我假设您使用的是带有sql的数据库,并建议您可能希望执行以下操作

UPDATE `table` SET `score`=`score`+1 WHERE `number`=3;
对于失败者,相应的-1(奇怪,看不出有理由-1他们)


如果没有更多的细节,我无法提供进一步的帮助。

让我们假设我们有一个名为
posts
users
的数据表。 显然,
users
包含赌徒的数据(带有方便的
id
字段和
points
表示他们拥有的点数),并且
posts
包含行的
post\u id
id字段,
user\u id
,这是用户的id,而
value
,这是发布的数字本身

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

updateusers-internal-JOIN-posts-ON-users.id=posts.user\u-id-SET-users.points=(users.points+1)
其中posts.value=0

其中,末尾的
0
将替换为随机抽取的数字

此查询将做什么?使用
内部联接
构造,它将在两个表之间创建链接。如果
posts.value
与我们的号码匹配,它会自动将
posts.user\u id
链接到
users.id
,知道哪个用户必须修改其
积分。如果有人赌博
0
,并且他的ID(
posts.user_ID
)是
8170
,则
积分
字段将为拥有
user.ID=8170
的用户更新

如果将查询更改为
(users.points-1)
WHERE posts.value!=0
,非获奖者将被扣分一分。它可以根据您的需要进行任意调整

小心点在每次每日绘制之后,需要截断或归档posts表

另一个选项是存储下注号码的用户的时间戳(
time()
,在PHP中),执行时,检查存储的时间戳。。。是否介于当天的开始和结束之间

提示:您可以使用图形数据库软件(如Microsoft Access或LibreOffice Base)在图形显示器上模拟您的
加入等。它使初学者对此类问题的建模变得更加容易。如果您不想安装桌面软件,尝试安装
phpMyAdmin
也是另一种解决方案


编辑:

非关系数据库 如果要使用非关系型数据库,首先需要使用以下各项获取所有获胜者的
ID
s:

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是一个关系数据库,但它就是这样的:一个例子,所以随机选取的数字也在0到10之间?什么是相对的赢家(或输家)?他们猜错数字会得到-1,猜对数字会得到+1吗?你有代码给我们看吗?对不起,没有代码给我们看。人们得到-1表示错误的号码,+1表示正确的号码。为什么他们需要存档?因此,同一个获胜者不止一次地被夺走是没有风险的?而且,在非关系数据库上也可能这样吗?查询是什么样子的?谢谢:)@enrico#1:需要存档,因为如果在第3天和第8天绘制相同的数字(示例),那么在为第8天的获奖者评分时,第3天的获奖者也会得到另一分。@enrico对于第二条评论,您需要将查询拆分为一个。首先,获取所有获奖者的名单。然后,在所有获奖者身上添加点。(我已经更新了答案,也包括了这一点。)这也是我的想法,但是,在循环中进行查询不是一种糟糕的做法吗?
<?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']);
}
?>