PHP分数分配
我有一个网页,人们可以发布一个介于0和10之间的数字 每天都会有一次乐透单号码生成。我希望我的PHP脚本检查所有用户发布的数字,并为相对的赢家(或输家)分配+1或-1的分数 问题是,一旦我在DB中查询获胜用户的列表,我想更新他们的“分数”字段(在“用户”表中)。我在想这样的循环(伪代码) 但这意味着如果有100个优胜者,那么将有100个查询。有没有一种方法可以通过一个查询进行某种批量插入PHP分数分配,php,arrays,loops,Php,Arrays,Loops,我有一个网页,人们可以发布一个介于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']);
}
?>