2013-05-14 69 views
1

我的php腳本出現問題,系統每分鐘運行一次。爲什麼腳本一直保存相同的數據?

我的PHP腳本是這樣的:

<?php 
$y = date("Y", time()); 
$m = date("m", time()); 
$d = date("d", time()); 
$h = date("H", time()); 

mysql_connect("localhost", "root", ""); 
mysql_select_db("dashboard"); 

$check_date = mysql_query("SELECT year,month,day FROM serverstats WHERE year='".$y."' && month='".$m."' && day='".$d."'"); 

if(mysql_num_rows($check_date)==0) { 
    mysql_query("INSERT INTO serverstats (year,month,day,h01,h02,h03,h04,h05,h06,h07,h08,h09,h10,h11,h12,h13,h14,h15,h16,h17,h18,h19,h20,h21,h22,h23,h24) 
     VALUES (
     '".$y."', '".$m."', '".$d."', NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL 
     ); 
    ") or die(mysql_error()); 
} else { 
    $load = file_get_contents("/proc/loadavg"); 
    $load = explode(' ', $load); 
    $total_load = $load[0] + $load[1] + $load[2]; 

    $last_load = mysql_query("SELECT h".$h." FROM serverstats"); 
    $daten = mysql_fetch_array($last_load); 
    $total = $daten["h".$h.""]+$total_load; 

    mysql_query("UPDATE serverstats SET h".$h."='".$total."'"); 
    mysql_query("UPDATE serverstats SET ts ='".time()."'"); 
} 

?> 

和數據庫看起來是這樣的: 的時間戳(TS)和其他值是一樣的,我怎麼做了? enter image description here

+2

檢查WHERE條件的更新查詢。 – Sundar 2013-05-14 06:33:57

+0

您正在多次調用'date()'。當你在午夜左右運行這個腳本時,不會產生不同的日期嗎? – 2013-05-14 06:56:01

+0

@spaceknarf這可能是爲什麼h24是空的問題 – Evolutio 2013-05-14 07:05:26

回答

2

你缺少其中更新條件

​​

在更新數據庫,應該有where子句..你的SQL應該像\

UPDATE serverstats SET ts ='".time()."' Where = 'your condition'" 

如果你錯過where更新條款..然後所有記錄將得到更新..

N OTE請切換到mysqli_ *或PDO。 mysql_ *不再正式維護。

+0

看起來像一些數據剛剛弄亂了 – Drew 2013-05-14 06:35:18

+0

'WHERE year ='「。$ y。」'&& month ='「。$ m。」'&& day =' 「。$ d。」'''起作用,thx。 – Evolutio 2013-05-14 06:36:39

+0

@Evolutio很樂意幫助你 – alwaysLearn 2013-05-14 06:37:08

1

我認爲,ts不是「更新CURRENT_TIMESTAMP」字段。有了這個會讓事情變得更容易,把事情留給數據庫。

但是: - where子句缺少

這兩個語句

mysql_query("UPDATE serverstats SET h".$h."='".$total."'"); 
mysql_query("UPDATE serverstats SET ts ='".time()."'"); 

威爾總是在表更新的所有記錄。

試試這個:

mysql_query("UPDATE serverstats SET h".$h."='".$total."', ts ='".time()."' ". 
      " WHERE year='".$y."' && month='".$m."'` && day='".$d."'"); 

,顯然

$last_load = mysql_query("SELECT h".$h." FROM serverstats " . 
" WHERE year='".$y."' && month='".$m."'` && day='".$d."'"); 

否則這是讀取整個表,你只需服用任意第一行。

+0

一些想法:如果你在日/月有獨特的(主要)索引/年,您可能會將其縮小爲「INSERT INTO ..... ON DUPLICATE KEY UPDATE ....」 – 2013-05-14 06:51:06

1

看來我沒有足夠的代表留下評論,但順便說一句,你使用:

$h = date("H", time()); 

這是在00至23,但該表列01的形式 - 24 。

這可能在00成爲例如一個問題:

$last_load = mysql_query("SELECT h".$h." FROM serverstats"); 
... 
+0

問題的解決方案是什麼? – Evolutio 2013-05-14 08:43:35

+0

您可以更改列名以匹配日期格式或代碼。 – gratz 2013-05-14 13:03:00

相關問題