Zend Framework入门教程之Zend_Db数据库操作详解

本文实例讲述了Zend Framework中Zend_Db数据库操作方法。分享给大家供大家参考,具体如下:

引言:Zend操作数据库通过Zend_Db_Adapter

它可以连接多种数据库,可以是DB2数据库、MySQli数据库、Oracle数据库。等等。

只需要配置相应的参数就可以了。

下面通过案例来展示一下其连接数据库的过程。

连接mysql数据库

代码:

'127.0.0.1','username'=>'root','password'=>'','dbname'=>'test' ); $db = Zend_Db::factory('PDO_Mysql',$params);

点评:

这是连接mysql的代码案例,提供相应的参数就可以了。连接不同的数据库,提供不同的参数。下面是sqlite的例子

代码:

'test.mdb'); $db = Zend_Db::factory('PDO_Sqlite',$params);

点评:

sqlite明显参数不一样了,只需要提供数据库名字就可以了。
连接完数据库之后,就可以查询数据库信息以及操作数据库信息了。
如果查询呢?

下面是查询的代码案例:

'127.0.0.1',$params); $sql = $db->quoteInto('SELECT * FROM user WHERE idquery($sql); //执行SQL查询 $r_a = $result->fetchAll(); //返回结果数组 print_r($r_a);

点评:

执行完上述代码,就会展示出数据库中前五条记录的信息。

那么这其中的玄机是什么呢?

我们来看一下源码。

我们来看看Db.php中的factory方法

toArray();
}
/*
* Convert Zend_Config argument to plain string
* adapter name and separate config object.
*/
if ($adapter instanceof Zend_Config) {
if (isset($adapter->params)) {
$config = $adapter->params->toArray();
}
if (isset($adapter->adapter)) {
$adapter = (string) $adapter->adapter;
} else {
$adapter = null;
}
}
/*
* Verify that adapter parameters are in an array.
*/
if (!is_array($config)) {
/**
* @see Zend_Db_Exception
*/
require_once 'Zend/Db/Exception.php';
throw new Zend_Db_Exception('Adapter parameters must be in an array or a Zend_Config object');
}
/*
* Verify that an adapter name has been specified.
*/
if (!is_string($adapter) || empty($adapter)) {
/**
* @see Zend_Db_Exception
*/
require_once 'Zend/Db/Exception.php';
throw new Zend_Db_Exception('Adapter name must be specified in a string');
}
/*
* Form full adapter class name
*/
$adapterNamespace = 'Zend_Db_Adapter';
if (isset($config['adapterNamespace'])) {
if ($config['adapterNamespace'] != '') {
$adapterNamespace = $config['adapterNamespace'];
}
unset($config['adapterNamespace']);
}
// Adapter no longer normalized- see http://framework.zend.com/issues/browse/ZF-5606
$adapterName = $adapterNamespace . '_';
$adapterName .= str_replace(' ','_',ucwords(str_replace('_',' ',strtolower($adapter))));
print_r($adapterName);exit;
/*
* Load the adapter class. This throws an exception
* if the specified class cannot be loaded.
*/
if (!class_exists($adapterName)) {
require_once 'Zend/Loader.php';
Zend_Loader::loadClass($adapterName);
}
/*
* Create an instance of the adapter class.
* Pass the config to the adapter class constructor.
*/
$dbAdapter = new $adapterName($config);
/*
* Verify that the object created is a descendent of the abstract adapter type.
*/
if (! $dbAdapter instanceof Zend_Db_Adapter_Abstract) {
/**
* @see Zend_Db_Exception
*/
require_once 'Zend/Db/Exception.php';
throw new Zend_Db_Exception("Adapter class '$adapterName' does not extend Zend_Db_Adapter_Abstract");
}
return $dbAdapter;
}

点评:这个方法就是核心了,代码量不多,但是作用很明确,它会通过你提供的两个参数,自动生成相应的数据库连接类的对象。具有一定的灵活性,机动性。

主要是其中的

这段代码会引入相应的数据库连接类,比如前面的两个例子,就是分别引入了Zend目录下Db目录下Adapter目录下Pdo目录下的mysql.php类。

不同的数据库,会引入不同的数据库文件。

我们来看看mysql.php类中的内容:

