超过一周时更新mysql行

时间:2012-09-02 14:14:46

标签: php mysql

我想使用代表状态的数字更新mySql行。例如:

1 = New
2 = Old

默认情况下,将新数据添加到mySql时。状态自动设置为“1”。这就是重点。当天超过一周(7天)时,我想自动将其更新为“2”。这是代码:

<?php
$_toDay=date("Y-m-d");
.....
while($rec_gid=mysql_fetch_array($result_gid)){
$gid=$rec_gid['goods_id'];
$dateDB=$rec_gid['goods_date'];

$_diff = abs(strtotime($_toDay) - strtotime($dateDB));
$_years = floor($_diff / (365*60*60*24));
$_mon = floor(($_diff - $_years * 365*60*60*24) / (30*60*60*24));
$_days = floor(($_diff - $_years * 365*60*60*24 - $_mon*30*60*60*24)/ (60*60*24));

if($_days>7){//if older than a week then change status
$sql_updStts="update goods_db set stts='2' where id='$_gid'";
$result_updStts=mysql_db_query($dbname,$sql_updStts);
}//close while
?>

我已经尝试过这个脚本,但结果并不像我预期的那样。即使是$ _days也超过一周。 mySql没有更新。我不知道为什么。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

尝试

 UPDATE goods_db SET stts = '2' 
 WHERE DATEDIFF(CURDATE(),goods_date) >= 7 
 AND stts='1'

答案 1 :(得分:1)

使用 PDO MYSQLI 来避免SQL注入

使用PDO扩展的示例:

<?php

    $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
    $stmt->bindParam(1, $name);
    $stmt->bindParam(2, $value);

    // insert one row
    $name = 'one';
    $value = 1;
    $stmt->execute();

?>

所以在你的情况下

<?php

    $query = "UPDATE Goods_DB 
              SET stts = ? 
              WHERE DATEDIFF(CURDATE(),goods_date) > 6 AND stts = ?"

    $valueA = 2;
    $valueB = 1;

    $stmt = $dbh->prepare($query);
    $stmt->bindParam(1, $valueA);
    $stmt->bindParam(2, $valueB);


    $stmt->execute();

?>

养成使用PDO或MySQLi Extension的习惯。

执行此操作的另一个方法是在服务器上创建EVENT SCHEDULER。在这种情况下,服务器将每天自动更新goods_db

DELIMITER $$
CREATE
    EVENT `archive_blogs`
    ON SCHEDULE EVERY 1 DAY
    DO BEGIN
                  UPDATE Goods_DB 
                  SET stts = 2 
                  WHERE DATEDIFF(CURDATE(),goods_date) > 6 AND stts = 1;
    END $$
DELIMITER ;

<强> More on this link (How to Create Scheduled Events in MySQL).

答案 2 :(得分:0)

您是要保存$_gid还是$gid? 试试这个

$sql_updStts=sprintf("update goods_db set stts='2' where id='%s'",$_gid)