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中用文本文件做数据库的实现方法
Mar 27 PHP
php 文件上传系统手记
Oct 26 PHP
PHP的substr_replace将指定两位置之间的字符替换为*号
May 04 PHP
自己写的php curl库实现整站克隆功能
Feb 12 PHP
php动态添加url查询参数的方法
Apr 14 PHP
php使用array_search函数实现数组查找的方法
Jun 12 PHP
PHP远程调试之XDEBUG
Dec 29 PHP
PHP入门教程之自定义函数用法详解(创建,调用,变量,参数,返回值等)
Sep 11 PHP
PHP缩略图生成和图片水印制作
Jan 07 PHP
php使用PDO从数据库表中读取数据的实现方法(必看)
Jun 02 PHP
PHP模版引擎原理、定义与用法实例
Mar 29 PHP
PHP程序员简单的开展服务治理架构操作详解(一)
May 14 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/04 咖啡文化
PHP中文分词的简单实现代码分享
2011/07/17 PHP
选择PHP作为网站开发语言的原因分享
2012/01/03 PHP
解析PHP汉字转换拼音的类
2013/06/18 PHP
linux中cd命令使用详解
2015/01/08 PHP
PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】
2017/02/07 PHP
教你如何解密js/vbs/vbscript加密的编码异处理小结
2008/06/25 Javascript
鼠标经过的文本框textbox变色
2009/05/21 Javascript
JavaScript DOM学习第八章 表单错误提示
2010/02/19 Javascript
jquery validate.js表单验证的基本用法入门
2010/05/13 Javascript
仿jQuery的siblings效果的js代码
2011/08/09 Javascript
jquery移动节点实例
2015/01/14 Javascript
在JSP中如何实现MD5加密的方法
2016/11/02 Javascript
纯javaScript、jQuery实现个性化图片轮播【推荐】
2017/01/08 Javascript
JavaScript数据结构之二叉查找树的定义与表示方法
2017/04/12 Javascript
Nodejs中使用phantom将html转为pdf或图片格式的方法
2017/09/18 NodeJs
layui自己添加图片按钮并点击跳转页面的例子
2019/09/14 Javascript
mpvue实现小程序签到金币掉落动画(api实现)
2019/10/17 Javascript
vue 自定义右键样式的实例代码
2019/11/06 Javascript
Vue中this.$nextTick的作用及用法
2020/02/04 Javascript
js中复选框的取值及赋值示例详解
2020/10/18 Javascript
jQuery实现全选按钮
2021/01/01 jQuery
基于element-ui封装表单金额输入框的方法示例
2021/01/06 Javascript
[50:02]完美世界DOTA2联赛循环赛 Magma vs IO BO2第一场 11.01
2020/11/02 DOTA
在Python中处理字符串之isdigit()方法的使用
2015/05/18 Python
Python之list对应元素求和的方法
2018/06/28 Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
2020/04/01 Python
详解如何使用Pytest进行自动化测试
2021/01/14 Python
使用CSS媒体查询(Media Queries)和JavaScript判断浏览器设备类型的方法
2014/04/03 HTML / CSS
美国精品家居用品网站:US-Mattress
2016/08/24 全球购物
eBay奥地利站:eBay.at
2019/07/24 全球购物
董事长职责范文
2013/11/08 职场文书
大学生入党思想汇报
2014/01/14 职场文书
留学推荐信(中英文版)
2015/03/26 职场文书
清明扫墓感想
2015/08/11 职场文书
公司与个人合作协议书
2016/03/19 职场文书