ThinkPHP2.0读取MSSQL提示Incorrect syntax near the keyword 'AS'的解决方法


Posted in PHP onJune 25, 2014

问题代码如下:

<?php 
class IndexAction extends Action{ 
  public function index(){ 
    /* 
    $Model = new Model(); 
    $test = $Model->query('select top 10 * from f_city'); 
    dump($test); 
    */ 
    $CityModel = M('city'); 
    $CityModel->find(); 
    dump($CityModel); 
  } 
} 
?>

出现的情况是使用 query 可以正确读取到数据,而使用M方法,则无法读取,会报出 Incorrect syntax near the keyword 'AS'. 错误
原因是DbMssql.class.php驱动的查询语句有问题。

由于TP2.0 的 MSSQL 驱动是对SQL 2005有效,但对2000版本则无效,原因是2000版本里没有 ROW_NUMBER 功能,2005才有这个功能作用好像是对数据分页提供便利和效能。

希望官方能够给TP2.0加一个2000的驱动吧,目前采用的临时处理方法是修改ThinkPHP\Lib\Think\Db\Driver\DbMssql.class.php ,将行 25 的 protected $selectSql 在前面加 '//' 
并且第326行 的

public function parseLimit($limit) { 
      if(emptyempty($limit)) $limit=1; 
  $limit    =    explode(',',$limit); 
  if(count($limit)>1) 
    $limitStr    =    '(T1.ROW_NUMBER BETWEEN '.$limit[0].' + 1 AND '.$limit[0].' + '.$limit[1].')'; 
      else 
    $limitStr = '(T1.ROW_NUMBER BETWEEN 1 AND '.$limit[0].")"; 
  return $limitStr; 
}

改为:

public function parseLimit($limit) { 
  return ''; 
}

这样更改后,基本可以满足一般的SQL需求,但不能使用LIMIT,因为 MSSQL 2000 的LIMIT方法是以 top N
这样实现的;

如果觉得麻烦,那么就结合 Adodb 类库吧,这个对MSSQL支持相对好很多。要结合 Adodb 类库我的方法如下:

首先下载 Adodb 类库并解压到 ThinkPHP 的 Vendor 目录中,并把 adodb.inc.php 改名为 adodb.php
然后在项目的 Lib 里建立一个 CommonAction.class.php 内容为

<?php 
class CommonAction extends Action { 
  public $dbsql; 
  function _initialize() { 
    Vendor('adodb5.adodb'); 
    $adodb = ADONewConnection(C('DB_TYPE')); 
    $adodb->Connect(C('DB_HOST'), C('DB_USER'), C('DB_PWD'), C('DB_NAME')); 
    $adodb->SetFetchMode(ADODB_FETCH_ASSOC); 
    $this->dbsql = $adodb; 
  } 
} 
?>

在项目的其他文件中都要引用到这个 CommonAction.class.php 文才能使用 ADODB,例如:
 

<?php 
class IndexAction extends CommonAction { 
  public function index() { 
    $query = $this->dbsql->Execute('select * from xxx'); 
    while($rows = $query->FetchRow()) { 
        echo $rows['fields']; 
     } 
  } 
} 
?>

这样既能使用 Thinkphp 的模块进行简单的数据查询也能使用 Adodb 进行分页数据的查询,实在是没办法中的办法了,这个是个笨办法哦,还是希望 ThinkPHP 能够出一个 MSSQL 2000 版本能用的完美驱动。

PHP 相关文章推荐
FCKeditor的安装(PHP)
Jan 13 PHP
令PHP初学者头疼十四条问题大总结
Nov 12 PHP
php使用curl模拟登录后采集页面的例子
Nov 04 PHP
php实现的漂亮分页方法
Apr 17 PHP
PHP的switch判断语句的“高级”用法详解
Oct 01 PHP
PHP中执行cmd命令的方法
Oct 11 PHP
PHP生成不重复标识符的方法
Nov 21 PHP
PHP模块memcached使用指南
Dec 08 PHP
PHP实现事件机制的方法
Jul 10 PHP
如何使用php等比例缩放图片
Oct 12 PHP
IOS 开发之NSDictionary转换成JSON字符串
Aug 14 PHP
PHP swoole和redis异步任务实现方法分析
Aug 12 PHP
ThinkPHP查询中的魔术方法简述
Jun 25 #PHP
Thinkphp实现MySQL读写分离操作示例
Jun 25 #PHP
Zend Framework页面缓存实例
Jun 25 #PHP
非常好用的Zend Framework分页类
Jun 25 #PHP
PHP生成等比缩略图类和自定义函数分享
Jun 25 #PHP
PHP使用DOMDocument类生成HTML实例(包含常见标签元素)
Jun 25 #PHP
PHP内置过滤器FILTER使用实例
Jun 25 #PHP
You might like
PHP 强制下载文件代码
2010/10/24 PHP
PHP session会话的安全性分析
2011/09/08 PHP
自定义min版smarty模板引擎MinSmarty.class.php文件及用法
2016/05/20 PHP
js类中的公有变量和私有变量
2008/07/24 Javascript
写了10年的Javascript也未必全了解的连续赋值运算
2011/03/25 Javascript
在jQuery中 常用的选择器介绍
2013/04/16 Javascript
js局部刷新页面时间具体实现
2013/07/04 Javascript
iframe子页面获取父页面元素的方法
2013/11/05 Javascript
jQuery循环滚动新闻列表示例代码
2014/06/17 Javascript
js兼容pc端浏览器并有多种弹出小提示的手机端浮层控件实例
2015/04/29 Javascript
jQuery实现仿腾讯微博滑出效果报告每日天气的方法
2015/05/11 Javascript
js实现的简洁网页滑动tab菜单效果代码
2015/08/24 Javascript
详解Webwork中Action 调用的方法
2016/02/02 Javascript
JavaScript的设计模式经典之代理模式
2016/02/24 Javascript
js实现的简单图片浮动效果完整实例
2016/05/10 Javascript
基于jQuery实现选项卡效果
2017/01/04 Javascript
js获取当前页的URL与window.location.href简单方法
2017/02/13 Javascript
p5.js 毕达哥拉斯树的实现代码
2018/03/23 Javascript
详解基于Koa2开发微信二维码扫码支付相关流程
2018/05/16 Javascript
JS实现二维数组元素的排列组合运算简单示例
2019/01/28 Javascript
JS代码屏蔽F12,右键,粘贴,复制,剪切,选中,操作实例
2019/09/17 Javascript
JS实现炫酷雪花飘落效果
2020/08/19 Javascript
python和C语言混合编程实例
2014/06/04 Python
详解Python函数可变参数定义及其参数传递方式
2017/08/02 Python
Python实现PS滤镜的旋转模糊功能示例
2018/01/20 Python
浅谈Python中重载isinstance继承关系的问题
2018/05/04 Python
Python获取Redis所有Key以及内容的方法
2019/02/19 Python
Python通过fnmatch模块实现文件名匹配
2020/09/30 Python
Python脚本调试工具安装过程
2021/01/11 Python
奢华时尚的创新平台:Baltini
2020/10/03 全球购物
土木工程实习生自我鉴定
2013/09/19 职场文书
公司财务总监岗位职责
2013/12/14 职场文书
《记承天寺夜游》教学反思
2014/02/16 职场文书
行政专员的岗位职责
2014/03/10 职场文书
幼儿园秋季开学寄语
2014/08/02 职场文书
JavaScript展开运算符和剩余运算符的区别详解
2022/02/18 Javascript