我在日期数据类型方面遇到问题。我有一个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+7Mysql是SYSTEM(哪个UTC)据我所知,若在php中使用相同的时区进行插入和查询,并不是时区问题。
我用力字符串测试绑定参数
':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中使用引号是我从测试中获取时的错误。周围没有引号:现在烹饪时间仍然是空的。
已关闭
请参阅下面的答案。
正如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(...
可能是多余的,但它也在示例2中使用http://docs.php.net/manual/en/pdostatement.execute.php
我找到了原因。
- 基本上,脚本将$cookiedurationlock设置得太短,所以大多数时候它都是空的
- 添加引号时,比较将为(
actiondate
>"'''2012-08-25 02:28:22'''"),因此它将返回行 - 在查询之后,会出现一个插入新操作行。因此,当我从工具中运行trace-sql时,数据发生了更改,并返回在该sql之后添加的新数据
我想我必须把我的剧本整理成更简单的
谢谢大家的帮助。