【问题标题】:Why the script saves all the time the same data?为什么脚本总是保存相同的数据?
【发布时间】:2013-05-14 15:35:40
【问题描述】:

我的 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()."'");
}

?>

数据库看起来像这样: Timestamp(ts) 和其他值相同,我做错了什么?

【问题讨论】:

  • 检查更新查询中的 where 条件。
  • 您多次致电date()。当您在午夜运行此脚本时,这不会产生不同的日期吗?
  • @spaceknarf 这可能是 h24 为空的问题

标签: php mysql cron crontab


【解决方案1】:

您在更新中缺少 where 条件

UPDATE serverstats SET ts ='".time()."'"

在更新数据库时,它应该有 where 子句 .. 你的 sql 应该是这样的\

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

如果您在更新子句中错过了where .. 那么所有记录都会更新..

注意请切换到 mysqli_* 或 PDO 。 mysql_* 不再被官方维护。

【讨论】:

  • 看起来有些数据刚刚搞砸了
  • WHERE year='".$y."' &amp;&amp; month='".$m."' &amp;&amp; day='".$d."' 一起工作,谢谢。
  • @DrewPierce .. OP 在更新记录时错过了 where 条件 .. 所以所有记录的相应列都在更新,因此数据相同
  • 我知道。我在开玩笑说他是如何猛击他所有的行的:>
  • @DrewPierce 它有时会发生在学习阶段。这就是学习的全部内容..犯错误改进并学习..不是吗? :)
【解决方案2】:

我假设,ts 不是“更新 CURRENT_TIMESTAMP”字段。这样做会更容易,将 ts 的东西留给 DB。

但是:

这两条语句

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

总是更新表中的所有记录 - 缺少 where 子句。

试试这个:

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."'");

因为否则这是读取整个表格并且您只取任意第一行。

【讨论】:

  • 一些想法:如果您在日/月/年有一个唯一(主)索引,您可以将其缩小为“INSERT INTO ..... ON DUPLICATE KEY UPDATE ....”
【解决方案3】:

看来我没有足够的代表离开 cmets 但顺便说一句,您正在使用:

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

格式为 00 到 23,但表格列为 01 - 24。

这可能会成为一个问题,例如在 00:

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

【讨论】:

  • 问题的解决方法是什么?
  • 您可以更改列名以匹配日期格式,或围绕差异编写代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
  • 1970-01-01
  • 1970-01-01
  • 2016-12-13
  • 1970-01-01
  • 2020-04-06
相关资源
最近更新 更多