我正在尝试删除数据库中过去 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!!';
}
但我可以用我的其他人看到他是否发现了什么。它在我的数据库中找不到行,但有一些过去 2 个月的行。
我的查询做错了吗?
格兹
你必须引用你在mySQL中搜索的字符串,目前你正在搜索month_value-year_value,一个负整数
替换这个:
$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();
您有一些问题...
当绑定数据更改时,不必为每次迭代准备预准备语句:
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 种情况可以完全在数据库中完成,从而节省大量带宽和时间。
编辑阿德里安BR发现了问题...不要将日期存储为字符串。数据库系统擅长处理自己定义的数据类型,使用它们。
我的建议是,将您的"geupload"字段更改为DATETIME(或DATE)字段而不是VARCHAR,它更容易使用,并且数据库可以像处理真实日期而不是字符串一样处理此字段(如前所述)。
您可以删除行,然后像这样删除两个月以上的行:
DELETE FROM photos WHERE TIMESTAMPDIFF(MONTH, geupload, NOW()) > 2
您可以轻松地在此字段中插入或更新当前时间,如下所示:
INSERT INTO photos (.., .., geupload) VALUES (.., .., NOW())
UPDATE photos SET geupload = NOW()