我有这个PHP脚本,每隔十秒就向用户回送一种新型的狗。每次在十秒钟内重新加载页面时,狗都会保持不变。如果超过十秒钟,狗就会改变。
<head>
<title>New Dog Every Ten Seconds!</title>
<?php
$mysqli = new mysqli("localhost", "root","root","dogshow");
if ($mysqli->connect_errno) {
printf("Connect failed: ", $mysqli->connect_error);
exit();
}
?>
</head>
<body>
<?php
echo $currenttime = time();
echo '<br>';
echo $minute_ago = $currenttime - 60;
echo '<br>';
$result = $mysqli->query("SELECT * FROM dogs WHERE dateused<$minute_ago ORDER BY rand(ROUND(UNIX_TIMESTAMP()/10)) LIMIT 1");
$row = mysqli_fetch_array($result);
echo 'uid = ' . $row['uid'] . '<br>';
$uid = $row['uid'];
echo 'dogname = ' . $row['dogname'] . '<br>';
//$result = $mysqli->query("UPDATE dogs SET dateused=$currenttime WHERE uid=$uid");
?>
</body>
</html>
效果很好,但它有一个游戏停止错误。有时,同一只狗出现两次!我需要做的就是阻止同样的狗出现两次。
我尝试了很多东西(整晚都在这里),但没有任何作用!真的,真的很感激帮助。
数据库原理图如下:
Table Name = dogs
id | name | dateused
------------------------
1 | Rover | 1362960167
2 | Chip | 1362960123
3 | Rex | 1362960178
答案 0 :(得分:1)
我认为问题在于您信任RAND()
的自定义但有创意的种子值以防止此问题:
ROUND(UNIX_TIMESTAMP()/10)
如果使用相同的种子值,则产生相同的序列。我只是在这里猜测,但我认为你不会想到单个10秒间隔会生成相同的种子值,因此序列中的第一个值将始终相同(在那个间隔期间),每次都会显示相同的狗。
这个想法的问题在于,不同的序列仍然可以以相同的值开始。因此,虽然“随机”,但仍然有可能以相同的序列值开始两个背对背的10秒间隔,从而导致显示相同的狗。
更新(潜在解决方案/猜测)
使用当前问题中的代码,您可以使用UPDATE
子句并更改“略微”保存的时间戳。不要保存$currenttime
值,只需保存ROUND(UNIX_TIMESTAMP() / 10)
- 您用于种子值的值。因此,更新行将如下所示:
$mysqli->query("UPDATE dogs SET dateused=ROUND(UNIX_TIMESTAMP() / 10) WHERE uid=$uid");
如果您这样做,可以使用$minute_ago = round((time() - 60) / 10);
并在SELECT
查询中按原样使用它,以便让事情顺利进行。
这背后的原因是ROUND(UNIX_TIMESTAMP() / 10)
将为每10秒间隔生成相同的值,round((time() - 60) / 10)
也是如此。因此,对于任何10秒间隔,每个等式将产生不变的值。
答案 1 :(得分:0)
在您的查询中使用DISTINCT
SELECT DISTINCT name, * FROM dogs WHERE dateused<$minute_ago ORDER BY rand(ROUND(UNIX_TIMESTAMP()/10)) LIMIT 1