本文实例讲述了zend框架实现支持sql server的操作方法。分享给大家供大家参考,具体如下:
1.修改Zend/Db/Adapter/Pdo/Abstract.php中的connect方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
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';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
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 数据库配置文件改成:
1
2
3
4
5
6
7
8
9
10
|
< db > < adapter >PDO_MSSQL</ adapter > < config > < host >localhost</ host > < username >sa</ username > < password >123456</ password > < dbname >testdb </ dbname > < pdoType >sqlsrv</ pdoType > </ config > </ db > |
期间遇到中文乱码问题
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
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程序设计有所帮助。