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 和 MySQL 开发的 8 个技巧
Jan 02 PHP
php入门学习知识点七 PHP函数的基本应用
Jul 14 PHP
解析PHP可变函数的经典用法
Jun 20 PHP
关于file_get_contents返回为空或函数不可用的解决方案
Jun 24 PHP
PHP SPL使用方法和他的威力
Nov 12 PHP
PHP 之 写时复制介绍(Copy On Write)
May 13 PHP
Java和PHP在Web开发方面对比分析
Mar 01 PHP
PHP实现根据时间戳获取周几的方法
Feb 26 PHP
FleaPHP框架数据库查询条件($conditions)写法总结
Mar 19 PHP
PHP互换两个变量值的方法(不用第三变量)
Nov 14 PHP
php中的钩子理解及应用实例分析
Aug 30 PHP
解决Laravel5.2 Auth认证退出失效的问题
Oct 14 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生成带有雪花背景的验证码
2008/09/28 PHP
php使用strtotime和date函数判断日期是否有效代码分享
2013/12/25 PHP
PHP实现双链表删除与插入节点的方法示例
2017/11/11 PHP
一个无限级XML绑定跨框架菜单(For IE)
2007/01/27 Javascript
弹出广告特效代码(一个IP只弹出一次)
2007/05/11 Javascript
javascript html 静态页面传参数
2009/04/10 Javascript
5个javascript的数字格式化函数分享
2011/12/07 Javascript
ExtJS的拖拽效果示例
2013/12/09 Javascript
JS阻止冒泡事件以及默认事件发生的简单方法
2014/01/17 Javascript
页面js遇到乱码问题的解决方法是和无法转码的情况
2014/04/30 Javascript
原生js实现图片轮播特效
2015/12/18 Javascript
BootStrap3学习笔记(一)之网格系统
2016/05/20 Javascript
深入探究node之Transform
2017/07/20 Javascript
javaScript中&quot;==&quot;和&quot;===&quot;的区别详解
2018/03/16 Javascript
浅谈Vue.use的使用
2018/08/29 Javascript
JavaScript创建对象方式总结【工厂模式、构造函数模式、原型模式等】
2018/12/19 Javascript
C#程序员入门学习微信小程序的笔记
2019/03/05 Javascript
微信小程序使用字体图标的方法
2019/05/23 Javascript
node使用mysql获取数据库数据中文乱码问题的解决
2019/12/02 Javascript
JS实现单张或多张图片持续无缝滚动的示例代码
2020/05/10 Javascript
Python单元测试框架unittest简明使用实例
2015/04/13 Python
Python中多线程的创建及基本调用方法
2016/07/08 Python
PyTorch搭建多项式回归模型(三)
2019/05/22 Python
Python使用APScheduler实现定时任务过程解析
2019/09/11 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
2019/10/25 Python
使用python写一个自动浏览文章的脚本实例
2019/12/05 Python
canvas绘制视频封面的方法
2018/02/05 HTML / CSS
财务副总经理工作职责
2013/11/25 职场文书
外贸业务员求职信范文
2013/12/12 职场文书
优秀老员工获奖感言
2014/02/15 职场文书
财政专业求职信范文
2014/02/19 职场文书
个人党性分析材料
2014/12/19 职场文书
爱国主义教育基地观后感
2015/06/18 职场文书
Pytorch DataLoader shuffle验证方式
2021/06/02 Python
postgresql使用filter进行多维度聚合的解决方法
2021/07/16 PostgreSQL
nginx配置虚拟主机的详细步骤
2021/07/21 Servers