function pin()
{
$id = isset($_GET['id']) ? trim($_GET['id']) : '';
if (!$id)
{
$this->show_warning('no_goods_to_pin');
return;
}
$goods_mod = &m('goods');
$goods = $goods_mod->get_info($id);
$store_mod =& m('store');
$store = $store_mod->get_info($goods['store_id']);
if ($store['sgrade'] > $goods['pin_count'])
{
$data = array();
$data['pin_count'] = $goods['pin_count'] + 1;
$data['pin_time'] = gmtime();
$this->_goods_mod->edit($id, $data);
}else
{
$this->show_warning('pin_error');
return;
}
if ($this->_goods_mod->has_error())
{
$this->show_warning($this->_goods_mod->get_error());
return;
}
$this->show_message('pin_ok');
if(date("H:i:s",time()) == '00:00:00')
{
$data = array();
$data['pin_count'] = $goods['pin_count'];
$goods['pin_count']= '0';
}
}
需要歸零 pin_count 裡面的 預設值.
請問最後這段要怎樣修改或是要怎樣做 他才會在00:00:00的時候自動歸零
if(date("H:i:s",time()) == '00:00:00')
{
$data = array();
$data['pin_count'] = $goods['pin_count']= '0';
$goods['pin_count']= '0';
}
}
就這裡 每日歸零 就好
求高手解救 或是直接給我一個答案吧~~~ 謝謝
直接切入你的問題
你的
if(date("H:i:s",time()) == '00:00:00') {
}
date 的 format 是用半形 :
檢查卻是檢查全形 :
所以我想應該會不符合 if 語句的條件
給個範例參考
<?php
date_default_timezone_set("Asia/Taipei");
$now = mktime(0, 0, 0, 7, 14, 2019);
echo "now is ".date("Y-m-d H : i : s", $now)."\n";
$goods['pin_count'] = '10';
echo "pin_count before = ".$goods['pin_count']."\n";
if (date("H : i : s", $now) == '00 : 00 : 00') {
$goods['pin_count'] = '0';
}
echo "pin_count after = ".$goods['pin_count'];
?>
至於你這樣寫
觸發這段 code 時候
time() 會不會等於 00:00:00
又是另一回事了
除了 dragonH 大大說的之外,
我好奇的是,
你什麼時候觸發這個事件?
多久觸發一次?
如果沒有觸發到會怎麼樣?
就算是用Timer,
也不見得那麼準時,
說不定 23:59:59 之後就跳 00:00:01,
這種可能性也要考慮進去...
因為這是用在一個商城網站的 所以每一樣商品都會埋一個觸發這個的按鈕。然後這樣商品在前台的首頁就會至頂,每天限制可以按一到兩次. 至於有沒有準時歸零就不是很重要。只要每天有按到的商品,會在00:00:00左右自動歸零就好。
還是說您建議我改成00:00:01?
這樣OK嗎?
不是
這種通常是時間到了就執行裡面的動作
而不是執行了
才去檢查時間符不符合
也就是說執行時間一定是符合的
我聽他說起來怪怪的...
通常這種功能不應該寫在網頁裡面,
而是要另外寫...
因為網頁不見得會在00:00:00時觸發事件...
網頁?
php 不只是網頁呀
也可以寫 backend 邏輯
所以他一直沒有回答我的問題,
他到底是什麼時候、用什麼方法呼叫到的 @@
看到敘述
是不是該類商品
有點擊排序
好像是要把當天暢銷或賣過的商品
每天歸回原的位置
是避免單樣商品一直賣嗎
限制賣第幾個後
成交後就強制歸0就好
在商品那邊會有一個按鈕 按下去就會跑這段。 因為是多用戶商城 所以大家都希望自己的商品可以在最前面,不燃一下就被擠到下面去或是跑到第二頁。 所以用這得讓他們商品至頂.因為有限制了一天每樣商品只可以按兩次。兩次到後就不能再使用, 所以才希望可以每天時間一到歸零。每天每個商品可以至頂兩次 就這樣。
至於甚麼時候按,每個人的時間都不同。
另外 回小魚大大 我這段是另外寫的 不是寫到網頁裡面抵。
所以你希望他 00:00:00 的時候按下去?
是特價品限量商品嗎
基本上
要登熱門排序 有收費方式
或者會員登入時 依據買過的排序
或者每次登入購物頻道
購物商品依序更換 例如
1234 變 2341
小魚
既然每次置頂2次
應該是寫在每天第二次置頂的地方
當每天第二次置頂 當天晚上0點自動歸位吧
我是有一個按鈕每按一次可以至頂一次
$goods['pin_count'] + 1;<<< 所以每次+1
甚麼時候案都可以,按完兩次後想按第三次就會顯示 pin_error
if ($store['sgrade'] > $goods['pin_count'])
{
$data = array();
$data['pin_count'] = $goods['pin_count'] + 1;
$data['pin_time'] = gmtime();
$this->_goods_mod->edit($id, $data);
}else
{
$this->show_warning('pin_error');
return;
}
不是希望他們00:00:00按下去, 是單純希望這段程式可以自動在00:00:00的時候在資料庫裡面的PIN_COUNT內的預設值 歸零。
我先釐清一下你現在的情況,
所以每個商品都有一個PIN_COUNT,
當使用者按下PIN_COUNT的時候排序就會往前移(商品那麼多, 這怎麼實現的?),
希望每天 00:00:00 的時候讓所有的PIN_COUNT歸零,
是這樣子嗎?
那不是就用Timer下去跑就好嗎?
所以現在是遇到什麼問題?
回小魚大大的話
所以每個商品都有一個PIN_COUNT,
A: 每個都有一個
"商品那麼多, 這怎麼實現的"
A:是利用上架的時間決定順序。$data['pin_time'] = gmtime();
每按一次商品時間就會跟新,這樣就自動至頂了。
2.希望每天 00:00:00 的時候讓所有的PIN_COUNT歸零,
A 是的
3.所以現在是遇到什麼問題?
A: 不知道要怎樣寫 XDDDDDDD....所以求救
請大大在明示一下 感謝萬分。。
基本上的做法就是用Timer下去跑,
每秒跑一次,
不過電腦在執行會有些誤差,
所以我通常會判斷 00:00 的時候跑,
但是用一個變數去記錄今天有沒有執行過了...
也就是說執行過了就擋掉,
所以一天只會觸發一次而已.
不過如果半夜的時候Server掛掉這就沒辦法了 XD
基本上的做法就是用Timer下去跑,
每秒跑一次,
每秒跑一次...認真的嗎
php應該也有 schedule 功能的套件吧
就算沒有也可以透過 os 的 task 來執行
也就是回到我最最最一開始說的
你應該是符合時間去執行某個 php file 或 function
而不是在某個 php file 或 function 中
才檢查是否符合時間
因為你很難保證你原本的做法
code 跑到你要判斷時間那段
是否還是為 00:00:00
或許已經變 00:00:01也說不定
用我提到的方法
就能確保該 php file 或 function
是在時間 00:00:00
才被調用的
你思考的東西完全錯誤。
正確的做法是,你得要有一個儲存的過期時間才行。再利用排程或是程式排程來處理。
也就是說,當運行判斷之後,你就得將記錄改成下一週期的到期日。
如你是要每日的00:00:00運行。當你在2019-01-01 00:00:??時。在重置的同時,就順便記錄到2019-01-02 00:00:00。
也就是說,你只要去判斷你儲存的「重置時間段」
你犯的問題如下
1.直接用時分秒當判斷條件。尤其用到秒。你還不是用大於跟小於的判斷式(當然照你目前的做法,也不能用大於跟小於。)因為php是沒辦法確保當時跑的時間一定是 00:00:00 有可能會有誤差1~2秒的可能性。只要跳過了。你永遠都不可能達到條件。
2.非顯示值的東西,不需要額外字元去影響判斷處理
也就是說你這一段
if(date("H : i : s", $now) == '00 : 00 : 00')
根本是自已再砸自已的腳。
認真來說,我的判斷式會用如下處理
if(date("His", $now) == '000000')
不需要額外的空白跟:。如果要當顯示值的話。也會另外處理出來。
(而且你這是直接函數並無顯示的問題)