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 相关文章推荐
php xml留言板 xml存储数据的简单例子
Aug 24 PHP
关于PHP5 Session生命周期介绍
Mar 02 PHP
删除无限分类并同时删除它下面的所有子分类的方法
Aug 08 PHP
关于PHP结束标签的使用细节探讨及联想
Mar 04 PHP
基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解
May 15 PHP
PHP运行环境配置与开发环境的配置(图文教程)
Jun 04 PHP
php用header函数实现301跳转代码实例
Nov 25 PHP
ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例
Jul 22 PHP
PHP针对字符串开头和结尾的判断方法
Jul 11 PHP
php设计模式之装饰模式应用案例详解
Jun 17 PHP
thinkPHP事务操作简单案例分析
Oct 17 PHP
layui数据表格自定义每页条数limit设置
Oct 26 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身份证校验码计算方法
2016/08/10 PHP
php使用正则表达式去掉html中的注释方法
2016/11/03 PHP
详解php curl带有csrf-token验证模拟提交方法
2018/04/18 PHP
php微信公众号开发之翻页查询
2018/10/20 PHP
jQuery中remove()方法用法实例
2014/12/25 Javascript
Javascript基础教程之argument 详解
2015/01/18 Javascript
简述AngularJS的控制器的使用
2015/06/16 Javascript
JS实现超简单的鼠标拖动效果
2015/11/02 Javascript
vue.js实现价格格式化的方法
2017/05/23 Javascript
jQuery序列化后的表单值转换成Json
2017/06/16 jQuery
react-native 完整实现登录功能的示例代码
2017/09/11 Javascript
vue安装和使用scss及sass与scss的区别详解
2018/10/15 Javascript
jQuery开发仿QQ版音乐播放器
2020/07/10 jQuery
[01:37]TI4西雅图DOTA2前线报道 VG拿下首胜教练357给出获胜秘诀
2014/07/10 DOTA
python求众数问题实例
2014/09/26 Python
浅析python实现scrapy定时执行爬虫
2018/03/04 Python
使用python对excle和json互相转换的示例
2018/10/23 Python
Python I/O与进程的详细讲解
2019/03/08 Python
python生成大写32位uuid代码
2020/03/03 Python
Python+Selenium实现自动化的环境搭建的步骤(图文)
2020/09/01 Python
python GUI计算器的实现
2020/10/09 Python
css3 中的新特性加强记忆详解
2016/04/16 HTML / CSS
html5使用html2canvas实现浏览器截图的示例
2017/08/31 HTML / CSS
台湾三立电视电商平台:电电购
2019/09/09 全球购物
网页设计个人找工作求职信
2013/11/28 职场文书
对祖国的寄语大全
2014/04/11 职场文书
认购协议书范本
2014/04/22 职场文书
表彰大会策划方案
2014/05/13 职场文书
唱歌比赛拉拉队口号
2015/12/25 职场文书
八年级历史教学反思
2016/02/19 职场文书
教学反思怎么写
2016/02/24 职场文书
祝福语集锦:送给毕业同学祝福语
2019/11/21 职场文书
php引用传递
2021/04/01 PHP
解读MySQL的客户端和服务端协议
2021/05/10 MySQL
TensorFlow的自动求导原理分析
2021/05/26 Python
MySQL千万级数据表的优化实战记录
2021/08/04 MySQL