簡體   English   中英

PHP-將隨機查詢結果保留24小時

[英]PHP - Keep randomized query results for 24 hours

我有一個顯示隨機結果的簡單查詢,但是我希望每個訪問者都能在24小時內保持相同的結果,因此它不會在每次頁面刷新時隨機出現。 這是查詢:

<?php
$rs1= mysql_query("
SELECT * FROM Table_1
ORDER BY RAND()
LIMIT 4
");
while ($row1= mysql_fetch_array($rs1)) { ?>

我知道我需要以某種方式使用日期。 我確實弄清楚了如何獲得一個隨機數字顯示24小時:

<?php
date_default_timezone_set('America/Los_Angeles');
mt_srand(date('Ymd'));
$number = mt_rand(50, 5000);
mt_srand();  //reset for other calls

echo $number;
?>

但是我不確定如何使它與原始查詢一起使用。 有任何想法嗎? 還是我應該創建一個cookie而不是僅使用php來做? 我將如何使用它?

如果您必須計算大量行,但是不使用cookie或任何特殊數據來保留選擇,則這會占用大量CPU。

select * from table order by md5(concat(id,curdate())) limit 4

將在同一天的每個查詢上顯示相同的順序。 如果希望根據用戶進行查詢而有所不同,但當天仍然相同,則也可以將其ID添加到concat中。

select * from table order by md5(concat(id,userID,curdate())) limit 4

應該說,結果不再是隨機的,可以由接任者預測。 您也可以添加種子,以減輕這種影響。

將您正在使用的日期種子傳遞到查詢中。 MySQL的rand()函數還帶有一個種子,該種子將使您的隨機結果相同。

http://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_rand

由於不建議使用mysql,因此以下示例使用mysqli擴展名。

<?php
date_default_timezone_set('America/Los_Angeles');
mt_srand(date('Ymd'));
$number = mt_rand(50, 5000);

$mysqli = new mysqli("localhost", "user", "password", "database");
$stmt = $mysqli->prepare("SELECT * FROM Table_1 ORDER BY RAND(?) LIMIT 4");
$stmt->bind_param('i', $number);
$stmt->execute();

您也可以在查詢中完成所有操作

SELECT * FROM Table_1 ORDER BY RAND(CAST(CONCAT(YEAR(), MONTH(), DAY()) AS UNSIGNED)) LIMIT 4

或者您想從日期中獲取任何種子。

將結果保存/緩存到文件中(使用serialize()),然后使用該文件的內容來生成頁面。 然后根據需要每24小時刷新一次該文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM