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 include的妙用,实现路径加密
Jul 29 PHP
PHP 输出缓存详解
Jun 20 PHP
用php将任何格式视频转为flv的代码
Sep 03 PHP
服务器web工具 php环境下
Dec 29 PHP
phpadmin如何导入导出大数据文件及php.ini参数修改
Feb 18 PHP
PHP curl 抓取AJAX异步内容示例
Sep 09 PHP
PHP实现批量生成App各种尺寸Logo
Mar 19 PHP
PHP7 新特性详细介绍
Sep 06 PHP
PHP页面跳转操作实例分析(header方法)
Sep 28 PHP
Yii2实现增删改查后留在当前页的方法详解
Jan 13 PHP
PHP字典树(Trie树)定义与实现方法示例
Oct 09 PHP
如何通过PHP实现Des加密算法代码实例
May 09 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
PHILIPS D1835/D1875的电路分析与打理
2021/03/02 无线电
PHP设计模式之责任链模式的深入解析
2013/06/13 PHP
跟我学Laravel之安装Laravel
2014/10/15 PHP
Zend Framework+smarty用法实例详解
2016/03/19 PHP
PHP扩展mcrypt实现的AES加密功能示例
2019/01/29 PHP
PHP+Mysql分布式事务与解决方案深入理解
2021/02/27 PHP
jquery中对表单的基本操作代码
2010/07/29 Javascript
js操作输入框中选择内容兼容IE及其他主流浏览器
2014/04/22 Javascript
纯javascript实现简单下拉刷新功能
2015/03/13 Javascript
JavaScript使用ActiveXObject访问Access和SQL Server数据库
2015/04/02 Javascript
拥Bootstrap入怀——导航栏篇
2016/05/30 Javascript
JS实现保留n位小数的四舍五入问题示例
2016/08/03 Javascript
SelecT下拉框选中和取值的解决方法
2016/11/22 Javascript
BootStrap Table后台分页时前台删除最后一页所有数据refresh刷新后无数据问题
2016/12/28 Javascript
WebSocket实现简单客服聊天系统
2017/05/12 Javascript
EasyUI在Panel上动态添加LinkButton按钮
2017/08/11 Javascript
详解webpack与SPA实践之开发环境搭建
2017/12/18 Javascript
vue中的计算属性实例详解
2018/09/19 Javascript
Vue 通过公共字段,拼接两个对象数组的实例
2019/11/07 Javascript
JS的时间格式化和时间戳转换函数示例详解
2020/07/27 Javascript
Python爬虫框架scrapy实现的文件下载功能示例
2018/08/04 Python
Django安装配置mysql的方法步骤
2018/10/15 Python
详解Python with/as使用说明
2018/12/13 Python
Django实现发送邮件功能
2019/07/18 Python
Python(PyS60)实现简单语音整点报时
2019/11/18 Python
Python开发之身份证验证库id_validator验证身份证号合法性及根据身份证号返回住址年龄等信息
2020/03/20 Python
String s = new String(“xyz”);创建了几个String Object?
2015/08/05 面试题
运动会通讯稿500字
2014/02/20 职场文书
农林环境专业求职信
2014/03/13 职场文书
合作协议书模板2014
2014/09/26 职场文书
毕业生代领毕业材料的授权委托书
2014/09/29 职场文书
办公室主任个人对照检查材料思想汇报
2014/10/11 职场文书
安全保证书怎么写
2015/02/28 职场文书
党员心得体会范文2016
2016/01/23 职场文书
高一数学教学反思
2016/02/18 职场文书
当你焦虑迷茫时,请读读这6句话
2019/07/24 职场文书