本文实例讲述了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程序设计有所帮助。