ThinkPHP2.0读取MSSQL提示Incorrect syntax near the keyword 'AS'的解决方法

 更新时间:2014年06月25日 15:39:28   投稿:shichen2014  
这篇文章主要介绍了ThinkPHP2.0读取MSSQL提示Incorrect syntax near the keyword 'AS'的解决方法,需要的朋友可以参考下

问题代码如下:

<?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 版本能用的完美驱动。

相关文章

  • CI使用Tank Auth转移数据库导致密码用户错误的解决办法

    CI使用Tank Auth转移数据库导致密码用户错误的解决办法

    Tank Auth是针对Codeigniter的权限管理类库,功能很强大。但是将数据库转到另一台服务器上,会出现之前的用户名和密码都无法登录的情况。这篇文章主要介绍了CI使用Tank Auth转移数据库导致密码用户错误的解决办法,需要的朋友可以参考下
    2014-06-06
  • php操作memcache缓存方法分享

    php操作memcache缓存方法分享

    一般来说,如果并发量不大的情况,使不使用缓存技术并没有什么影响,但如果高并发的情况,使用缓存技术就显得很重要了,可以很好的减轻数据库和服务器的压力,当然解决高并发的技术有很多,这里只是以缓存的角度来说明使用memcache的便捷性和方便性,
    2015-06-06
  • Yii统计不同类型邮箱数量的方法

    Yii统计不同类型邮箱数量的方法

    这篇文章主要介绍了Yii统计不同类型邮箱数量的方法,涉及Yii数据库查询及字符串的遍历、截取与判断相关操作技巧,需要的朋友可以参考下
    2016-10-10
  • 基于thinkPHP框架实现留言板的方法

    基于thinkPHP框架实现留言板的方法

    这篇文章主要介绍了基于thinkPHP框架实现留言板的方法,简单分析了thinkPHP框架实现留言板的流程及控制器与模型的相关核心代码,需要的朋友可以参考下
    2016-10-10
  • PDO操作MySQL的基础教程(推荐)

    PDO操作MySQL的基础教程(推荐)

    下面小编就为大家带来一篇PDO操作MySQL的基础教程(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • dedecms中使用php语句指南

    dedecms中使用php语句指南

    dedecms是广大站长们比较喜欢也经常使用的一款文章管理系统,使用方便,今天我们来研究下dedecms中如何使用php语句,有相同需求的小伙伴们可要看仔细了。
    2014-11-11
  • php中3种方法删除字符串中间的空格

    php中3种方法删除字符串中间的空格

    这篇文章主要介绍了php中3种方法删除字符串中间的空格,需要的朋友可以参考下
    2014-03-03
  • PHP多进程编程实例

    PHP多进程编程实例

    这篇文章主要介绍了PHP多进程编程实例,本文讲解的是在Linux下实现PHP多进程编程,需要的朋友可以参考下
    2014-10-10
  • 基于Laravel实现的用户动态模块开发

    基于Laravel实现的用户动态模块开发

    这篇文章主要给大家介绍了关于基于Laravel实现的用户动态模块开发的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-09-09
  • 兼容ie6浏览器的php下载文件代码分享

    兼容ie6浏览器的php下载文件代码分享

    这篇文章主要介绍了兼容ie6浏览器的php下载文件代码分享,解决了ie6下无法下载文件的bug,需要的朋友可以参考下
    2014-07-07

最新评论