我在app/Lib
中有一个需要存储日志的帮助程序库,所以我尝试DboSource::rawQuery()
。文档很模糊:
/**
* Executes given SQL statement.
*
* @param string $sql SQL statement
* @param array $params Additional options for the query.
* @return bool
*/
public function rawQuery($sql, $params = array()) {
$this->took = $this->numRows = false;
return $this->execute($sql, $params);
}
...我在网上找到的任何例子都假装SQL注入不存在。无论我尝试什么语法:
public function log (DataSource $db) {
$sql = 'INSERT INTO log (foo, bar)
VALUES (:foo, :bar)';
$params = array(
'foo' => 'One',
'bar' => 'Two',
);
$db->rawQuery($sql, $params);
}
...我总是遇到这样的数据库错误:
SQLSTATE [42000]:[Microsoft] [SQL Server的ODBC驱动程序11] [SQL Server]'附近的语法不正确:'。
我还尝试了位置占位符(?
)甚至是类似PDO的参数(包含PDO::PARAM_STR
和所有内容)。
在CakePHP / 2.5.5中针对SQL Server运行参数化原始查询的语法是什么?
答案 0 :(得分:0)
答案是(显然):无。
在source code for Sqlserver::_execute()
我们可以阅读:
/**
* Executes given SQL statement.
*
* @param string $sql SQL statement
* @param array $params list of params to be bound to query (supported only in select)
* @param array $prepareOptions Options to be used in the prepare statement
* @return mixed PDOStatement if query executes with no problem, true as the result of a successful, false on error
* query returning no rows, such as a CREATE statement, false otherwise
* @throws PDOException
*/
所以你只能在阅读时使用准备好的陈述,而不是写作: - !
你需要回到21世纪初和逃避:
public function log (DataSource $db) {
$sql = sprintf('INSERT INTO log (foo, bar)
VALUES (%s, %s)',
$db->value('foo'),
$db->value('bar')
);
$db->rawQuery($sql);
}