2012-03-08 193 views
0

我不明白为什么CodeIgniter将我的表名称包装在括号中。当我为MS SQL使用CodeIgniter的ODBC驱动程序时,它会显示下面的错误,但它使用MySql驱动程序可以很好地工作。我怎样才能阻止这种错误发生?codeigniter和odbc连接

A Database Error Occurred 

Error Number: 37000 

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

SELECT * FROM (ci_sessions) WHERE session_id = '3ad914bb5f5728e8ac69ad1db8fc9841' AND user_agent = 'Mozilla/5.0 (Windows NT 6.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2' 

Filename: D:\wamp\www\IVR_Panel\system\database\DB_driver.php 

Line Number: 330 

我也试过在SQL Server 2005中执行同样的查询,它没有括号,但仍然与他们的错误。我使用活动记录,因此可以轻松地在ODBC和MySQL驱动程序之间切换。我在哪里可以修改CodeIgniter以删除括号?

回答

4

这实际上是CodeIgniter中的一个错误。在ODBC驱动程序(/system/database/drivers/odbc/odbc_driver.php)当您选择一个表,它使用下面的方法:

function _from_tables($tables) 
{ 
    if (! is_array($tables)) 
    { 
     $tables = array($tables); 
    } 

    return '('.implode(', ', $tables).')'; 
} 

它试图将多个表中选择一起执行运算符优先级,这应该工作得很好,如果你使用多个表,但是有一个表仍然会尝试对它进行分组,导致你得到的错误。

不幸的是,我不认为有可能扩展这些驱动程序文件,因此您可能必须编辑核心文件本身。注意到这一点,你需要在未来更新CodeIgniter的情况下,你必须将方法更改为类似如下:

function _from_tables($tables) 
{ 
    if (! is_array($tables)) 
    { 
     return strstr($tables, ',') ? '('.$tables.')' : $tables; 
    } 
    else 
    { 
     return count($tables) > 1 ? '('.implode(', ', $tables).')' : end($tables); 
    } 
} 
+0

得益于它完美的作品,在这里我要补充完整的表名喜欢数据库。 schema_name.table_name ...再次感谢 – 2012-03-09 07:08:22