连接到Microsoft SQL Server的CakePHP ODBC驱动程序;如何删除反引号?
我有一个CakePHP应用程序通过ODBC连接到远程MSSQL服务器,但它不能按计划工作。每个查询都会死掉,因为它试图对标识符进行反引号操作,这对MSSQL不正确。连接到Microsoft SQL Server的CakePHP ODBC驱动程序;如何删除反引号?
举个例子,我有一个一个表叫Item
模式叫items
,当我打电话
$this->Item->find('all')
它试图使用查询
SELECT `Item`.`id`, `Item`.`name`, `Item`.`descrtiption` FROM `items` AS `Item` WHERE 1
...和我得到在第1行`
附近出现关于无效语法的错误。
有没有办法阻止此行为并删除反引号?或者像SQL Server似的使用方括号似乎喜欢?
最近,我仔细地看了一眼周围的ODBC驱动程序与CakePHP的1.3使用它针对2008年MSSQL的意图。除非您准备投入大量工作,否则目前不可行。
您的直接问题是您需要用[和]覆盖默认引号。这些设置在这里的dbo_odbc.php文件
var $startQuote = "[";
var $endQuote = "]";
顶部一旦你做到这一点,下一个问题你会遇到的是默认使用极限的,所以你需要提供自己的限制功能复制从dbo_mssq覆盖
/**
* Returns a limit statement in the correct format for the particular database.
*
* @param integer $limit Limit of results returned
* @param integer $offset Offset from which to start results
* @return string SQL limit/offset statement
*/
function limit($limit, $offset = null) {
if ($limit) {
$rt = '';
if (!strpos(strtolower($limit), 'top') || strpos(strtolower($limit), 'top') === 0) {
$rt = ' TOP';
}
$rt .= ' ' . $limit;
if (is_int($offset) && $offset > 0) {
$rt .= ' OFFSET ' . $offset;
}
return $rt;
}
return null;
}
然后你会遇到两个问题,我都解决了这两个问题。
- 在描述函数中,odbc_field_type调用不返回 字段类型。如果你在模型中描述这些领域,我不确定这是多么的重要,但这听起来并不乐观。
- 更重要的是,在字段函数用于生成一个字段列表蛋糕的作品递归爆炸的作品。语法来生成一系列AS别名。如果递归级别为零,这很好,但如果递归更深,最终会出现类似'this.that.other AS this_dot_that.other AS this_dot_that_dot_other'的字段列表,这是无效的MSSQL语法。
这些都不是无法解决的,但在这一点上,我决定是简单的重装我的服务器,并使用MSSQL的驱动程序不是继续用ODBC驱动程序追prblems,但情况因人而异
新增:这个问题似乎得到了一些关注:所以任何进一步考虑这个问题的人都可以将他们的代码附加到这个答案上 - 希望我们能够在我们之间组合一个解决方案。
你为什么不只是使用MSSQL DBO https://github.com/cakephp/cakephp/blob/master/cake/libs/model/datasources/dbo/dbo_mssql.php
有更多的问题比它的价值,其中最重要的是,我们试图使每个连接都说它无法连接到服务器。 ODBC连接正常。 – 2011-02-15 22:30:09
我们没有那么多的数据从数据库中提取出来,所以我们最终只是自己编写查询。糟糕的做法,但它符合我们的需求。我将此标记为答案,因为这是对问题的最好解释,并且确实提供了提供可行解决方案的大部分方法。 – 2011-09-13 04:32:35