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

問題は解決されました.MsSqlが望んでいたように値をエスケープしないためのcodeigniter。MsSql の場合と同様に、一重引用符は ('st''m') のようにエスケープされますが、mysql の場合は ('st\'m') です。Codeigniter は間違った方法でそれを行っていました。この投稿リンクは、以下の関数で Msql の引用符をエスケープするのに役立ちました。その作業は今。ご提案いただきありがとうございます。

 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 に答える