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 に答える