使用过去2个月(日期)

时间:2013-09-09 12:29:43

标签: php mysql sql

我正在尝试删除我数据库中的过去2个月。

我正在保存数据库中的内容,例如格式为date("n-Y");,输出结果为8-2013

现在我试图像这样删除过去2个月:

代码:

echo "<h2>Opruimen.</h2>";

$AFGELOPENMAAND = date("n-Y",strtotime("-1 Months"));
$AFGELOPENMAAND2 = date("n-Y",strtotime("-2 Months"));

$result = $pdo->prepare("SELECT * FROM photos WHERE geupload = $AFGELOPENMAAND OR geupload = $AFGELOPENMAAND2");
$result->execute();
$hoeveel = $result->rowCount();

if($hoeveel != 0){
    foreach($result as $row){
        unlink($row["thumb"]);
        unlink($row["location"]);

        $resultDEL = $pdo->prepare('DELETE FROM photos WHERE id = :id');
        $resultDEL->execute(array(':id' => $row["id"]));

        echo 'De vorige 2 maanden zijn verwijdert.';
        echo '<meta http-equiv="refresh" content="2; URL=admin.php">';  
    }
}else{
    echo 'Deze actie is al uitgevoerd of het is niet nodig!!';
}

但我可以和别人一起看,如果他发现了什么。并且它在我的数据库中找不到行,但是在过去的两个月里有一些行。

我的查询有问题吗?

GRZ

4 个答案:

答案 0 :(得分:2)

你必须引用你在mysql中搜索的字符串,目前你正在搜索month_value-year_value,一个负数int

答案 1 :(得分:1)

你有一些问题......

当绑定数据发生变化时,不必为每次迭代准备预备语句:

if($hoeveel != 0){
    $resultDEL = $pdo->prepare('DELETE FROM photos WHERE id = :id'); //put it here
    foreach($result as $row){
        unlink($row["thumb"]);
        unlink($row["location"]);

        $resultDEL->execute(array(':id' => $row["id"]));

        echo 'De vorige 2 maanden zijn verwijdert.';
        echo '<meta http-equiv="refresh" content="2; URL=admin.php">';  
    }
}else{
   echo 'Deze actie is al uitgevoerd of het is niet nodig!!';
}

然而您也可以直接删除它们:

$result = $pdo->prepare("DELETE FROM photos WHERE geupload = $AFGELOPENMAAND OR geupload = $AFGELOPENMAAND2");
$result->execute();

经验法则:当您从数据库中读取内容并且必须处理每一行以便生成数据库查询时,在100个案例中有99个您可以完全在数据库中完成它,节省了大量的带宽和时间。

编辑 AdrianBR发现问题...不要将日期存储为字符串。 DB系统善于处理自己定义的数据类型,使用它们。

答案 2 :(得分:1)

替换它:

$result = $pdo->prepare("SELECT * FROM photos WHERE geupload = $AFGELOPENMAAND OR geupload = $AFGELOPENMAAND2");
$result->execute();

用这个

$result = $pdo->prepare("SELECT * FROM photos WHERE geupload = '".$AFGELOPENMAAND."' OR  geupload = '".$AFGELOPENMAAND2."'");
$result->execute();

答案 3 :(得分:0)

我的建议是,将你的“geupload”字段更改为DATETIME(或DATE)字段而不是VARCHAR,它更容易使用,数据库可以像真实日期而不是字符串一样处理这个字段(如前所述) )。

你可以删除这些行,比这更长的两个月:

DELETE FROM photos WHERE TIMESTAMPDIFF(MONTH, geupload, NOW()) > 2

您可以轻松地将当前时间插入或更新到此字段中,如下所示:

INSERT INTO photos (.., .., geupload) VALUES (.., .., NOW())

UPDATE photos SET geupload = NOW()