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中的实现trim函数代码
Mar 19 PHP
PHP校验ISBN码的函数代码
Jan 17 PHP
php添加文章时生成静态HTML文章的实现代码
Feb 17 PHP
ajax完美实现两个网页 分页功能的实例代码
Apr 16 PHP
解决ajax+php中文乱码的方法详解
Jun 09 PHP
利用谷歌 Translate API制作自己的翻译脚本
Jun 04 PHP
Yii2中使用asset压缩js,css文件的方法
Nov 24 PHP
php使用include 和require引入文件的区别
Feb 16 PHP
PHP基于redis计数器类定义与用法示例
Feb 08 PHP
PHP经典设计模式之依赖注入定义与用法详解
May 21 PHP
laravel 框架执行流程与原理简单分析
Feb 01 PHP
PHP中-&gt;和=&gt;的含义及使用示例解析
Aug 06 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中获取变量的变量名的一段代码的bug分析
2011/07/07 PHP
PHP警告Cannot use a scalar value as an array的解决方法
2012/01/11 PHP
PHP获取用户的浏览器与操作系统信息的代码
2012/09/04 PHP
探讨如何使用SimpleXML函数来加载和解析XML文档
2013/06/07 PHP
使用PHP接收POST数据,解析json数据
2013/06/28 PHP
Windows和Linux中php代码调试工具Xdebug的安装与配置详解
2014/05/08 PHP
PHP实现ftp上传文件示例
2014/08/21 PHP
php设置页面超时时间解决方法
2015/09/22 PHP
PHP中如何判断exec函数执行成功?
2016/08/04 PHP
微信公众号开发之获取位置信息php代码
2018/06/13 PHP
PHP封装mysqli基于面向对象的mysql数据库操作类与用法示例
2019/02/25 PHP
JQuery datepicker 使用方法
2011/05/20 Javascript
无缝滚动js代码通俗易懂(自写)
2013/06/19 Javascript
JS实现隐藏同级元素后只显示JS文件内容的方法
2016/09/04 Javascript
JS 中LocalStorage和SessionStorage的使用
2017/08/17 Javascript
Node.js学习教程之HTTP/2服务器推送【译】
2017/10/31 Javascript
vue项目中的webpack-dev-sever配置方法
2017/12/14 Javascript
node使用mysql获取数据库数据中文乱码问题的解决
2019/12/02 Javascript
React实现轮播效果
2020/08/25 Javascript
python中global用法实例分析
2015/04/30 Python
基于python脚本实现软件的注册功能(机器码+注册码机制)
2016/10/09 Python
python中 logging的使用详解
2017/10/25 Python
python集合比较(交集,并集,差集)方法详解
2018/09/13 Python
用Python将结果保存为xlsx的方法
2019/01/28 Python
Python使用os.listdir()和os.walk()获取文件路径与文件下所有目录的方法
2019/04/01 Python
Python的numpy库下的几个小函数的用法(小结)
2019/07/12 Python
python如何保证输入键入数字的方法
2019/08/23 Python
使用canvas实现黑客帝国数字雨效果
2020/01/02 HTML / CSS
德国购买健身器材:AsVIVA
2017/08/09 全球购物
.NET概念性的面试题
2012/02/29 面试题
书香校园活动方案
2014/02/28 职场文书
幼儿园保育员责任书
2014/07/22 职场文书
护士医德医风自我评价
2014/09/15 职场文书
公司财务会计主管应聘求职信
2014/09/26 职场文书
2016年会开场白台词
2015/06/01 职场文书
python脚本框架webpy的url映射详解
2021/11/20 Python