【问题标题】:Zend_Db_Statement_Pdo->execute with expression in paramsZend_Db_Statement_Pdo->用参数中的表达式执行
【发布时间】:2012-02-13 04:25:32
【问题描述】:

我尝试使用“重复”部分执行插入语句。据我所知 Zend 不支持这一点,所以我使用简单的声明:

$sql = "INSERT INTO agent(`inn`, `name`, `created`) VALUES(:inn, :name, :created) ON      
DUPLICATE KEY UPDATE `inn` = :inn, `name` = :name, `created` = :created";
$stmt = $this->db->prepare($sql);
$stmt->execute($bind);

其中 $bind - 是数组:

array(
  'inn'=>1234567890,
  'name'=>'test user', 
  'created' = new Zend_Db_Expr('NOW()')
);

如果我通过 phpMyAdmin 尝试此查询 - 一切正常, 但在脚本执行后,“created”列的值为 '0000-00-00 00:00:00'。

WTF?

【问题讨论】:

  • 如果将new Zend_Db_Expr('NOW()') 换成date('Y-m-d H:i:s', time()); 会发生什么?
  • date('Y-m-d H:i:s', time()) 有效...但是为什么t work Zend_Db_Expr? Or $stmt->execute doesnt 根本不支持参数中的 expr?

标签: php mysql zend-framework pdo zend-db


【解决方案1】:

您不能在预准备语句中使用表达式作为占位符的参数。它将被解释为一个字符串。这与zend框架无关。

您可以在 php 中创建一个格式化的日期字符串并使用它,或者在准备好的语句中使用 now(),如

 VALUES(:inn, :name, NOW())

如果您有时需要提供日期时间,有时需要使用 NOW(),另一种解决方案是使用条件来检查特定情况

 VALUES(:inn, :name, IF(:created = 'NOW()', NOW(), :created))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    • 2019-12-03
    • 2020-09-01
    • 2013-05-31
    • 1970-01-01
    相关资源
    最近更新 更多