php - DATE 数据类型的 Mysql PDO 准备语句问题

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

我用强制字符串测试绑定(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 仍然是空的。

关闭
请参阅下面的答案。

最佳答案

作为注意事项评论里说使用

(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 中也使用了它

关于php - DATE 数据类型的 Mysql PDO 准备语句问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12108687/

相关文章:

java - 无法在android和网络服务器之间进行通信

php - 我如何表达一个条件,以便 sql 语句提取 2 小时前解决的订单?

mysql - 优化分层查询

mysql - 从数据库中显示的最大字数

php - MySQL数据库表设置

php - Magento upsell_products 引发错误 "must be an instance of Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection"

php - 如何将mysql改为mysqli?

sql - 行集不支持向后滚动

mysql - 在为基本聊天 Web 应用程序制作 mysql 数据库模型方面需要指导

php - 使用 PHP 的动态表