我有一个CakePHP应用程序通过ODBC连接到远程MSSQL服务器,但它没有按计划运行。每个查询都会因为它试图在标识符周围添加反引号而死亡,这对于MSSQL来说是不正确的。
例如,我有一个名为Item
的模型用于名为items
的表,当我调用
$this->Item->find('all')
它尝试使用查询
SELECT `Item`.`id`, `Item`.`name`, `Item`.`descrtiption` FROM `items` AS `Item` WHERE 1
...我在第1行`
附近收到有关无效语法的错误。
反正有没有阻止这种行为并删除反引号?或者使用像SQL Server似的方括号?
答案 0 :(得分:2)
我最近仔细研究了odbc驱动程序,打算在CakePHP 1.3中使用它来对抗MSSQL 2008。除非你准备在那时投入大量的工作,否则目前是不可行的。
您当前的问题是您需要使用[和]覆盖默认引号。这些设置在dbo_odbc.php文件的顶部
var $startQuote = "[";
var $endQuote = "]";
执行此操作后,您将遇到的下一个问题是默认使用LIMIT,因此您需要提供从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;
}
然后你会遇到两个问题,我都没解决过。
这些都不是无法解决的,但此时我认为重新加载我的服务器并使用MSSQL驱动程序比使用ODBC驱动程序继续追逐问题更简单,但是YMMV
补充说:这个问题似乎引起了一些关注:所以任何进一步采取这种做法的人都可以将他们的代码附加到这个答案上 - 希望我们可以在我们之间组建一个解决方案。
答案 1 :(得分:0)