使用预准备语句的原始插入查询

时间:2017-08-24 11:05:28

标签: php sql-server cakephp cakephp-2.5

我在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运行参数化原始查询的语法是什么?

1 个答案:

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