【问题标题】:Prevent the same value from being echoed twice in php/mysql防止相同的值在 php/mysql 中被回显两次
【发布时间】:2013-02-26 04:02:56
【问题描述】:

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

【问题讨论】:

  • 这是故意的。我想我可以使用更新记录一条狗被使用的时间,然后使用 dateused

标签: php mysql


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

【讨论】:

  • 是的,你是对的 :L 是否有某种解决方法的暗示?
  • @JWH 试着想一个……这对我来说很难=P
  • @JWH 我已经为你做了一个猜测。试一试,让我知道它是否有效=]
  • 啊,不怕。实施,并理解你的推理,但它没有奏效。哦,好吧,用双关语,我想我是在叫错树,应该是使用 cron 工作:) 再次感谢
【解决方案2】:

在您的查询中使用DISTINCT

SELECT DISTINCT name, * FROM dogs WHERE dateused<$minute_ago ORDER BY rand(ROUND(UNIX_TIMESTAMP()/10)) LIMIT 1

【讨论】:

  • DISTINCT 为每条重复记录返回一个“单行”; OP 只需要一条记录(因此在他们的查询中使用 LIMIT 1),所以这部分得到了处理。如果我理解正确,OP 遇到的问题是同一条“狗”背靠背出现(即在两个单独的 10 秒间隔内)。
  • @newfurniturey 是的,你完全明白了!
猜你喜欢
  • 2013-10-25
  • 2015-04-23
  • 1970-01-01
  • 2015-04-16
  • 1970-01-01
  • 2015-12-29
  • 2014-02-05
  • 2016-01-19
  • 2015-07-12
相关资源
最近更新 更多