iT邦幫忙

0

歸零某資料 本人新手求救

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';
}
}

就這裡 每日歸零 就好
https://ithelp.ithome.com.tw/upload/images/20190715/20119034yi5fKVIZ8f.png

求高手解救 或是直接給我一個答案吧~~~ 謝謝

甲土豆 iT邦新手 5 級 ‧ 2019-07-17 13:36:14 檢舉
長的真像PHP
0
dragonH
iT邦高手 1 級 ‧ 2019-07-14 11:51:01

直接切入你的問題

你的

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

又是另一回事了

看更多先前的回應...收起先前的回應...
seantram iT邦新手 5 級 ‧ 2019-07-14 13:45:18 檢舉

如果我把
$now = mktime(0, 0, 0, 7, 14, 2019);
改成
$now = gmmtime();
是否也可以呢?

seantram iT邦新手 5 級 ‧ 2019-07-14 13:45:55 檢舉

gmtime

dragonH iT邦高手 1 級 ‧ 2019-07-14 16:28:22 檢舉

mktime 只是我用來舉例的

你應該要的是取得當時的時間吧

這樣 gmtime 應該也不行

seantram iT邦新手 5 級 ‧ 2019-07-16 09:19:15 檢舉
  我想問一下 
   
   echo "now is ".date("Y-m-d H : i : s", $now)."\n";
    $goods['pin_count'] = '10';

是甚麼意思
其中的"\n";跟 '10'; 又是甚麼呢?

dragonH iT邦高手 1 級 ‧ 2019-07-16 09:23:31 檢舉

\n 是換行
10 只是用來舉例的預設值

你的問題都用不到就是了

0
小魚
iT邦高手 1 級 ‧ 2019-07-14 13:32:15

除了 dragonH 大大說的之外,
我好奇的是,
你什麼時候觸發這個事件?
多久觸發一次?
如果沒有觸發到會怎麼樣?
就算是用Timer,
也不見得那麼準時,
說不定 23:59:59 之後就跳 00:00:01,
這種可能性也要考慮進去...

看更多先前的回應...收起先前的回應...
seantram iT邦新手 5 級 ‧ 2019-07-14 13:44:28 檢舉

因為這是用在一個商城網站的 所以每一樣商品都會埋一個觸發這個的按鈕。然後這樣商品在前台的首頁就會至頂,每天限制可以按一到兩次. 至於有沒有準時歸零就不是很重要。只要每天有按到的商品,會在00:00:00左右自動歸零就好。

seantram iT邦新手 5 級 ‧ 2019-07-14 13:48:33 檢舉

還是說您建議我改成00:00:01?
這樣OK嗎?

dragonH iT邦高手 1 級 ‧ 2019-07-14 14:37:06 檢舉

不是

這種通常是時間到了就執行裡面的動作

而不是執行了

才去檢查時間符不符合

也就是說執行時間一定是符合的

小魚 iT邦高手 1 級 ‧ 2019-07-14 15:20:07 檢舉

我聽他說起來怪怪的...
通常這種功能不應該寫在網頁裡面,
而是要另外寫...
因為網頁不見得會在00:00:00時觸發事件...

dragonH iT邦高手 1 級 ‧ 2019-07-14 15:32:28 檢舉

網頁?/images/emoticon/emoticon19.gif

php 不只是網頁呀

也可以寫 backend 邏輯

小魚 iT邦高手 1 級 ‧ 2019-07-14 16:58:05 檢舉

所以他一直沒有回答我的問題,
他到底是什麼時候、用什麼方法呼叫到的 @@

newkevin iT邦高手 1 級 ‧ 2019-07-14 20:01:24 檢舉

看到敘述
是不是該類商品
有點擊排序
好像是要把當天暢銷或賣過的商品
每天歸回原的位置
是避免單樣商品一直賣嗎
限制賣第幾個後
成交後就強制歸0就好

seantram iT邦新手 5 級 ‧ 2019-07-14 20:11:17 檢舉

在商品那邊會有一個按鈕 按下去就會跑這段。 因為是多用戶商城 所以大家都希望自己的商品可以在最前面,不燃一下就被擠到下面去或是跑到第二頁。 所以用這得讓他們商品至頂.因為有限制了一天每樣商品只可以按兩次。兩次到後就不能再使用, 所以才希望可以每天時間一到歸零。每天每個商品可以至頂兩次 就這樣。