Zend_Db::INT_TYPE,Zend_Db::BIGINT_TYPE => Zend_Db::BIGINT_TYPE,Zend_Db::FLOAT_TYPE => Zend_Db::FLOAT_TYPE,'INT' => Zend_Db::INT_TYPE,'INTEGER' => Zend_Db::INT_TYPE,'MEDIUMINT' => Zend_Db::INT_TYPE,'SMALLINT' => Zend_Db::INT_TYPE,'TINYINT' => Zend_Db::INT_TYPE,'BIGINT' => Zend_Db::BIGINT_TYPE,'SERIAL' => Zend_Db::BIGINT_TYPE,'DEC' => Zend_Db::FLOAT_TYPE,'DECIMAL' => Zend_Db::FLOAT_TYPE,'DOUBLE' => Zend_Db::FLOAT_TYPE,'DOUBLE PRECISION' => Zend_Db::FLOAT_TYPE,'FIXED' => Zend_Db::FLOAT_TYPE,'FLOAT' => Zend_Db::FLOAT_TYPE ); /** * Override _dsn() and ensure that charset is incorporated in mysql * @see Zend_Db_Adapter_Pdo_Abstract::_dsn() */ protected function _dsn() { $dsn = parent::_dsn(); if (isset($this->_config['charset'])) { $dsn .= ';charset=' . $this->_config['charset']; } return $dsn; } /** * Creates a PDO object and connects to the database. * * @return void * @throws Zend_Db_Adapter_Exception */ protected function _connect() { if ($this->_connection) { return; } if (!empty($this->_config['charset'])) { $initCommand = "SET NAMES '" . $this->_config['charset'] . "'"; $this->_config['driver_options'][1002] = $initCommand; // 1002 = PDO::MYSQL_ATTR_INIT_COMMAND } parent::_connect(); } /** * @return string */ public function getQuoteIdentifierSymbol() { return "`"; } /** * Returns a list of the tables in the database. * * @return array */ public function listTables() { return $this->fetchCol('SHOW TABLES'); } /** * Returns the column descriptions for a table. * * The return value is an associative array keyed by the column name,* as returned by the RDBMS. * * The value of each array element is an associative array * with the following keys: * * SCHEMA_NAME => string; name of database or schema * TABLE_NAME => string; * COLUMN_NAME => string; column name * COLUMN_POSITION => number; ordinal position of column in table * DATA_TYPE => string; SQL datatype name of column * DEFAULT => string; default expression of column,null if none * NULLABLE => boolean; true if column can have nulls * LENGTH => number; length of CHAR/VARCHAR * SCALE => number; scale of NUMERIC/DECIMAL * PRECISION => number; precision of NUMERIC/DECIMAL * UNSIGNED => boolean; unsigned property of an integer type * PRIMARY => boolean; true if column is part of the primary key * PRIMARY_POSITION => integer; position of column in primary key * IDENTITY => integer; true if column is auto-generated with unique values * * @param string $tableName * @param string $schemaName OPTIONAL * @return array */ public function describeTable($tableName,$schemaName = null) { // @todo use INFORMATION_SCHEMA someday when MySQL's // implementation has reasonably good performance and // the version with this improvement is in wide use. if ($schemaName) { $sql = 'DESCRIBE ' . $this->quoteIdentifier("$schemaName.$tableName",true); } else { $sql = 'DESCRIBE ' . $this->quoteIdentifier($tableName,true); } $stmt = $this->query($sql); // Use FETCH_NUM so we are not dependent on the CASE attribute of the PDO connection $result = $stmt->fetchAll(Zend_Db::FETCH_NUM); $field = 0; $type = 1; $null = 2; $key = 3; $default = 4; $extra = 5; $desc = array(); $i = 1; $p = 1; foreach ($result as $row) { list($length,$scale,$precision,$unsigned,$primary,$primaryPosition,$identity) = array(null,null,false,false); if (preg_match('/unsigned/',$row[$type])) { $unsigned = true; } if (preg_match('/^((?:var)?char)\((\d+)\)/',$row[$type],$matches)) { $row[$type] = $matches[1]; $length = $matches[2]; } else if (preg_match('/^decimal\((\d+),(\d+)\)/',$matches)) { $row[$type] = 'decimal'; $precision = $matches[1]; $scale = $matches[2]; } else if (preg_match('/^float\((\d+),$matches)) { $row[$type] = 'float'; $precision = $matches[1]; $scale = $matches[2]; } else if (preg_match('/^((?:big|medium|small|tiny)?int)\((\d+)\)/',$matches)) { $row[$type] = $matches[1]; // The optional argument of a MySQL int type is not precision // or length; it is only a hint for display width. } if (strtoupper($row[$key]) == 'PRI') { $primary = true; $primaryPosition = $p; if ($row[$extra] == 'auto_increment') { $identity = true; } else { $identity = false; } ++$p; } $desc[$this->foldCase($row[$field])] = array( 'SCHEMA_NAME' => null,// @todo 'TABLE_NAME' => $this->foldCase($tableName),'COLUMN_NAME' => $this->foldCase($row[$field]),'COLUMN_POSITION' => $i,'DATA_TYPE' => $row[$type],'DEFAULT' => $row[$default],'NULLABLE' => (bool) ($row[$null] == 'YES'),'LENGTH' => $length,'SCALE' => $scale,'PRECISION' => $precision,'UNSIGNED' => $unsigned,'PRIMARY' => $primary,'PRIMARY_POSITION' => $primaryPosition,'IDENTITY' => $identity ); ++$i; } return $desc; } /** * Adds an adapter-specific LIMIT clause to the SELECT statement. * * @param string $sql * @param integer $count * @param integer $offset OPTIONAL * @throws Zend_Db_Adapter_Exception * @return string */ public function limit($sql,$count,$offset = 0) { $count = intval($count); if ($count <= 0) { /** @see Zend_Db_Adapter_Exception */ require_once 'Zend/Db/Adapter/Exception.php'; throw new Zend_Db_Adapter_Exception("LIMIT argument count=$count is not valid"); } $offset = intval($offset); if ($offset < 0) { /** @see Zend_Db_Adapter_Exception */ require_once 'Zend/Db/Adapter/Exception.php'; throw new Zend_Db_Adapter_Exception("LIMIT argument offset=$offset is not valid"); } $sql .= " LIMIT $count"; if ($offset > 0) { $sql .= " OFFSET $offset"; } return $sql; } }

dawei

【声明】:淮南站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。