0

データベースで過去 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 か月の行がいくつかあります。

クエリに何か問題がありますか?

グルズ

4

4 に答える 4

2

mysql で検索する文字列を引用符で囲む必要があります。現在は、負の整数である month_value-year_value を検索しています。

于 2013-09-09T12:40:05.457 に答える
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();

経験則: DB から何かを読み取り、各行を処理して結果の DB クエリを作成する必要がある場合、100 件中 99 件のケースで DB 内で完全に実行でき、帯域幅と時間を大幅に節約できます。

EDIT AdrianBR が問題を発見しました... 日付を文字列として保存しないでください。DBシステムは、独自に定義されたデータ型の処理に優れているため、それらを使用してください。

于 2013-09-09T12:38:58.233 に答える
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();
于 2013-09-09T12:45:38.207 に答える