2013-03-10 64 views
0

我有關於擁有「每日一隻狗」部分的狗品種的網站。我希望'一天的狗'每天一次顯示一條新狗(來自mysql數據庫)。使用php和mysql,我想這個操作其實很簡單。使用PHP和Mysql每週查詢一次隨機數據庫

$connection = mysqli_connect("localhost", "username", "password"); 

$randomdog = mysqli_query($connection, "SELECT * FROM dogtable WHERE id >= RAND() * (SELECT MAX(id) FROM dogtable) LIMIT 1")); 

echo $randomdog 

當然,這給了我一個隨機狗每次頁面重新加載。我想$ randomdog只能每天更換一次。

cron工作是否會成爲答案?我以前從來沒有實現過,但我在我的網站上安裝了cpanel,所以我不認爲它會太毛茸茸。

如果我是用cron作業,我假設我會來救

$connection = mysqli_connect("localhost", "username", "password"); 

$randomdog = mysqli_query($connection, "SELECT * FROM dogtable WHERE id >= RAND() * (SELECT MAX(id) FROM dogtable) LIMIT 1")); 

爲每天進行一次由cron作業運行PHP文件,更新$ randomdog每天一次。但是,那麼我怎麼能通過$ randomdog到一個單獨的頁面來回應?

我以前在這裏問過類似的問題,答案通常沿着「存儲一個unixtimestamp,在它的一週時間,在當前時間==時間+ 1周後再次執行」。

這是不可能的與PHP?它只能在用戶請求時執行,當然?意思是'時間+ 1周'變量不可能存儲在某個地方。

無論如何,通過一切手段糾正我。

+0

如何在PHP與當前一週播種隨機數發生器? – Ryan 2013-03-10 00:42:29

回答

4

是的,你可以使用rand()來獲得一個隨機項目。您希望它被播種,因此每次調用時都會返回相同的初始rand值。你希望每天都用相同的種子播種。您可以使用dayofyear()獲取一年中的某一天(1-366)。格式爲:

select * from TABLE order by rand(dayofyear(CURRENT_DATE)) limit 1 
+0

你能解釋'播種'嗎? – Starkers 2013-03-10 01:20:58

+0

哇,剛試過這個: srand(floor(time()/(60 * 60 * 24 * 7))); echo rand()%100; 你知道這是如何工作的嗎?這個號碼在哪裏存儲? *編輯其實,我只是在不同的瀏覽器中嘗試過,並得到了不同的編號。它需要對每個用戶都一樣。 – Starkers 2013-03-10 01:30:43

+1

僞隨機數發生器(PRNG)用於在計算機中產生我們稱之爲「隨機數」的東西。它們並不是真正的隨機。它們是從一個種子值開始並在其上反覆運行一個函數而產生的數字序列。一個簡單的(愚蠢的)將從一個種子開始,運行「seed = seed * 13%7」來獲得下一個隨機數。通過使用相同的種子,每當你詢問隨機數時,你都會得到相同的序列。這就是爲什麼你應該在使用之前播種隨機數發生器。 – kainaw 2013-03-10 01:34:41

0

您可以創建另一個表,大概含有隻是單行將存儲一天的當前選擇的狗 - 它可能只是有單一的唯一的ID指向dogtable

過夜cron作業將更新此表。它不一定是隨機的,它可以使用更先進的技術,例如查看網站使用歷史,以實際選擇更受歡迎的狗。

網站將使用此dogoftheday表來顯示當天的狗。

+0

可能更好地選擇不太受歡迎的狗 – 2013-03-10 01:38:50

0

我可以看到很多的方式來做到這一點,而最簡單的(不是簡單)的方法是如下:

使用cron作業(你可以從的cPanel很容易安裝),cron作業將選擇一個隨機的選擇和存儲,我建議在下面的方法來存儲它

  1. 在表中添加一個新的FIEL,不爲空,默認值設定爲0,只爲這一天選擇的狗會值爲1 (將通過cronjob腳本更新)
  2. 如果你有興趣更先進的東西,如保持每日選定的狗的歷史(例如,g:每週或每月兩次不選擇相同),創建一個新的表格,您可以將選擇的狗/天,如果您按時間排序,今天的狗是最新的插入記錄
  3. 如果您不感興趣在保持跟蹤,或任何先進的東西,並希望有自己的方式(優化一些東西,關於性能和內存),使cron作業寫入到文件

我希望這有助於

0
  1. 創建一個表來存儲r andom ID和初始化它

CREATE TABLE random_dog 
(
    INT id 
); 

INSERT INTO random_dog VALUES(RAND()); 
  1. 檢查是否有事件運行 - 看到this

  2. 創建事件

CREATE EVENT 
ON SCHEDULE EVERY DAY STARTS '00:00:00' 
ON COMPLETION PRESERVE 
DO UPDATE random_dog SET id = RAND(); 
  1. 用於查詢簡單地使用random_dog表

SELECT * FROM dogtable 
JOIN random_dog ON (random_dog.id = dogtable.id)