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 图像处理类1
Jun 15 PHP
PHP用SAX解析XML的实现代码与问题分析
Aug 22 PHP
浅析ThinkPHP中的pathinfo模式和URL重写
Jan 06 PHP
Codeigniter操作数据库表的优化写法总结
Jun 12 PHP
Thinkphp中的volist标签用法简介
Jun 18 PHP
PHP实现通过Luhn算法校验信用卡卡号是否有效
Mar 23 PHP
PHP中实现crontab代码分享
Mar 26 PHP
Symfony生成二维码的方法
Feb 04 PHP
Netbeans 8.2与PHP相关的新特性介绍
Oct 08 PHP
php性能分析之php-fpm慢执行日志slow log用法浅析
Oct 17 PHP
PHP 搜索查询功能实现
Nov 29 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
文件上传类
2006/10/09 PHP
php侧拉菜单 漂亮,可以向右或者向左展开,支持FF,IE
2009/10/15 PHP
dhtmlxTree目录树增加右键菜单以及拖拽排序的实现方法
2013/04/26 PHP
PHP不使用递归的无限级分类简单实例
2016/11/05 PHP
php+resumablejs实现的分块上传 断点续传功能示例
2017/04/18 PHP
使用jQuery.Validate进行客户端验证(初级篇) 不使用微软验证控件的理由
2010/06/28 Javascript
js冒泡、捕获事件及阻止冒泡方法详细总结
2014/05/08 Javascript
js动态添加表格数据使用insertRow和insertCell实现
2014/05/22 Javascript
JavaScript返回当前会话cookie全部键值对照的方法
2015/04/03 Javascript
JavaScript保留关键字汇总
2015/12/01 Javascript
js仿腾讯QQ的web登陆界面
2016/08/19 Javascript
node实现简单的反向代理服务器
2017/07/26 Javascript
基于VUE移动音乐WEBAPP跨域请求失败的解决方法
2018/01/16 Javascript
写给新手同学的vuex快速上手指北小结
2020/04/14 Javascript
python查询sqlite数据表的方法
2015/05/08 Python
CentOS 6.X系统下升级Python2.6到Python2.7 的方法
2016/10/12 Python
Python 递归函数详解及实例
2016/12/27 Python
Python如何实现守护进程的方法示例
2017/02/08 Python
Python实现嵌套列表去重方法示例
2017/12/28 Python
python中abs&amp;map&amp;reduce简介
2018/02/20 Python
python实现蒙特卡罗方法教程
2019/01/28 Python
python 实现人和电脑猜拳的示例代码
2020/03/02 Python
python生成并处理uuid的实现方式
2020/03/03 Python
Python实现寻找回文数字过程解析
2020/06/09 Python
Selenium webdriver添加cookie实现过程详解
2020/08/12 Python
Python浮点型(float)运算结果不正确的解决方案
2020/09/22 Python
CSS3属性使网站设计增强同时不消弱可用性
2009/08/29 HTML / CSS
HTML5进阶段内联标签汇总(小篇)
2016/07/13 HTML / CSS
美国知名女性服饰品牌:New York & Company
2017/03/23 全球购物
BNKR中国官网:带你感受澳洲领先潮流时尚
2018/08/21 全球购物
巴西备受欢迎的服装和生活方式品牌:FARM Rio
2020/02/04 全球购物
介绍一下Java中的Class类
2015/04/10 面试题
施工单位安全责任书
2014/07/24 职场文书
医药公司开票员岗位职责
2015/04/15 职场文书
初中毕业生感言
2015/07/31 职场文书
文艺部部长竞选稿
2015/11/21 职场文书