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.MVC的模板标签系统(三)
Sep 05 PHP
PHP 执行系统外部命令 system() exec() passthru()
Aug 11 PHP
解析argc argv在php中的应用
Jun 24 PHP
php阻止页面后退的方法分享
Feb 17 PHP
本地计算机无法启动Apache故障处理
Aug 08 PHP
PHP下SSL加密解密、验证、签名方法(很简单)
Jun 28 PHP
PHP错误处理函数
Apr 03 PHP
PHP识别二维码的方法(php-zbarcode安装与使用)
Jul 07 PHP
php中替换字符串函数strtr()和str_repalce()的用法与区别
Nov 25 PHP
thinkPHP3.2.3结合Laypage实现的分页功能示例
May 28 PHP
Laravel框架实现修改登录和注册接口数据返回格式的方法
Aug 17 PHP
php集成开发环境详解
Sep 24 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
oracle资料库函式库
2006/10/09 PHP
学习php设计模式 php实现单例模式(singleton)
2015/12/07 PHP
crontab无法执行php的解决方法
2016/01/25 PHP
利用php-cli和任务计划实现订单同步功能的方法
2017/05/03 PHP
javascript实现划词标记+划词搜索功能
2007/03/06 Javascript
Google韩国首页图标动画效果
2007/08/26 Javascript
Javascript 错误处理的几种方法
2009/06/13 Javascript
jQuery :nth-child前有无空格的区别分析
2011/07/11 Javascript
jquery maxlength使用说明
2011/09/09 Javascript
14款NodeJS Web框架推荐
2014/07/11 NodeJs
js实现模拟计算器退格键删除文字效果的方法
2015/05/07 Javascript
JavaScript中获取纯正的undefined的方法
2016/03/06 Javascript
jQuery技巧之让任何组件都支持类似DOM的事件管理
2016/04/05 Javascript
JavaScript String 对象常用方法详解
2016/05/13 Javascript
AngularJS 2.0入门权威指南
2016/10/08 Javascript
浅谈Webpack 是如何加载模块的
2018/05/24 Javascript
jQuery基于Ajax实现读取XML数据功能示例
2018/05/31 jQuery
使用vue-router与v-if实现tab切换遇到的问题及解决方法
2018/09/07 Javascript
ES6知识点整理之函数对象参数默认值及其解构应用示例
2019/04/17 Javascript
layui form表单提交后实现自动刷新
2019/10/25 Javascript
tensorflow使用神经网络实现mnist分类
2018/09/08 Python
python中count函数简单用法
2020/01/05 Python
Python运行提示缺少模块问题解决方案
2020/04/02 Python
Eclipse配置python默认头过程图解
2020/04/26 Python
a标签下载链接的简单实现
2016/09/13 HTML / CSS
3种方式实现瀑布流布局小结
2019/09/05 HTML / CSS
联想哥伦比亚网上商城:Lenovo Colombia
2017/01/10 全球购物
澳大利亚女性快速时尚零售商:Ally Fashion
2018/04/25 全球购物
锐步香港官方网上商店:Reebok香港
2020/11/05 全球购物
财务部岗位职责
2013/11/19 职场文书
餐厅执行经理岗位职责范本
2014/02/26 职场文书
会计自荐信范文
2014/03/09 职场文书
伏羲庙导游词
2015/02/09 职场文书
焦点访谈观后感
2015/06/11 职场文书
2015年度女工工作总结
2015/10/22 职场文书
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
2022/03/16 Redis