我有一个类似的查询:
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 );
答案 0 :(得分:2)
不要在查询字符串中嵌入这样的数据。正如您所发现的那样,它会被错误解释为无效的占位符。使用带有占位符的预准备语句:
$stmt = $db->query("INSERT IGNORE ... `data` = ?", array('{"m":50}'));
^----placeholder