我不明白为什么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来删除括号?
答案 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);
}
}