1

wp_pagesvisitesテーブルから行を削除しようとしています。

global $wpdb;
$time = time();


$timebd = $wpdb->get_col("SELECT Timestamp FROM wp_pagesvisites");


foreach ($timebd as $v)
{
    //echo ($time - $v)."  -  ";

    if ($v - $time > 600)
    {   

        $wpdb->query(   
                $wpdb->exec(
                    "DELETE FROM wp_pagesvisites WHERE Timestamp=$v"
                )
        );
    }
}

$ time-$ vでエコーを実行すると、600を超えるものもあるため、if条件に入ります。したがって、SQLクエリが適切ではないと思います。うまくいけば、あなたは私のエラーを見ることができます。

4

3 に答える 3

3

あなたは「$time - $v、いくつかは600より大きい」と言いますが、あなたのif条件はその逆です(すなわち$v - $time

于 2013-01-18T23:48:23.257 に答える
1

警告-SQLインジェクションを受け入れているようです。パラメータ化されたクエリを使用する必要があります。また、これについては、可能な限り最も非効率的な方法で実行しています(すべての行をループすることにより)。あなたがすべきことは、SQLに特定の年齢以上の行を削除するように指示することです。これらの線に沿った何か(あなたの環境/言語で動作するために微調整が必​​要な場合があります):

$time = time() - 600;

$wpdb->query(   
     $wpdb->exec(
          "DELETE FROM wp_pagesvisites WHERE Timestamp < $time"
     )
);

...そしてそれはあなたのためにすべての行を削除するはずです。


@maviliが言及している問題に加えて、日付/時刻/タイムスタンプが間違っていることも考えています。すべてを特定の範囲内に収めたい場合は、すべての値を自分自身と比較します。タイムスタンプはdoubleのように考えるのがほぼ最善です。タイムスタンプを互いに正確に比較することはできず、範囲(、、など)の一部としてのみ比較でき>=ます<

于 2013-01-18T23:52:40.557 に答える
0

あなたはこれを行うことができます :

$bddデータベース

$ wpdb = $ bdd-> prepare( "DELETE FROM wp_pagesvisites WHERE Timestamp <'$ v'"); $ wpdb-> execute();

また

$ req = $ bdd-> exec( "DELETE FROM wp_pagesvisites WHERE Timestamp <'$ v'");

于 2013-01-18T23:54:57.900 に答える