1

我有一个像这样的查询:

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 );
4

1 回答 1

3

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

$stmt = $db->query("INSERT IGNORE ... `data` = ?", array('{"m":50}'));
                                               ^----placeholder
于 2013-08-27T21:12:08.567 回答