1

我正在使用 codeigiter 2.1.3,我有简单的查询绑定,但是当我运行它时,我得到以下错误。我什至对活动记录使用了同样的东西,但我仍然得到同样的错误。使用 ODBC 连接从 MsSql 查询数据。

$searchTerm = $this->db->escape_like_str("st'm");

$sql = "SELECT * FROM arcus WHERE id LIKE ? OR name = ?";

$query = $this->db->query($sql, array($searchTerm, $searchTerm));

Error Number: 37000

[Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near 'm'.

SELECT * FROM arcus WHERE id LIKE '%st\'m%' {escape '!'}
OR name LIKE '%st\'m%' {escape '!'}

Filename: C:\xampp\htdocs\XX\system\database\DB_driver.php

Line Number: 330
4

1 回答 1

0

问题解决了,codeigniter 没有像 MsSql 想要的那样转义值。像 MsSql 一样,单引号是像 ('st''m') 一样的转义,对于 mysql ('st\'m')。Codeigniter 的做法是错误的。这个帖子链接帮助我使用以下函数来转义 MsSql 的引号。它现在工作。感谢您的建议。

 function ms_escape_string($data) {
    if ( !isset($data) or empty($data) ) return '';
    if ( is_numeric($data) ) return $data;

    $non_displayables = array(
        '/%0[0-8bcef]/',            // url encoded 00-08, 11, 12, 14, 15
        '/%1[0-9a-f]/',             // url encoded 16-31
        '/[\x00-\x08]/',            // 00-08
        '/\x0b/',                   // 11
        '/\x0c/',                   // 12
        '/[\x0e-\x1f]/'             // 14-31
    );
    foreach ( $non_displayables as $regex )
        $data = preg_replace( $regex, '', $data );
    $data = str_replace("'", "''", $data );
    return $data;
}
于 2013-04-04T13:16:09.137 回答