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 相关文章推荐
杏林同学录(一)
Oct 09 PHP
php md5下16位和32位的实现代码
Apr 09 PHP
php的access操作类
Apr 09 PHP
php 友好URL的实现(吐血推荐)
Oct 04 PHP
php 禁止页面缓存输出
Jan 07 PHP
php SQL Injection with MySQL
Feb 27 PHP
PHP仿博客园 个人博客(2) 数据库增添改删
Jul 05 PHP
浅析php中三个等号(===)和两个等号(==)的区别
Aug 06 PHP
浅析linux下apache服务器的配置和管理
Aug 10 PHP
php实现12306余票查询、价格查询示例
Apr 17 PHP
php简单实现屏蔽指定ip段用户的访问
Apr 29 PHP
Symfony2框架学习笔记之表单用法详解
Mar 18 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_SELF的安全问题
2009/09/05 PHP
php中钩子(hook)的原理与简单应用demo示例
2019/09/03 PHP
javascript document.images实例
2008/05/27 Javascript
JavaScript入门教程(3) js面向对象
2009/01/31 Javascript
JavaScript 原型链学习总结
2010/10/29 Javascript
借助javascript代码判断网页是静态还是伪静态
2014/05/05 Javascript
JavaScript中return用法示例
2016/11/29 Javascript
详解nodejs 文本操作模块-fs模块(二)
2016/12/22 NodeJs
前端MVVM框架解析之双向绑定
2018/01/24 Javascript
angularjs数组判断是否含有某个元素的实例
2018/02/27 Javascript
vue click.stop阻止点击事件继续传播的方法
2018/09/04 Javascript
微信小程序搭建(mpvue+mpvue-weui+fly.js)的详细步骤
2018/09/18 Javascript
使用element-ui table expand展开行实现手风琴效果
2019/03/15 Javascript
JS实现简单的文字无缝上下滚动功能示例
2019/06/22 Javascript
package.json配置文件构成详解
2019/08/27 Javascript
JavaScript canvas实现雪花随机动态飘落
2020/02/08 Javascript
vue设置默认首页的操作
2020/08/12 Javascript
[02:49:21]2019完美盛典全程录像
2019/12/08 DOTA
在Python 3中实现类型检查器的简单方法
2015/07/03 Python
Python编写一个优美的下载器
2018/04/15 Python
Scrapy-Redis结合POST请求获取数据的方法示例
2019/05/07 Python
django使用admin站点上传图片的实例
2019/07/28 Python
西班牙手机之家:Phone House
2018/10/18 全球购物
纽约海:Sea New York
2018/11/04 全球购物
铭宣海淘转运:美国、日本、英国转运等全球转运公司
2019/09/10 全球购物
2014年学习雷锋活动总结
2014/03/01 职场文书
竞选团支书演讲稿
2014/04/28 职场文书
产品售后服务承诺书
2014/05/21 职场文书
创先争优公开承诺书
2014/08/30 职场文书
离职证明标准格式
2014/09/15 职场文书
2014年绿化工作总结
2014/12/09 职场文书
特种设备安全管理制度
2015/08/06 职场文书
演讲稿:​快乐,从不抱怨开始!
2019/04/02 职场文书
详解Go语言中Get/Post请求测试
2022/06/01 Golang
如何利用python创作字符画
2022/06/25 Python