zend框架实现支持sql server的操作方法


Posted in PHP onDecember 08, 2016

本文实例讲述了zend框架实现支持sql server的操作方法。分享给大家供大家参考,具体如下:

1.修改Zend/Db/Adapter/Pdo/Abstract.php中的connect方法

protected function _connect()
{
  // if we already have a PDO object, no need to re-connect.
  if ($this->_connection) {
    return;
  }
  // get the dsn first, because some adapters alter the $_pdoType
  $dsn = $this->_dsn();
  // check for PDO extension
  if (!extension_loaded('pdo')) {
    /**
     * [url=home.php?mod=space&uid=86763]@see[/url] Zend_Db_Adapter_Exception
     */
    require_once 'Zend/Db/Adapter/Exception.php';
    throw new Zend_Db_Adapter_Exception('The PDO extension is required for this adapter but the extension is not loaded');
  }
  // check the PDO driver is available
  if (!in_array($this->_pdoType, PDO::getAvailableDrivers())) {
    /**
     * @see Zend_Db_Adapter_Exception
     */
    require_once 'Zend/Db/Adapter/Exception.php';
    throw new Zend_Db_Adapter_Exception('The ' . $this->_pdoType . ' driver is not currently installed');
  }
  // create PDO connection
  $q = $this->_profiler->queryStart('connect', Zend_Db_Profiler::CONNECT);
  // add the persistence flag if we find it in our config array
  if (isset($this->_config['persistent']) && ($this->_config['persistent'] == true)) {
    $this->_config['driver_options'][PDO::ATTR_PERSISTENT] = true;
  }
  try {
    //print_r($this->_config);exit;
    if($this->_config['pdoType']=='sqlsrv'){
      $this->_connection = new PDO( "sqlsrv:Server=".$this->_config['host'].";Database = ".$this->_config['dbname'], $this->_config['username'], $this->_config['password']);
      $this->_connection->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
      $this->_connection->setAttribute( PDO::SQLSRV_ATTR_ENCODING, PDO::SQLSRV_ENCODING_UTF8 );
      $this->_profiler->queryEnd($q);
    }elseif ($this->_config['pdoType']=='dblib') {
      $this->_connection = new PDO(
        $dsn,
        $this->_config['username'],
        $this->_config['password'],
        $this->_config['driver_options']
      );
      $this->_profiler->queryEnd($q);
    }
    // set the PDO connection to perform case-folding on array keys, or not
    $this->_connection->setAttribute(PDO::ATTR_CASE, $this->_caseFolding);
    // always use exceptions.
    $this->_connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  } catch (PDOException $e) {
    /**
     * @see Zend_Db_Adapter_Exception
     */
    require_once 'Zend/Db/Adapter/Exception.php';
    throw new Zend_Db_Adapter_Exception($e->getMessage());
  }
}

这里针对linux和windows提供两种连接方式。

2.mssql.php 中的为 protected $_pdoType = 'sqlsrv';

protected function _dsn()
{
    // baseline of DSN parts
    $dsn = $this->_config;
    // don't pass the username and password in the DSN
    unset($dsn['username']);
    unset($dsn['password']);
    unset($dsn['driver_options']);
    if (isset($dsn['port'])) {
      $seperator = ':';
      if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
        $seperator = ',';
      }
      $dsn['host'] .= $seperator . $dsn['port'];
      unset($dsn['port']);
    }
    // this driver supports multiple DSN prefixes
    // @see http://www.php.net/manual/en/ref.pdo-dblib.connection.php
    //print_r($dsn);exit;
    if (isset($dsn['pdoType'])) {
      switch (strtolower($dsn['pdoType'])) {
        case 'freetds':
        case 'sybase':
          $this->_pdoType = 'sybase';
          break;
        case 'mssql':
          $this->_pdoType = 'mssql';
          break;
        case 'sqlsrv':
          $this->_pdoType = 'sqlsrv';
          break;
        case 'dblib':
        default:
          $this->_pdoType = 'dblib';
          break;
      }
      unset($dsn['pdoType']);
    }
    // use all remaining parts in the DSN
    foreach ($dsn as $key => $val) {
      $dsn[$key] = "$key=$val";
    }
    $dsn = $this->_pdoType . ':' . implode(';', $dsn);
   // print_r($dsn);exit;
    return $dsn;
}

3.ZF 的web.xml 数据库配置文件改成:

<db>
  <adapter>PDO_MSSQL</adapter>
<config>
    <host>localhost</host>
    <username>sa</username>
    <password>123456</password>
    <dbname>testdb </dbname>
    <pdoType>sqlsrv</pdoType>
  </config>
</db>

期间遇到中文乱码问题

