如何阻止Zend尝试绑定我的MySQL值?

时间:2013-08-27 20:10:15

标签: php sql zend-framework

我有一个类似的查询:

INSERT IGNORE INTO my_table SET `data` = '{\"m\":50}'

当然,我的真实查询中的JSON数据要大得多,我总是得到错误:

Zend_Db_Statement_Exception: Invalid bind-variable name ':50'

这是我$connection->query( $sql );

的时候

在过去,我通过使用单引号而不是围绕我的值引用双引号来解决这个问题,但由于某种原因,它现在无法正常工作。我错过了什么?

修改

除了接受的答案之外,这里是我用来确保我仍然可以将new Zend_Db_Expr("NOW()")传递给我的函数的代码,但是有一些类似于正确准备的JSON数据。

foreach ( $params as $key => $value ) {

  // Can't use ? for anything that requires an expression, such as NOW()
  if ( $value instanceof Zend_Db_Expr ) {
    $db_keys[] = $connection->quoteInto( "`{$key}` = ?", $value );
  }
  else {
    $db_values[] = $value;
    $db_keys[]   = "`{$key}` = ?";
  }

} // foreach params

$sql    = "INSERT IGNORE INTO {$table} SET " . implode( ', ', $db_keys );
$result = $connection->query( $sql, $db_values );

1 个答案:

答案 0 :(得分:2)

不要在查询字符串中嵌入这样的数据。正如您所发现的那样,它会被错误解释为无效的占位符。使用带有占位符的预准备语句:

$stmt = $db->query("INSERT IGNORE ... `data` = ?", array('{"m":50}'));
                                               ^----placeholder