2013-04-04 52 views
1

我正在使用codeigiter 2.1.3,我有簡單的查詢綁定,但是當我運行這個我得到下面的錯誤。我甚至用活動記錄使用了相同的東西,但仍然得到相同的錯誤。使用ODBC連接從MsSql查詢數據。codeigniter轉義值錯誤

$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 
+0

我認爲你可以在github上的CI問題報告 - https://github.com/EllisLab/CodeIgniter/issues 你有其他PARAMS該搜索? – Svetoslav 2013-04-04 10:54:11

+0

使用查詢綁定自動轉義它,所以不需要使用 '$ this-> db-> escape_like_str(「st'm」);' – tomexsans 2013-04-04 12:08:21

+0

即使我刪除了$ this-> db-> escape_like_str(),查詢綁定是不逃避數據,它提供的數據,因爲它= st'm – sravis 2013-04-04 12:16:24

回答

0

問題已解決,codeigniter不會像MsSql想要的那樣轉義該值。像MsSql一樣,單引號就像('st''m')在mysql('st \'m')中一樣。 Codeigniter的做法是錯誤的。這篇文章link幫助我用下面的函數來爲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; 
}