1

我想用一个代表状态的数字来更新 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 没有更新。我不知道为什么。任何的想法?

4

3 回答 3

1

尝试

 UPDATE goods_db SET stts = '2' 
 WHERE DATEDIFF(CURDATE(),goods_date) >= 7 
 AND stts='1'
于 2012-09-02T14:17:59.537 回答
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 中创建计划事件)。

于 2012-09-02T14:23:09.420 回答
0

你是想保存$_gid还是$gid?试试这个

$sql_updStts=sprintf("update goods_db set stts='2' where id='%s'",$_gid)
于 2012-09-02T14:24:09.960 回答