带有准备好的语句的原始插入查询
Raw insert query with prepared statements
我在 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][ODBC Driver 11 for SQL Server][SQL Server]Incorrect syntax near ':'.
我还尝试了位置占位符 (?
) 甚至 PDO 类参数(使用 PDO::PARAM_STR
和所有东西)。
运行 CakePHP/2.5.5 中针对 SQL 服务器的参数化原始查询的语法是什么?
答案是(显然):none。
在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
*/
所以你只能在阅读时使用准备好的语句,而不能在写作时使用 :-!
你需要回到 2000 年代初 escape:
public function log (DataSource $db) {
$sql = sprintf('INSERT INTO log (foo, bar)
VALUES (%s, %s)',
$db->value('foo'),
$db->value('bar')
);
$db->rawQuery($sql);
}
我在 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][ODBC Driver 11 for SQL Server][SQL Server]Incorrect syntax near ':'.
我还尝试了位置占位符 (?
) 甚至 PDO 类参数(使用 PDO::PARAM_STR
和所有东西)。
运行 CakePHP/2.5.5 中针对 SQL 服务器的参数化原始查询的语法是什么?
答案是(显然):none。
在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
*/
所以你只能在阅读时使用准备好的语句,而不能在写作时使用 :-!
你需要回到 2000 年代初 escape:
public function log (DataSource $db) {
$sql = sprintf('INSERT INTO log (foo, bar)
VALUES (%s, %s)',
$db->value('foo'),
$db->value('bar')
);
$db->rawQuery($sql);
}