更新mysql行时超过一周


update mysql row when more than a week

我想用一个表示状态的数字更新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
?>

我试过这个剧本,但结果并不像我预期的那样。即使是$_day也超过一周。mySql未更新。我不知道为什么。知道吗?

尝试

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

使用PDOMYSQLI来避免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扩展的习惯。

这样做的另一件事是在服务器上创建一个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 ;

关于此链接的更多信息(如何在MySQL中创建计划事件)

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

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