0

UNIXタイムスタンプがdbに記録された日時よりも小さく、問題が発生している場合にのみ、dbからデータを取得しようとしています。

これが私がこれまでに得たものです。

date_default_timezone_set("UTC");
$now = date("Y-m-d H:i:s", time());
$timestamp = strtotime($now); 
$timestamp2 = strtotime('-3 days', $timestamp);

$sql = "SELECT g.game_id, UNIX_TIMESTAMP(g.lastdraw)+259200 AS dbtimestamp FROM ".$prefix."_games g 
            INNER JOIN ".$prefix."_gameplayer gp
                ON g.game_id = gp.fk_game_id
            WHERE dbtimestamp < $timestamp2 AND gp.fk_player_id=$currplayer AND g.finished=0";
$result = mysql_query($sql);
while($row = mysql_fetch_assoc($result)){
        //if($row['dbtimestamp'] < $timestamp2){
        $thisgameid = $row['game_id'];

        if($thisgameid == 257748){
            echo '<b>GameID: '.$thisgameid.'</b><br>';
        } else {
            echo 'GameID: '.$thisgameid.'<br>';
        }
        echo 'DBtimestamp: '.$row['dbtimestamp'].'<br><br>';
    //}
}

この方法ではレコードを取得しません。しかし、SQL クエリで "dbtimestamp < $timestamp2" を削除し、"if($row['dbtimestamp'] < $timestamp2){" のアウトコメントを削除すると、すべて正常に動作しますか?

私が間違っているアイデアはありますか?

前もって感謝します :-)

4

3 に答える 3

2

ネイティブの日付/時刻操作を使用して純粋に MySQL で直接これを行うことができるのに、PHP のタイムスタンプと MySQL の date->timestamp 値をいじるのはなぜですか?

SELECT ..
WHERE g.lastdraw < (NOW() - INTERVAL 3 DAY)
于 2012-12-28T15:54:41.247 に答える
1

これは質問に直接答えないかもしれません。ただし、コメントするには大きすぎることを指摘する価値があります。

以下:

$now = date("Y-m-d H:i:s", time());
$timestamp = strtotime($now); 
$timestamp2 = strtotime('-3 days', $timestamp);

次のように書き換えることができます。

$timestamp2 = strtotime('-3 days');

さらに、MySQL にはいくつかの日時関数があります。DATE_ADD()のようなものではなく、のようなものを使用してくださいUNIX_TIMESTAMP(g.lastdraw)+259200

于 2012-12-28T15:56:48.107 に答える
0

クエリが行を返さないだけでなく、クエリは実際には次のようなエラーをスローする必要があります。

Error Code: 1054
Unknown column 'dbtimestamp' in 'where clause'

dbtimestampSQL ステートメントの問題は、ステートメントの WHERE 句でSELECT リスト (例: ) 内の式のエイリアスを参照することが有効でないことです。

(そして、それが有効であったとしても、述語でその式を使用したくないでしょう。lastdrawその式を導出するために使用している裸の列に述語が必要です。)

SQL ステートメントの問題をデバッグするための規範的なパターンは、SQL ステートメントを含む文字列の内容をエコーアウトし (この$sql場合)、別の環境 (mysql コマンド ライン クライアントなど) で実行してそのステートメントをテストすることです。


1 つの「修正」はdbtimestamp、WHERE 句のエイリアスを実際の式に置き換えることです。

WHERE UNIX_TIMESTAMP(g.lastdraw)+259200 < $timestamp2 

しかし...これで1054エラーを回避できますが、それは実際には正しい修正ではありません。パフォーマンスのために、左側で追加を行いたくありません。次の形式の述語を使用したほうがよいでしょう。

WHERE UNIX_TIMESTAMP(g.lastdraw) < $timestamp2 - 259200

列が TIMESTAMP データ型でない場合はlastdraw、左側の UNIX_TIMESTAMP 関数の呼び出しを避け、代わりに右側を FROM_UNIXTIME 関数でラップする必要があることに注意してください。

WHERE g.lastdraw < FROM_UNIXTIME( expr )
于 2012-12-28T17:12:45.500 に答える