带有准备好的语句的原始插入查询

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