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 相关文章推荐
别人整理的服务器变量:$_SERVER
Oct 20 PHP
一个捕获函数输出的函数
Feb 14 PHP
php二分法在IP地址查询中的应用
Aug 12 PHP
php set_time_limit()函数的使用详解
Jun 05 PHP
PHP 输出URL的快捷方式示例代码
Sep 22 PHP
php的一个简单加密解密代码
Jan 14 PHP
PHP根据IP判断地区名信息的示例代码
Mar 03 PHP
PHP中JSON的应用技巧
Oct 10 PHP
php 7新特性之类型申明详解
Jun 06 PHP
yii2中LinkPager增加总页数和总记录数的实例
Aug 28 PHP
PHP实现读取文件夹及批量重命名文件操作示例
Apr 15 PHP
Yii中特殊行为ActionFilter的使用方法示例
Oct 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
php绝对路径与相对路径之间关系的的分析
2010/03/03 PHP
Ajax+PHP快速上手及简单应用说明
2013/07/24 PHP
PHP加Nginx实现动态裁剪图片方案
2014/03/10 PHP
PHP反射使用实例和PHP反射API的中文说明
2014/07/02 PHP
php实现面包屑导航例子分享
2015/12/19 PHP
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
php无限极分类实现方法分析
2019/07/04 PHP
cnblogs csdn 代码运行框实现代码
2009/11/02 Javascript
javascript数组操作方法小结和3个属性详细介绍
2014/07/05 Javascript
JavaScript常用的返回,自动跳转,刷新,关闭语句汇总
2015/01/13 Javascript
Javascript中call和apply函数的比较和使用实例
2015/02/03 Javascript
jQuery替换节点用法示例(使用replaceWith方法)
2016/09/08 Javascript
利用js编写响应式侧边栏
2016/09/17 Javascript
详解Vue2.0之去掉组件click事件的native修饰
2017/04/20 Javascript
详解Angular2表单-模板驱动的表单(Template-Driven Forms)
2017/08/04 Javascript
微信小程序基础教程之worker线程的使用方法
2019/07/15 Javascript
解决layui数据表格Date日期格式的回显Object的问题
2019/09/19 Javascript
Python爬虫包BeautifulSoup学习实例(五)
2018/06/17 Python
python 处理string到hex脚本的方法
2018/10/26 Python
深入浅析Python科学计算库Scipy及安装步骤
2019/10/12 Python
python飞机大战 pygame游戏创建快速入门详解
2019/12/17 Python
通过Turtle库在Python中绘制一个鼠年福鼠
2020/02/03 Python
python中元组的用法整理
2020/06/15 Python
卸载tensorflow-cpu重装tensorflow-gpu操作
2020/06/23 Python
IE8下CSS3选择器nth-child() 不兼容问题的解决方法
2016/11/16 HTML / CSS
css3实现文字扫光渐变动画效果的示例
2017/11/07 HTML / CSS
canvas实现圆绘制的示例代码
2019/09/11 HTML / CSS
汉森批发:Hansen Wholesale
2018/05/24 全球购物
一年级家长会邀请函
2014/01/25 职场文书
2014年党员加强作风建设思想汇报
2014/09/15 职场文书
教师党员批评与自我批评发言稿
2014/10/15 职场文书
上课迟到检讨书300字
2014/10/15 职场文书
2015年入党决心书
2015/02/05 职场文书
汽车4S店前台接待岗位职责
2015/04/03 职场文书
民间借贷纠纷答辩状
2015/08/03 职场文书
导游词之包公祠
2019/11/25 职场文书