Mysql PDO使用DATE数据类型准备语句问题

时间:2012-08-24 11:37:50

标签: php mysql sql pdo prepared-statement

我的日期数据类型有问题。 我有一个php mysql pdo语句:

$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中插入和查询,则不是时区问题。

我用force string

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

但它也是空的。

但是:如果使用引号则返回行

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

你能澄清这句话有什么不妥,因为据我所知我们不需要引用,mysql pdo引用给我们。

编辑1:

我更新了正确的sql。在测试中从sql引用是我的错误。没有引用:nowcookietime stil empty。

CLOSED
请参阅下面的答案。

2 个答案:

答案 0 :(得分:1)

作为N.B.在评论中说

(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中

答案 1 :(得分:0)

我找出原因。

  1. 基本上,脚本设置$ cookiedurationlock太短,所以大部分时间都是空的。
  2. 添加引号时,比较将为(actiondate&gt;'\'2012-08-25 02:28:22 \''),因此它将返回行。
  3. 查询后,有一个插入新的操作行。因此,当我从工具运行trace sql时,数据会发生变化,并返回在此sql之后添加的新数据。
  4. 我认为我必须将我的脚本组织成更简单的脚本 谢谢大家的帮助。