防止在php / mysql中回显两次相同的值

时间:2013-03-11 03:35:12

标签: php mysql

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

2 个答案:

答案 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