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编写的导航条程序
Oct 09 PHP
php设计模式 Bridge (桥接模式)
Jun 26 PHP
zf框架的db类select查询器join链表使用示例(zend框架)
Mar 14 PHP
dedecms函数分享之获取某一栏目所有子栏目
May 19 PHP
PHP中使用addslashes函数转义的安全性原理分析
Nov 03 PHP
php类的定义与继承用法实例
Jul 07 PHP
php强制下载文件函数
Aug 24 PHP
你不知道的文件上传漏洞php代码分析
Sep 29 PHP
php实现将HTML页面转换成word并且保存的方法
Oct 14 PHP
php+resumablejs实现的分块上传 断点续传功能示例
Apr 18 PHP
如何利用预加载优化Laravel Model查询详解
Aug 11 PHP
PHP迭代器和迭代的实现与使用方法分析
Apr 19 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 分页类实现代码
2009/12/03 PHP
php curl的深入解析
2013/06/02 PHP
使用PHP curl模拟浏览器抓取网站信息
2013/10/28 PHP
php中array_unshift()修改数组key注意事项分析
2016/05/16 PHP
QQ邮箱的一个文本编辑器代码
2007/03/14 Javascript
关于juqery radio写法的兼容性问题(新老版本jquery)
2010/06/14 Javascript
JQuery开发的数独游戏代码
2010/10/29 Javascript
JS与C#编码解码
2013/12/03 Javascript
jQuery中DOM操作实例分析
2015/01/23 Javascript
javascript获取元素离文档各边距离的方法
2015/02/13 Javascript
详解JavaScript的流程控制语句
2015/11/30 Javascript
EasyUI创建对话框的两种方式
2016/08/23 Javascript
jQuery 遍历map()方法详解
2016/11/04 Javascript
vue中component组件的props使用详解
2017/09/04 Javascript
利用js编写网页进度条效果
2017/10/08 Javascript
VUE + UEditor 单图片跨域上传功能的实现方法
2018/02/08 Javascript
解决echarts的多个折现数据出现坐标和值对不上的问题
2018/12/28 Javascript
vue中node_modules中第三方模块的修改使用详解
2019/05/31 Javascript
在漏洞利用Python代码真的很爽
2007/08/26 Python
python爬取亚马逊书籍信息代码分享
2017/12/09 Python
儿童python练习实例
2018/05/27 Python
python write无法写入文件的解决方法
2019/01/23 Python
Python3几个常见问题的处理方法
2019/02/26 Python
Python使用Pickle模块进行数据保存和读取的讲解
2019/04/09 Python
Django自定义用户登录认证示例代码
2019/06/30 Python
Pycharm如何运行.py文件的方法步骤
2020/03/03 Python
Pytorch数据拼接与拆分操作实现图解
2020/04/30 Python
Python安装Bs4的多种方法
2020/11/28 Python
COSETTE官网:奢华,每天
2020/03/22 全球购物
EJB的几种类型
2012/08/15 面试题
网络工程师的自我评价
2013/10/02 职场文书
应聘护士自荐信
2013/10/21 职场文书
个人社会实践自我鉴定
2014/03/24 职场文书
寝室长工作失责检讨书
2014/10/06 职场文书
烈士陵园观后感
2015/06/08 职场文书
Nginx图片服务器配置之后图片访问404的问题解决
2022/03/21 Servers