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新手上路(八)
Oct 09 PHP
PHP中函数内引用全局变量的方法
Oct 20 PHP
php程序之die调试法 快速解决错误
Sep 17 PHP
php数组一对一替换实现代码
Aug 31 PHP
PHP获取MySql新增记录ID值的3种方法
Jun 24 PHP
ThinkPHP连接数据库及主从数据库的设置教程
Aug 22 PHP
ThinkPHP公共配置文件与各自项目中配置文件组合的方法
Nov 24 PHP
typecho插件编写教程(二):写一个新插件
May 28 PHP
浅析PHP关键词替换的类(避免重复替换,保留与还原原始链接)
Sep 22 PHP
linux下php上传文件注意事项
Jun 11 PHP
php自定义函数实现JS的escape的方法示例
Jul 07 PHP
解决PHP上传非标准格式的图片pjpeg失败的方法
Mar 12 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
Session的工作机制详解和安全性问题(PHP实例讲解)
2014/04/10 PHP
Symfony2实现在controller中获取url的方法
2016/03/18 PHP
基于JQuery实现的类似购物商城的购物车
2011/12/06 Javascript
面向对象的Javascript之三(封装和信息隐藏)
2012/01/27 Javascript
javascript 基础篇3 类,回调函数,内置对象,事件处理
2012/03/14 Javascript
jQuery的显示和隐藏方法与css隐藏的样式对比
2013/10/18 Javascript
js判断元素是否隐藏的方法
2014/06/09 Javascript
JavaScript中的Primitive对象封装介绍
2014/12/31 Javascript
ClearTimeout消除闪动实例代码
2016/02/29 Javascript
Bootstrap整体框架之CSS12栅格系统
2016/12/15 Javascript
移动端手指放大缩小插件与js源码
2017/05/22 Javascript
IScroll那些事_当内容不足时下拉刷新的解决方法
2017/07/18 Javascript
基于js 各种排序方法和sort方法的区别(详解)
2018/01/03 Javascript
vuex的module模块用法示例
2018/11/12 Javascript
对Layer UI 模块化的用法详解
2019/09/26 Javascript
vue+element tabs选项卡分页效果
2020/06/29 Javascript
element-ui 文件上传修改文件名的方法示例
2019/11/05 Javascript
js实现翻牌小游戏
2020/07/31 Javascript
Python使用functools模块中的partial函数生成偏函数
2016/07/02 Python
1 行 Python 代码快速实现 FTP 服务器
2018/01/25 Python
关于python列表增加元素的三种操作方法
2018/08/22 Python
Python使用matplotlib绘制随机漫步图
2018/08/27 Python
python 3.6.5 安装配置方法图文教程
2018/09/18 Python
python 创建一维的0向量实例
2019/12/02 Python
Python如何定义有可选参数的元类
2020/07/31 Python
学期自我鉴定
2013/11/04 职场文书
汽车运用工程系毕业生自荐信
2013/12/27 职场文书
演讲比赛的活动方案
2014/08/28 职场文书
大学生就业协议书范本(适用于公司企业)
2014/10/07 职场文书
党员评议个人总结
2014/10/20 职场文书
村党的群众路线教育实践活动总结材料
2014/10/31 职场文书
爱岗敬业事迹材料
2014/12/24 职场文书
建议书的格式及范文
2015/09/14 职场文书
python基础之类属性和实例属性
2021/10/24 Python
MybatisPlus EntityWrapper如何自定义SQL
2022/03/22 Java/Android
SpringBoot整合Minio文件存储
2022/04/03 Java/Android