至於甚麼時候按,每個人的時間都不同。

seantram iT邦新手 5 級 ‧ 2019-07-14 20:14:10 檢舉

另外 回小魚大大 我這段是另外寫的 不是寫到網頁裡面抵。

小魚 iT邦高手 1 級 ‧ 2019-07-14 21:30:46 檢舉

所以你希望他 00:00:00 的時候按下去?

newkevin iT邦高手 1 級 ‧ 2019-07-15 06:14:50 檢舉

是特價品限量商品嗎
基本上
要登熱門排序 有收費方式
或者會員登入時 依據買過的排序
或者每次登入購物頻道
購物商品依序更換 例如
1234 變 2341

newkevin iT邦高手 1 級 ‧ 2019-07-15 06:17:59 檢舉

小魚
既然每次置頂2次
應該是寫在每天第二次置頂的地方
當每天第二次置頂 當天晚上0點自動歸位吧

seantram iT邦新手 5 級 ‧ 2019-07-15 07:31:04 檢舉

我是有一個按鈕每按一次可以至頂一次
$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內的預設值 歸零。
小魚 iT邦高手 1 級 ‧ 2019-07-15 07:55:15 檢舉

我先釐清一下你現在的情況,
所以每個商品都有一個PIN_COUNT,
當使用者按下PIN_COUNT的時候排序就會往前移(商品那麼多, 這怎麼實現的?),
希望每天 00:00:00 的時候讓所有的PIN_COUNT歸零,
是這樣子嗎?

那不是就用Timer下去跑就好嗎?
所以現在是遇到什麼問題?

seantram iT邦新手 5 級 ‧ 2019-07-15 08:13:25 檢舉

回小魚大大的話
所以每個商品都有一個PIN_COUNT,
A: 每個都有一個

"商品那麼多, 這怎麼實現的"
A:是利用上架的時間決定順序。$data['pin_time'] = gmtime();
每按一次商品時間就會跟新,這樣就自動至頂了。

2.希望每天 00:00:00 的時候讓所有的PIN_COUNT歸零,
A 是的

3.所以現在是遇到什麼問題?
A: 不知道要怎樣寫 XDDDDDDD....所以求救
請大大在明示一下 感謝萬分。。

小魚 iT邦高手 1 級 ‧ 2019-07-15 09:08:24 檢舉

基本上的做法就是用Timer下去跑,
每秒跑一次,
不過電腦在執行會有些誤差,
所以我通常會判斷 00:00 的時候跑,
但是用一個變數去記錄今天有沒有執行過了...
也就是說執行過了就擋掉,
所以一天只會觸發一次而已.
不過如果半夜的時候Server掛掉這就沒辦法了 XD

dragonH iT邦高手 1 級 ‧ 2019-07-15 09:52:23 檢舉

基本上的做法就是用Timer下去跑,
每秒跑一次,

每秒跑一次...認真的嗎/images/emoticon/emoticon16.gif

php應該也有 schedule 功能的套件吧

就算沒有也可以透過 os 的 task 來執行

也就是回到我最最最一開始說的

你應該是符合時間去執行某個 php file 或 function

而不是在某個 php file 或 function 中

才檢查是否符合時間

因為你很難保證你原本的做法

code 跑到你要判斷時間那段

是否還是為 00:00:00

或許已經變 00:00:01也說不定

用我提到的方法

就能確保該 php file 或 function

是在時間 00:00:00

才被調用的

給你參考

0
D_L
iT邦新手 5 級 ‧ 2019-07-15 10:36:31

PIN_COUNT是存在資料庫的欄位?
那怎麼不用事件排程把值歸零就好

seantram iT邦新手 5 級 ‧ 2019-07-15 14:49:37 檢舉

https://ithelp.ithome.com.tw/upload/images/20190715/20119034acpasK15Uw.png

就這。感覺起來不難 但是我不會XD

0
浩瀚星空
iT邦大師 1 級 ‧ 2019-07-15 13:16:18

你思考的東西完全錯誤。
正確的做法是,你得要有一個儲存的過期時間才行。再利用排程或是程式排程來處理。

也就是說,當運行判斷之後,你就得將記錄改成下一週期的到期日。
如你是要每日的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')

不需要額外的空白跟:。如果要當顯示值的話。也會另外處理出來。
(而且你這是直接函數並無顯示的問題)

我要發表回答

立即登入回答