我有一个网页,人们可以在0到10之间发布一个数字。
每天一次有一个乐透单号生成。我希望我的PHP脚本检查所有用户的发布号码,并为相对的赢家(或输家)分配+1或-1的分数。
问题是,一旦我向DB查询获胜用户列表,我想更新他们的“得分”字段(在“用户”表中)。我在考虑这样的循环(伪代码)
foreach winner{
update score +1
}
但这意味着如果有100名获胜者,则会有100个查询。有没有办法用一个查询进行某种批量插入?
提前致谢。
答案 0 :(得分:1)
您没有指定数字的存储方式。如果有大量的人发帖,一个很好的选择是使用数据库来存储他们的数字。
例如,您可以使用名为lotto
的表格,其中包含三个字段:posted_number
,score
和email
。在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)
我们假设我们有一个名为posts
和users
的数据表。
显然,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_id
到users.id
,知道哪个用户必须修改他/她points
。如果有人赌博0
,而他的ID(posts.user_id
)为8170
,points
字段将针对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>的