function convert2utf8($string)
{
    $config = $this->getCfg();
    $pdoType = $config->db->config->pdoType;
    if($pdoType == 'dblib'){
      return iconv("gbk","utf-8",$string);
    }elseif($pdoType == 'sqlsrv'){
      return mb_convert_encoding($string,"UTF-8","auto");
    }
}
function convert2gbk($string)
{
    $config = $this->getCfg();
    $pdoType = $config->db->config->pdoType;
    if($pdoType == 'dblib'){
      return iconv("utf-8","gbk",$string);
    }elseif($pdoType == 'sqlsrv'){
      return mb_convert_encoding($string,"GBK","auto");
    }
}
protected function &getCfg() {
    if ($this->cfg_ === null) {
      $registry = Zend_Registry::getInstance();
      $this->cfg_ = $registry->get('web_config');
    }
    return $this->cfg_;
}

针对不同的类型,进行不同的处理。

希望本文所述对大家基于Zend Framework框架的PHP程序设计有所帮助。

PHP 相关文章推荐
php获取远程图片的两种 CURL方式和sockets方式获取远程图片
Nov 07 PHP
浅析PHP Socket技术
Aug 02 PHP
页面乱码问题的根源及其分析
Aug 09 PHP
ThinkPHP实现多数据库连接的解决方法
Jul 01 PHP
PHP查询快递信息的方法
Mar 07 PHP
php图像处理类实例
Jul 28 PHP
详解WordPress中添加和执行动作的函数使用方法
Dec 29 PHP
分享php邮件管理器源码
Jan 06 PHP
THINKPHP3.2使用soap连接webservice的解决方法
Dec 13 PHP
php记录搜索引擎爬行记录的实现代码
Mar 02 PHP
PHP addAttribute()函数讲解
Feb 03 PHP
PHP常用工具函数小结【移除XSS攻击、UTF8与GBK编码转换等】
Apr 27 PHP
ZendFramework框架实现连接两个或多个数据库的方法
Dec 08 #PHP
thinkPHP模板引擎用法示例
Dec 08 #PHP
thinkPHP中session()方法用法详解
Dec 08 #PHP
thinkPHP引入类的方法详解
Dec 08 #PHP
PHP对象、模式与实践之高级特性分析
Dec 08 #PHP
php中__toString()方法用法示例
Dec 07 #PHP
php中this关键字用法分析
Dec 07 #PHP
You might like
怎样辨别一杯好咖啡
2021/03/03 新手入门
AJAX for PHP简单表数据查询实例
2007/01/02 PHP
很让人受教的 提高php代码质量36计
2012/09/05 PHP
ext 同步和异步示例代码
2009/09/18 Javascript
JQuery入门——事件切换之hover()方法应用介绍
2013/02/05 Javascript
js实现省市联动效果的简单实例
2014/02/10 Javascript
Jquery实现由下向上展开效果的例子
2014/12/08 Javascript
javascript中setAttribute()函数使用方法及兼容性
2015/07/19 Javascript
JS实现方向键切换输入框焦点的方法
2015/08/19 Javascript
基于jquery实现省市联动特效
2015/12/17 Javascript
前端性能优化及技巧
2016/05/06 Javascript
jQuery Easyui学习教程之实现datagrid在没有数据时显示相关提示内容
2016/07/09 Javascript
Angular 中 select指令用法详解
2016/09/29 Javascript
jquery ajax后台返回list,前台用jquery遍历list的实现
2016/10/30 Javascript
BootStrapTable服务器分页实例解析
2016/12/20 Javascript
JS字符串false转boolean的方法(推荐)
2017/03/08 Javascript
微信小程序页面间通信的5种方式
2017/03/31 Javascript
Angularjs 动态添加指令并绑定事件的方法
2017/04/13 Javascript
js计时事件实现圆形时钟
2020/03/25 Javascript
js中复选框的取值及赋值示例详解
2020/10/18 Javascript
Python面向对象之Web静态服务器
2019/09/03 Python
HTML5在线预览PDF的示例代码
2017/09/14 HTML / CSS
Meli Melo官网:名媛们钟爱的英国奢侈手包品牌
2017/04/17 全球购物
历史专业个人求职信分享
2013/12/20 职场文书
一月红领巾广播稿
2014/02/11 职场文书
教师开学感言
2014/02/14 职场文书
外国人聘用意向书
2014/04/01 职场文书
ktv好的活动方案
2014/08/17 职场文书
师德自我剖析材料范文
2014/10/06 职场文书
商铺门面租房协议书
2014/10/21 职场文书
党的群众路线教育实践活动心得体会(企业)
2014/11/03 职场文书
2015年世界艾滋病日活动总结
2015/03/24 职场文书
2015年度个人思想工作总结
2015/04/08 职场文书
幼儿园新学期开学寄语
2015/05/27 职场文书
Nginx解决前端访问资源跨域问题的方法详解
2021/03/31 Servers
Java实现扫雷游戏详细代码讲解
2022/05/25 Java/Android