codeigniter和odbc连接

时间:2012-03-08 10:24:02

标签: php sql-server-2008 codeigniter odbc

我不明白为什么CodeIgniter将我的表名包装在括号中。当我为MS SQL使用CodeIgniter的ODBC驱动程序时,它会显示下面的错误,但是使用MySql驱动程序可以很好地工作。如何阻止此错误发生?

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来删除括号?

1 个答案:

答案 0 :(得分: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);
    }
}