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
在任意字符集下正常显示网页的方法一
Apr 01 PHP
PHP远程连接MYSQL数据库非常慢的解决方法
Jul 05 PHP
Joomla下利用configuration.php存储简单数据
May 19 PHP
php中的观察者模式简单实例
Jan 20 PHP
php+MySQL实现登录时验证登录名和密码是否正确
May 10 PHP
PHP环境搭建(php+Apache+mysql)
Nov 14 PHP
PHP中PDO事务处理操作示例
May 02 PHP
PHP echo()函数讲解
Feb 15 PHP
一文掌握PHP Xdebug 本地与远程调试(小结)
Apr 23 PHP
PHP rmdir()函数的用法总结
Jul 02 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
Mar 24 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
中国的第一台收音机
2021/03/01 无线电
在线竞拍系统的PHP实现框架(二)
2006/10/09 PHP
文件上传程序的全部源码
2006/10/09 PHP
Php图像处理类代码分享
2012/01/19 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装(win+linux)
2012/05/05 PHP
Yii 2中的load()和save()示例详解
2017/08/03 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
jQuery之DOM对象和jQuery对象的转换与区别分析
2015/01/08 Javascript
基于JavaScript制作霓虹灯文字 代码 特效
2015/09/01 Javascript
JavaScript 定时器 SetTimeout之定时刷新窗口和关闭窗口(代码超简单)
2016/02/26 Javascript
Bootstrap下拉菜单效果实例代码分享
2016/06/30 Javascript
浅谈JavaScript对象与继承
2016/07/10 Javascript
js实现rem自动匹配计算font-size的示例
2017/11/18 Javascript
AngularJs点击状态值改变背景色的实例
2017/12/18 Javascript
Node.js连接Sql Server 2008及数据层封装详解
2018/08/27 Javascript
jQuery实现简单的Ajax调用功能示例
2019/02/15 jQuery
vue设置导航栏、侧边栏为公共页面的例子
2019/11/01 Javascript
vue实现计步器功能
2019/11/01 Javascript
Node中对非阻塞I/O、事件循环的知识点总结
2020/01/05 Javascript
基于Vue中的父子传值问题解决
2020/07/27 Javascript
python 运算符 供重载参考
2009/06/11 Python
使用PYTHON接收多播数据的代码
2012/03/01 Python
Python使用正则表达式抓取网页图片的方法示例
2017/04/21 Python
python中Matplotlib实现绘制3D图的示例代码
2017/09/04 Python
基于python全局设置id 自动化测试元素定位过程解析
2019/09/04 Python
python导入不同目录下的自定义模块过程解析
2019/11/18 Python
如何使用html5与css3完成google涂鸦动画
2012/12/16 HTML / CSS
Ray-Ban雷朋瑞典官方网站:全球领先的太阳眼镜品牌
2019/08/22 全球购物
定义一结构体数组表示分数,并求两个分数相加之和
2013/06/11 面试题
个人自荐信
2013/12/05 职场文书
2015幼儿园庆元旦活动方案
2014/12/09 职场文书
男方婚前保证书
2015/02/28 职场文书
起诉书格式范文
2015/05/20 职场文书
2016入党培训心得体会范文
2016/01/08 职场文书
小学2016年“我们的节日·重阳节”活动总结
2016/04/01 职场文书
ubuntu开机后ROS程序自启动问题
2022/12/24 Servers