1

我有这个 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
4

2 回答 2

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 秒的时间间隔,每个方程都会产生一个不变的值。

于 2013-03-11T03:54:00.633 回答
0

DISTINCT在您的查询中使用

SELECT DISTINCT name, * FROM dogs WHERE dateused<$minute_ago ORDER BY rand(ROUND(UNIX_TIMESTAMP()/10)) LIMIT 1
于 2013-03-11T03:40:58.153 回答