Zend_Db_Statement_Pdo->以params中的表达式执行

时间:2012-01-18 12:49:23

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

我尝试使用“on duplicate”部分执行insert语句。我知道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?

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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