1

日付データ型に問題があります。私はphpmysqlpdoステートメントを持っています:

$mystmt = $mydb->prepare("
    SELECT  `ad_id` 
        FROM `tbl_actions`
        WHERE 
            (`actiondate` > :nowcookietime  )
");
$mystmt->execute(array(
            ':nowcookietime'=>date("Y-m-d H:i:s", time()-$cookiedurationlock),
           )
);
$testnotinsql = $mystmt->fetch(PDO::FETCH_ASSOC); // EMPTY

コード実行は空を返します。しかし、general_logから以下のSQLを取得し、SQLツール(HeidiSQL)で実行すると、レコードが返されます。general_logからのSQL:

SELECT  ad_id 
        FROM tbl_actions
        WHERE 
            (actiondate> '2012-08-24 17:53:21' ) 

私のPHPタイムゾーンはUTC+7です。MysqlはSYSTEM(UTC)です。私が理解しているように、同じタイムゾーンを使用してphpに挿入してクエリを実行しても、タイムゾーンの問題はありません。

強制文字列を使用してバインドパラメータをテストします

':nowcookietime'=>date("Y-m-d H:i:s", time()-$cookiedurationlock),

しかし、それは同じ空です。

ただし、quoteを使用すると、行が返されます

':nowcookietime'=>"'".date("Y-m-d H:i:s", time()-$cookiedurationlock)."'",

引用符は必要ないことを理解しているので、このステートメントの何が問題になっているのかを明確にしていただけますか。mysqlpdoquoteを使用してください。

編集1:

正しいSQLを更新します。SQLで引用符を使用すると、テストから取得するときの私の間違いです。引用なし:nowcookietimeは空です。

クローズ
以下の私の答えを参照してください。

4

2 に答える 2

1

NBがコメントで言ったように使用

(actiondate > :nowcookietime)

sqlステートメントで:nowcookietimeを一重引用符で囲むことはありません。

自己完結型の例:

<?php
$mydb = setup();
$cookiedurationlock = 40;
$mystmt = $mydb->prepare("
    SELECT  `ad_id` 
        FROM `tmp_tbl_actions`
        WHERE 
            (`actiondate` > :nowcookietime )
");
$mystmt->execute(array(
    ':nowcookietime'=>date("Y-m-d H:i:s", time()-$cookiedurationlock),
));
$testnotinsql = $mystmt->fetch(PDO::FETCH_ASSOC);
var_dump($testnotinsql);


function setup() {
    $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->exec('
        CREATE TEMPORARY TABLE tmp_tbl_actions (
            ad_id int auto_increment,
            actiondate DATETIME,
            primary key(ad_id),
            key(actiondate)
        )
    ');

    $stmt = $pdo->prepare('INSERT INTO tmp_tbl_actions (actiondate) VALUES(?)');
    $t = time();
    for($i=-80; $i<10; $i++) {
        $stmt->execute(array(date('Y-m-d H:i:s', $t+$i)));
    }
    return $pdo;
}

プリント

array(1) {
  ["ad_id"]=>
  string(2) "42"
}

のコロン

':nowcookietime'=>date(...

おそらく不要ですが、 http://docs.php.net/manual/en/pdostatement.execute.phpの例2でも使用されています。

于 2012-08-24T12:03:45.550 に答える
0

理由がわかります。

  1. 基本的に、$ cookiedurationlockを短く設定するスクリプトがあるため、ほとんどの場合、空になります。
  2. 引用符を追加すると、比較は(actiondate>'\' 2012-08-25 02:28:22 \'')になるため、行が返されます。
  3. クエリの後に、新しいアクションの挿入行があります。したがって、ツールからtrace sqlを実行すると、データが変更され、このsqlの後に追加された新しいデータが返されます。

スクリプトをもっと単純なものに整理する必要があると思います。
助けてくれてありがとう。

于 2012-08-24T19:41:18.340 に答える