2013-03-11 63 views
1

我有這個PHP腳本,每10秒鐘向用戶迴應一種新型的狗。每當頁面在十秒內重新加載時,狗都保持不變。如果超過十秒鐘,狗將會改變。防止相同的值在php/mysql中被回顯兩次

<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 | 136296
3 | Rex | 1362960178 
+0

這是有意的。我想我可以使用更新來記錄狗的使用時間,然後使用dateused <$ minute_ago來消除同樣的狗被回聲兩次。 (如果你跟着我,提供超過六十隻狗!)但是,當然,每次代碼運行時它都會被更新。這意味着狗每次都會改變,而不是保持相同的時間十秒鐘。 – Starkers 2013-03-11 03:57:13

回答

1

我認爲這個問題是,你相信你的習慣,但創意,種子值RAND()到防止出現問題:

ROUND(UNIX_TIMESTAMP()/10) 

如果相同的種子值e被使用時,產生相同的序列。我只是在這裏猜測,但我認爲你不打算在單個10秒間隔內生成相同種子值,因此序列中的第一個值總是相同的(在那段時間內),所以每次都會顯示同一只狗。

這個想法的問題是,不同的序列仍然可以以相同的值開始。因此,雖然是「隨機」,但仍有可能以相同的序列值開始兩個背對背的10秒間隔,並因此導致顯示相同的狗。

UPDATE(潛在的解決方案/猜測)
使用目前你的問題的代碼,你可以把你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秒間隔,每個方程都會產生一個不變的值。

+0

是的,您是對的:L某種解決方法的任何想法? – Starkers 2013-03-11 03:58:00

+0

@JWH試圖想到一個......對我來說這是一個艱難= P – newfurniturey 2013-03-11 04:00:14

+0

哈哈,非常感謝,如果你找到一個! – Starkers 2013-03-11 04:02:33

0

使用DISTINCT

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

'DISTINCT'爲每個重複記錄返回一個「單行」; OP只需要一條記錄(因此在他們的查詢中有'LIMIT 1'),所以這部分是照顧的。如果我理解正確的話,OP所遇到的問題是相同的「狗」是背對背地出現(即以兩個單獨的10秒間隔)。 – newfurniturey 2013-03-11 03:44:13

+0

@newfurniturey是的,你完全理解! – Starkers 2013-03-11 03:46:03