900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > Zend Framework入门教程之Zend_Db数据库操作详解

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

时间:2019-04-21 16:37:39

相关推荐

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

php教程|PHP开发

数据库,入门教程,Framework,Zend

php教程-PHP开发

数据采集软件 源码,ubuntu打开桌面空白,tomcat优化增加并发量,爬虫商城赚钱,php 裁剪白底图,lzw

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

微信公众帐号营销平台源码,vscode微软官网下载,ubuntu无网卡,改tomcat 工程名,seo url 爬虫,php指定查询字段,餐饮行业seo优化策划,c 学校报名网站源码下载,个人博客电脑手机自适应模板lzw

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

炫舞2辅助源码,vscode新建文件的默认语言,微软商店ubuntu,tomcat8上传bug,爬虫源码c,php网页如何发布,seo自学教程零基础推广lzw

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

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

连接mysql数据库

代码:

127.0.0.1, username=> oot, password=>\, dbname=> est );$db = Zend_Db::factory(PDO_Mysql,$params);

点评:

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

代码:

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

点评:

sqlite明显参数不一样了,只需要提供数据库名字就可以了。

连接完数据库之后,就可以查询数据库信息以及操作数据库信息了。

如果查询呢?

下面是查询的代码案例:

127.0.0.1, username=> oot, password=>\, dbname=> est );$db = Zend_Db::factory(PDO_Mysql,$params);$sql = $db->quoteInto(SELECT * FROM user WHERE idquery($sql); //执行SQL查询$r_a = $result->fetchAll(); //返回结果数组print_r($r_a);

点评:

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

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

我们来看一下源码。

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

public static function factory($adapter, $config = array()){ if ($config instanceof Zend_Config) {$config = $config->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 end/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 end/Db/Exception.php;throw new Zend_Db_Exception(Adapter name must be specified in a string); } /** Form full adapter class name*/ $adapterNamespace = end_Db_Adapter; if (isset($config[adapterNamespace])) {if ($config[adapterNamespace] != \) { $adapterNamespace = $config[adapterNamespace];}unset($config[adapterNamespace]); } // Adapter no longer normalized- see /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 end/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 end/Db/Exception.php;throw new Zend_Db_Exception("Adapter class $adapterName does not extend Zend_Db_Adapter_Abstract"); } return $dbAdapter;}

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

主要是其中的

$adapterName = $adapterNamespace . \_;$adapterName .= str_replace( , \_, ucwords(str_replace(\_, , strtolower($adapter))));/* * Load the adapter class. This throws an exception * if the specified class cannot be loaded. */if (!class_exists($adapterName)) {require_once end/Loader.php;Zend_Loader::loadClass($adapterName);}

这段代码会引入相应的数据库连接类,比如前面的两个例子,就是分别引入了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 MySQLs // 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, null, null, false, null, 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+)\)/, $row[$type], $matches)) { $row[$type] = decimal; $precision = $matches[1]; $scale = $matches[2];} else if (preg_match(/^float\((\d+),(\d+)\)/, $row[$type], $matches)) { $row[$type] = float; $precision = $matches[1]; $scale = $matches[2];} else if (preg_match(/^((?:big|medium|small|tiny)?int)\((\d+)\)/, $row[$type], $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 end/Db/Adapter/Exception.php;throw new Zend_Db_Adapter_Exception("LIMIT argument count=$count is not valid"); } $offset = intval($offset); if ($offset 0) {$sql .= " OFFSET $offset"; } return $sql; }}

这里又引入了一个Abstract类,抽象类

_config settings. * * @return string */ protected function _dsn() { // baseline of DSN parts $dsn = $this->_config; // don pass the username, password, charset, persistent and driver_options in the DSN unset($dsn[username]); unset($dsn[password]); unset($dsn[options]); unset($dsn[charset]); unset($dsn[persistent]); unset($dsn[driver_options]); // use all remaining parts in the DSN foreach ($dsn as $key => $val) {$dsn[$key] = "$key=$val"; } return $this->_pdoType . : . implode(;, $dsn); } /** * Creates a PDO object and connects to the database. * * @return void * @throws Zend_Db_Adapter_Exception */ 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)) {/** * @see Zend_Db_Adapter_Exception */require_once end/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 end/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 {$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 end/Db/Adapter/Exception.php;throw new Zend_Db_Adapter_Exception($e->getMessage(), $e->getCode(), $e); } } /** * Test if a connection is active * * @return boolean */ public function isConnected() { return ((bool) ($this->_connection instanceof PDO)); } /** * Force the connection to close. * * @return void */ public function closeConnection() { $this->_connection = null; } /** * Prepares an SQL statement. * * @param string $sql The SQL statement with placeholders. * @param array $bind An array of data to bind to the placeholders. * @return PDOStatement */ public function prepare($sql) { $this->_connect(); $stmtClass = $this->_defaultStmtClass; if (!class_exists($stmtClass)) {require_once end/Loader.php;Zend_Loader::loadClass($stmtClass); } $stmt = new $stmtClass($this, $sql); $stmt->setFetchMode($this->_fetchMode); return $stmt; } /** * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column. * * As a convention, on RDBMS brands that support sequences * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence * from the arguments and returns the last id generated by that sequence. * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method * returns the last value generated for such a column, and the table name * argument is disregarded. * * On RDBMS brands that don support sequences, $tableName and $primaryKey * are ignored. * * @param string $tableName OPTIONAL Name of table. * @param string $primaryKey OPTIONAL Name of primary key column. * @return string */ public function lastInsertId($tableName = null, $primaryKey = null) { $this->_connect(); return $this->_connection->lastInsertId(); } /** * Special handling for PDO query(). * All bind parameter names must begin with : * * @param string|Zend_Db_Select $sql The SQL statement with placeholders. * @param array $bind An array of data to bind to the placeholders. * @return Zend_Db_Statement_Pdo * @throws Zend_Db_Adapter_Exception To re-throw PDOException. */ public function query($sql, $bind = array()) { if (empty($bind) && $sql instanceof Zend_Db_Select) {$bind = $sql->getBind(); } if (is_array($bind)) {foreach ($bind as $name => $value) { if (!is_int($name) && !preg_match(/^:/, $name)) {$newName = ":$name";unset($bind[$name]);$bind[$newName] = $value; }} } try {return parent::query($sql, $bind); } catch (PDOException $e) {/** * @see Zend_Db_Statement_Exception */require_once end/Db/Statement/Exception.php;throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); } } /** * Executes an SQL statement and return the number of affected rows * * @param mixed $sql The SQL statement with placeholders. * May be a string or Zend_Db_Select. * @return integer Number of rows that were modified * or deleted by the SQL statement */ public function exec($sql) { if ($sql instanceof Zend_Db_Select) {$sql = $sql->assemble(); } try {$affected = $this->getConnection()->exec($sql);if ($affected === false) { $errorInfo = $this->getConnection()->errorInfo(); /** * @see Zend_Db_Adapter_Exception */ require_once end/Db/Adapter/Exception.php; throw new Zend_Db_Adapter_Exception($errorInfo[2]);}return $affected; } catch (PDOException $e) {/** * @see Zend_Db_Adapter_Exception */require_once end/Db/Adapter/Exception.php;throw new Zend_Db_Adapter_Exception($e->getMessage(), $e->getCode(), $e); } } /** * Quote a raw string. * * @param string $value Raw string * @return stringQuoted string */ protected function _quote($value) { if (is_int($value) || is_float($value)) {return $value; } $this->_connect(); return $this->_connection->quote($value); } /** * Begin a transaction. */ protected function _beginTransaction() { $this->_connect(); $this->_connection->beginTransaction(); } /** * Commit a transaction. */ protected function _commit() { $this->_connect(); $this->_connection->commit(); } /** * Roll-back a transaction. */ protected function _rollBack() { $this->_connect(); $this->_connection->rollBack(); } /** * Set the PDO fetch mode. * * @todo Support FETCH_CLASS and FETCH_INTO. * * @param int $mode A PDO fetch mode. * @return void * @throws Zend_Db_Adapter_Exception */ public function setFetchMode($mode) { //check for PDO extension if (!extension_loaded(pdo)) {/** * @see Zend_Db_Adapter_Exception */require_once end/Db/Adapter/Exception.php;throw new Zend_Db_Adapter_Exception(The PDO extension is required for this adapter but the extension is not loaded); } switch ($mode) {case PDO::FETCH_LAZY:case PDO::FETCH_ASSOC:case PDO::FETCH_NUM:case PDO::FETCH_BOTH:case PDO::FETCH_NAMED:case PDO::FETCH_OBJ: $this->_fetchMode = $mode; break;default: /** * @see Zend_Db_Adapter_Exception */ require_once end/Db/Adapter/Exception.php; throw new Zend_Db_Adapter_Exception("Invalid fetch mode $mode specified"); break; } } /** * Check if the adapter supports real SQL parameters. * * @param string $type positional or amed * @return bool */ public function supportsParameters($type) { switch ($type) {case positional:case amed:default: return true; } } /** * Retrieve server version in PHP style * * @return string */ public function getServerVersion() { $this->_connect(); try {$version = $this->_connection->getAttribute(PDO::ATTR_SERVER_VERSION); } catch (PDOException $e) {// In case of the driver doesn support getting attributesreturn null; } $matches = null; if (preg_match(/((?:[0-9]{1,2}\.){1,3}[0-9]{1,2})/, $version, $matches)) {return $matches[1]; } else {return null; } }}

这个抽象类中又有另一个核心的抽象类。一些核心的方法都在这里

Zend_Db::INT_TYPE, Zend_Db::BIGINT_TYPE => Zend_Db::BIGINT_TYPE, Zend_Db::FLOAT_TYPE => Zend_Db::FLOAT_TYPE ); /** Weither or not that object can get serialized * * @var bool */ protected $_allowSerialization = true; /** * Weither or not the database should be reconnected * to that adapter when waking up * * @var bool */ protected $_autoReconnectOnUnserialize = false; /** * Constructor. * * $config is an array of key/value pairs or an instance of Zend_Config * containing configuration options. These options are common to most adapters: * * dbname=> (string) The name of the database to user * username => (string) Connect to the database as this username. * password => (string) Password associated with the username. * host=> (string) What host to connect to, defaults to localhost * * Some options are used on a case-by-case basis by adapters: * * port=> (string) The port of the database * persistent => (boolean) Whether to use a persistent connection or not, defaults to false * protocol => (string) The network protocol, defaults to TCPIP * caseFolding => (int) style of case-alteration used for identifiers * socket=> (string) The socket or named pipe that should be used * * @param array|Zend_Config $config An array or instance of Zend_Config having configuration data * @throws Zend_Db_Adapter_Exception */ public function __construct($config) { /** Verify that adapter parameters are in an array.*/ if (!is_array($config)) {/* * Convert Zend_Config argument to a plain array. */if ($config instanceof Zend_Config) { $config = $config->toArray();} else { /** * @see Zend_Db_Adapter_Exception */ require_once end/Db/Adapter/Exception.php; throw new Zend_Db_Adapter_Exception(Adapter parameters must be in an array or a Zend_Config object);} } $this->_checkRequiredOptions($config); $options = array(Zend_Db::CASE_FOLDING=> $this->_caseFolding,Zend_Db::AUTO_QUOTE_IDENTIFIERS => $this->_autoQuoteIdentifiers,Zend_Db::FETCH_MODE => $this->_fetchMode, ); $driverOptions = array(); /** normalize the config and merge it with the defaults*/ if (array_key_exists(options, $config)) {// can use array_merge() because keys might be integersforeach ((array) $config[options] as $key => $value) { $options[$key] = $value;} } if (array_key_exists(driver_options, $config)) {if (!empty($config[driver_options])) { // can use array_merge() because keys might be integers foreach ((array) $config[driver_options] as $key => $value) {$driverOptions[$key] = $value; }} } if (!isset($config[charset])) {$config[charset] = null; } if (!isset($config[persistent])) {$config[persistent] = false; } $this->_config = array_merge($this->_config, $config); $this->_config[options] = $options; $this->_config[driver_options] = $driverOptions; // obtain the case setting, if there is one if (array_key_exists(Zend_Db::CASE_FOLDING, $options)) {$case = (int) $options[Zend_Db::CASE_FOLDING];switch ($case) { case Zend_Db::CASE_LOWER: case Zend_Db::CASE_UPPER: case Zend_Db::CASE_NATURAL:$this->_caseFolding = $case;break; default:/** @see Zend_Db_Adapter_Exception */require_once end/Db/Adapter/Exception.php;throw new Zend_Db_Adapter_Exception(Case must be one of the following constants: . end_Db::CASE_NATURAL, Zend_Db::CASE_LOWER, Zend_Db::CASE_UPPER);} } if (array_key_exists(Zend_Db::FETCH_MODE, $options)) {if (is_string($options[Zend_Db::FETCH_MODE])) { $constant = end_Db::FETCH_ . strtoupper($options[Zend_Db::FETCH_MODE]); if(defined($constant)) {$options[Zend_Db::FETCH_MODE] = constant($constant); }}$this->setFetchMode((int) $options[Zend_Db::FETCH_MODE]); } // obtain quoting property if there is one if (array_key_exists(Zend_Db::AUTO_QUOTE_IDENTIFIERS, $options)) {$this->_autoQuoteIdentifiers = (bool) $options[Zend_Db::AUTO_QUOTE_IDENTIFIERS]; } // obtain allow serialization property if there is one if (array_key_exists(Zend_Db::ALLOW_SERIALIZATION, $options)) {$this->_allowSerialization = (bool) $options[Zend_Db::ALLOW_SERIALIZATION]; } // obtain auto reconnect on unserialize property if there is one if (array_key_exists(Zend_Db::AUTO_RECONNECT_ON_UNSERIALIZE, $options)) {$this->_autoReconnectOnUnserialize = (bool) $options[Zend_Db::AUTO_RECONNECT_ON_UNSERIALIZE]; } // create a profiler object $profiler = false; if (array_key_exists(Zend_Db::PROFILER, $this->_config)) {$profiler = $this->_config[Zend_Db::PROFILER];unset($this->_config[Zend_Db::PROFILER]); } $this->setProfiler($profiler); } /** * Check for config options that are mandatory. * Throw exceptions if any are missing. * * @param array $config * @throws Zend_Db_Adapter_Exception */ protected function _checkRequiredOptions(array $config) { // we need at least a dbname if (! array_key_exists(dbname, $config)) {/** @see Zend_Db_Adapter_Exception */require_once end/Db/Adapter/Exception.php;throw new Zend_Db_Adapter_Exception("Configuration array must have a key for dbname that names the database instance"); } if (! array_key_exists(password, $config)) {/** * @see Zend_Db_Adapter_Exception */require_once end/Db/Adapter/Exception.php;throw new Zend_Db_Adapter_Exception("Configuration array must have a key for password for login credentials"); } if (! array_key_exists(username, $config)) {/** * @see Zend_Db_Adapter_Exception */require_once end/Db/Adapter/Exception.php;throw new Zend_Db_Adapter_Exception("Configuration array must have a key for username for login credentials"); } } /** * Returns the underlying database connection object or resource. * If not presently connected, this initiates the connection. * * @return object|resource|null */ public function getConnection() { $this->_connect(); return $this->_connection; } /** * Returns the configuration variables in this adapter. * * @return array */ public function getConfig() { return $this->_config; } /** * Set the adapters profiler object. * * The argument may be a boolean, an associative array, an instance of * Zend_Db_Profiler, or an instance of Zend_Config. * * A boolean argument sets the profiler to enabled if true, or disabled if * false. The profiler class is the adapters default profiler class, * Zend_Db_Profiler. * * An instance of Zend_Db_Profiler sets the adapters instance to that * object. The profiler is enabled and disabled separately. * * An associative array argument may contain any of the keys enabled, * class, and instance. The enabled and instance keys correspond to the * boolean and object types documented above. The class key is used to name a * class to use for a custom profiler. The class must be Zend_Db_Profiler or a * subclass. The class is instantiated with no constructor arguments. The class * option is ignored when the instance option is supplied. * * An object of type Zend_Config may contain the properties enabled, class, and * instance, just as if an associative array had been passed instead. * * @param Zend_Db_Profiler|Zend_Config|array|boolean $profiler * @return Zend_Db_Adapter_Abstract Provides a fluent interface * @throws Zend_Db_Profiler_Exception if the object instance or class specified *is not Zend_Db_Profiler or an extension of that class. */ public function setProfiler($profiler) { $enabled= null; $profilerClass = $this->_defaultProfilerClass; $profilerInstance = null; if ($profilerIsObject = is_object($profiler)) {if ($profiler instanceof Zend_Db_Profiler) { $profilerInstance = $profiler;} else if ($profiler instanceof Zend_Config) { $profiler = $profiler->toArray();} else { /** * @see Zend_Db_Profiler_Exception */ require_once end/Db/Profiler/Exception.php; throw new Zend_Db_Profiler_Exception(Profiler argument must be an instance of either Zend_Db_Profiler. or Zend_Config when provided as an object);} } if (is_array($profiler)) {if (isset($profiler[enabled])) { $enabled = (bool) $profiler[enabled];}if (isset($profiler[class])) { $profilerClass = $profiler[class];}if (isset($profiler[instance])) { $profilerInstance = $profiler[instance];} } else if (!$profilerIsObject) {$enabled = (bool) $profiler; } if ($profilerInstance === null) {if (!class_exists($profilerClass)) { require_once end/Loader.php; Zend_Loader::loadClass($profilerClass);}$profilerInstance = new $profilerClass(); } if (!$profilerInstance instanceof Zend_Db_Profiler) {/** @see Zend_Db_Profiler_Exception */require_once end/Db/Profiler/Exception.php;throw new Zend_Db_Profiler_Exception(Class . get_class($profilerInstance) . does not extend . end_Db_Profiler); } if (null !== $enabled) {$profilerInstance->setEnabled($enabled); } $this->_profiler = $profilerInstance; return $this; } /** * Returns the profiler for this adapter. * * @return Zend_Db_Profiler */ public function getProfiler() { return $this->_profiler; } /** * Get the default statement class. * * @return string */ public function getStatementClass() { return $this->_defaultStmtClass; } /** * Set the default statement class. * * @return Zend_Db_Adapter_Abstract Fluent interface */ public function setStatementClass($class) { $this->_defaultStmtClass = $class; return $this; } /** * Prepares and executes an SQL statement with bound data. * * @param mixed $sql The SQL statement with placeholders. * May be a string or Zend_Db_Select. * @param mixed $bind An array of data to bind to the placeholders. * @return Zend_Db_Statement_Interface */ public function query($sql, $bind = array()) { // connect to the database if needed $this->_connect(); // is the $sql a Zend_Db_Select object? if ($sql instanceof Zend_Db_Select) {if (empty($bind)) { $bind = $sql->getBind();}$sql = $sql->assemble(); } // make sure $bind to an array; // don use (array) typecasting because // because $bind may be a Zend_Db_Expr object if (!is_array($bind)) {$bind = array($bind); } // prepare and execute the statement with profiling $stmt = $this->prepare($sql); $stmt->execute($bind); // return the results embedded in the prepared statement object $stmt->setFetchMode($this->_fetchMode); return $stmt; } /** * Leave autocommit mode and begin a transaction. * * @return Zend_Db_Adapter_Abstract */ public function beginTransaction() { $this->_connect(); $q = $this->_profiler->queryStart(egin, Zend_Db_Profiler::TRANSACTION); $this->_beginTransaction(); $this->_profiler->queryEnd($q); return $this; } /** * Commit a transaction and return to autocommit mode. * * @return Zend_Db_Adapter_Abstract */ public function commit() { $this->_connect(); $q = $this->_profiler->queryStart(commit, Zend_Db_Profiler::TRANSACTION); $this->_commit(); $this->_profiler->queryEnd($q); return $this; } /** * Roll back a transaction and return to autocommit mode. * * @return Zend_Db_Adapter_Abstract */ public function rollBack() { $this->_connect(); $q = $this->_profiler->queryStart( ollback, Zend_Db_Profiler::TRANSACTION); $this->_rollBack(); $this->_profiler->queryEnd($q); return $this; } /** * Inserts a table row with specified data. * * @param mixed $table The table to insert data into. * @param array $bind Column-value pairs. * @return int The number of affected rows. * @throws Zend_Db_Adapter_Exception */ public function insert($table, array $bind) { // extract and quote col names from the array keys $cols = array(); $vals = array(); $i = 0; foreach ($bind as $col => $val) {$cols[] = $this->quoteIdentifier($col, true);if ($val instanceof Zend_Db_Expr) { $vals[] = $val->__toString(); unset($bind[$col]);} else { if ($this->supportsParameters(positional)) {$vals[] = ?; } else {if ($this->supportsParameters( amed)) { unset($bind[$col]); $bind[:col.$i] = $val; $vals[] = :col.$i; $i++;} else { /** @see Zend_Db_Adapter_Exception */ require_once end/Db/Adapter/Exception.php; throw new Zend_Db_Adapter_Exception(get_class($this) ." doesn support positional or named binding");} }} } // build the statement $sql = "INSERT INTO " . $this->quoteIdentifier($table, true) . ( . implode(, , $cols) . ) . VALUES ( . implode(, , $vals) . ); // execute the statement and return the number of affected rows if ($this->supportsParameters(positional)) {$bind = array_values($bind); } $stmt = $this->query($sql, $bind); $result = $stmt->rowCount(); return $result; } /** * Updates table rows with specified data based on a WHERE clause. * * @param mixed $table The table to update. * @param array $bind Column-value pairs. * @param mixed $where UPDATE WHERE clause(s). * @return intThe number of affected rows. * @throws Zend_Db_Adapter_Exception */ public function update($table, array $bind, $where = \) { /*** Build "col = ?" pairs for the statement,* except for Zend_Db_Expr which is treated literally.*/ $set = array(); $i = 0; foreach ($bind as $col => $val) {if ($val instanceof Zend_Db_Expr) { $val = $val->__toString(); unset($bind[$col]);} else { if ($this->supportsParameters(positional)) {$val = ?; } else {if ($this->supportsParameters( amed)) { unset($bind[$col]); $bind[:col.$i] = $val; $val = :col.$i; $i++;} else { /** @see Zend_Db_Adapter_Exception */ require_once end/Db/Adapter/Exception.php; throw new Zend_Db_Adapter_Exception(get_class($this) ." doesn support positional or named binding");} }}$set[] = $this->quoteIdentifier($col, true) . = . $val; } $where = $this->_whereExpr($where); /*** Build the UPDATE statement*/ $sql = "UPDATE " . $this->quoteIdentifier($table, true) . SET . implode(, , $set) . (($where) ? " WHERE $where" : \); /*** Execute the statement and return the number of affected rows*/ if ($this->supportsParameters(positional)) {$stmt = $this->query($sql, array_values($bind)); } else {$stmt = $this->query($sql, $bind); } $result = $stmt->rowCount(); return $result; } /** * Deletes table rows based on a WHERE clause. * * @param mixed $table The table to update. * @param mixed $where DELETE WHERE clause(s). * @return intThe number of affected rows. */ public function delete($table, $where = \) { $where = $this->_whereExpr($where); /*** Build the DELETE statement*/ $sql = "DELETE FROM " . $this->quoteIdentifier($table, true) . (($where) ? " WHERE $where" : \); /*** Execute the statement and return the number of affected rows*/ $stmt = $this->query($sql); $result = $stmt->rowCount(); return $result; } /** * Convert an array, string, or Zend_Db_Expr object * into a string to put in a WHERE clause. * * @param mixed $where * @return string */ protected function _whereExpr($where) { if (empty($where)) {return $where; } if (!is_array($where)) {$where = array($where); } foreach ($where as $cond => &$term) {// is $cond an int? (i.e. Not a condition)if (is_int($cond)) { // $term is the full condition if ($term instanceof Zend_Db_Expr) {$term = $term->__toString(); }} else { // $cond is the condition with placeholder, // and $term is quoted into the condition $term = $this->quoteInto($cond, $term);}$term = ( . $term . ); } $where = implode( AND , $where); return $where; } /** * Creates and returns a new Zend_Db_Select object for this adapter. * * @return Zend_Db_Select */ public function select() { return new Zend_Db_Select($this); } /** * Get the fetch mode. * * @return int */ public function getFetchMode() { return $this->_fetchMode; } /** * Fetches all SQL result rows as a sequential array. * Uses the current fetchMode for the adapter. * * @param string|Zend_Db_Select $sql An SQL SELECT statement. * @param mixed $bind Data to bind into SELECT placeholders. * @param mixed $fetchMode Override current fetch mode. * @return array */ public function fetchAll($sql, $bind = array(), $fetchMode = null) { if ($fetchMode === null) {$fetchMode = $this->_fetchMode; } $stmt = $this->query($sql, $bind); $result = $stmt->fetchAll($fetchMode); return $result; } /** * Fetches the first row of the SQL result. * Uses the current fetchMode for the adapter. * * @param string|Zend_Db_Select $sql An SQL SELECT statement. * @param mixed $bind Data to bind into SELECT placeholders. * @param mixed $fetchMode Override current fetch mode. * @return mixed Array, object, or scalar depending on fetch mode. */ public function fetchRow($sql, $bind = array(), $fetchMode = null) { if ($fetchMode === null) {$fetchMode = $this->_fetchMode; } $stmt = $this->query($sql, $bind); $result = $stmt->fetch($fetchMode); return $result; } /** * Fetches all SQL result rows as an associative array. * * The first column is the key, the entire row array is the * value. You should construct the query to be sure that * the first column contains unique values, or else * rows with duplicate values in the first column will * overwrite previous data. * * @param string|Zend_Db_Select $sql An SQL SELECT statement. * @param mixed $bind Data to bind into SELECT placeholders. * @return array */ public function fetchAssoc($sql, $bind = array()) { $stmt = $this->query($sql, $bind); $data = array(); while ($row = $stmt->fetch(Zend_Db::FETCH_ASSOC)) {$tmp = array_values(array_slice($row, 0, 1));$data[$tmp[0]] = $row; } return $data; } /** * Fetches the first column of all SQL result rows as an array. * * @param string|Zend_Db_Select $sql An SQL SELECT statement. * @param mixed $bind Data to bind into SELECT placeholders. * @return array */ public function fetchCol($sql, $bind = array()) { $stmt = $this->query($sql, $bind); $result = $stmt->fetchAll(Zend_Db::FETCH_COLUMN, 0); return $result; } /** * Fetches all SQL result rows as an array of key-value pairs. * * The first column is the key, the second column is the * value. * * @param string|Zend_Db_Select $sql An SQL SELECT statement. * @param mixed $bind Data to bind into SELECT placeholders. * @return array */ public function fetchPairs($sql, $bind = array()) { $stmt = $this->query($sql, $bind); $data = array(); while ($row = $stmt->fetch(Zend_Db::FETCH_NUM)) {$data[$row[0]] = $row[1]; } return $data; } /** * Fetches the first column of the first row of the SQL result. * * @param string|Zend_Db_Select $sql An SQL SELECT statement. * @param mixed $bind Data to bind into SELECT placeholders. * @return string */ public function fetchOne($sql, $bind = array()) { $stmt = $this->query($sql, $bind); $result = $stmt->fetchColumn(0); return $result; } /** * Quote a raw string. * * @param string $value Raw string * @return stringQuoted string */ protected function _quote($value) { if (is_int($value)) {return $value; } elseif (is_float($value)) {return sprintf(\%F, $value); } return "\" . addcslashes($value, "\000\n\r\\\\"\032") . "\"; } /** * Safely quotes a value for an SQL statement. * * If an array is passed as the value, the array values are quoted * and then returned as a comma-separated string. * * @param mixed $value The value to quote. * @param mixed $type OPTIONAL the SQL datatype name, or constant, or null. * @return mixed An SQL-safe quoted value (or string of separated values). */ public function quote($value, $type = null) { $this->_connect(); if ($value instanceof Zend_Db_Select) {return ( . $value->assemble() . ); } if ($value instanceof Zend_Db_Expr) {return $value->__toString(); } if (is_array($value)) {foreach ($value as &$val) { $val = $this->quote($val, $type);}return implode(, , $value); } if ($type !== null && array_key_exists($type = strtoupper($type), $this->_numericDataTypes)) {$quotedValue = ;switch ($this->_numericDataTypes[$type]) { case Zend_Db::INT_TYPE: // 32-bit integer$quotedValue = (string) intval($value);break; case Zend_Db::BIGINT_TYPE: // 64-bit integer// ANSI SQL-style hex literals (e.g. x[\dA-F]+)// are not supported here, because these are string// literals, not numeric literals.if (preg_match(/^( [+-]? # optional sign (?: 0[Xx][\da-fA-F]+ # ODBC-style hexadecimal |\d+ # decimal or octal, or MySQL ZEROFILL decimal (?:[eE][+-]?\d+)? # optional exponent on decimals or octals ) )/x, (string) $value, $matches)) { $quotedValue = $matches[1];}break; case Zend_Db::FLOAT_TYPE: // float or decimal$quotedValue = sprintf(\%F, $value);}return $quotedValue; } return $this->_quote($value); } /** * Quotes a value and places into a piece of text at a placeholder. * * The placeholder is a question-mark; all placeholders will be replaced * with the quoted value. For example: * ** $text = "WHERE date quoteInto($text, $date); * // $safe = "WHERE date < -01-02\" ** * @param string $text The text with a placeholder. * @param mixed $value The value to quote. * @param string $type OPTIONAL SQL datatype * @param integer $count OPTIONAL count of placeholders to replace * @return string An SQL-safe quoted value placed into the original text. */ public function quoteInto($text, $value, $type = null, $count = null) { if ($count === null) {return str_replace(?, $this->quote($value, $type), $text); } else {while ($count > 0) { if (strpos($text, ?) !== false) {$text = substr_replace($text, $this->quote($value, $type), strpos($text, ?), 1); } --$count;}return $text; } } /** * Quotes an identifier. * * Accepts a string representing a qualified indentifier. For Example: ** $adapter->quoteIdentifier(myschema.mytable) ** Returns: "myschema"."mytable" * * Or, an array of one or more identifiers that may form a qualified identifier: ** $adapter->quoteIdentifier(array(myschema,my.table)) ** Returns: "myschema"."my.table" * * The actual quote character surrounding the identifiers may vary depending on * the adapter. * * @param string|array|Zend_Db_Expr $ident The identifier. * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option. * @return string The quoted identifier. */ public function quoteIdentifier($ident, $auto=false) { return $this->_quoteIdentifierAs($ident, null, $auto); } /** * Quote a column identifier and alias. * * @param string|array|Zend_Db_Expr $ident The identifier or expression. * @param string $alias An alias for the column. * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option. * @return string The quoted identifier and alias. */ public function quoteColumnAs($ident, $alias, $auto=false) { return $this->_quoteIdentifierAs($ident, $alias, $auto); } /** * Quote a table identifier and alias. * * @param string|array|Zend_Db_Expr $ident The identifier or expression. * @param string $alias An alias for the table. * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option. * @return string The quoted identifier and alias. */ public function quoteTableAs($ident, $alias = null, $auto = false) { return $this->_quoteIdentifierAs($ident, $alias, $auto); } /** * Quote an identifier and an optional alias. * * @param string|array|Zend_Db_Expr $ident The identifier or expression. * @param string $alias An optional alias. * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option. * @param string $as The string to add between the identifier/expression and the alias. * @return string The quoted identifier and alias. */ protected function _quoteIdentifierAs($ident, $alias = null, $auto = false, $as = AS ) { if ($ident instanceof Zend_Db_Expr) {$quoted = $ident->__toString(); } elseif ($ident instanceof Zend_Db_Select) {$quoted = ( . $ident->assemble() . ); } else {if (is_string($ident)) { $ident = explode(., $ident);}if (is_array($ident)) { $segments = array(); foreach ($ident as $segment) {if ($segment instanceof Zend_Db_Expr) { $segments[] = $segment->__toString();} else { $segments[] = $this->_quoteIdentifier($segment, $auto);} } if ($alias !== null && end($ident) == $alias) {$alias = null; } $quoted = implode(., $segments);} else { $quoted = $this->_quoteIdentifier($ident, $auto);} } if ($alias !== null) {$quoted .= $as . $this->_quoteIdentifier($alias, $auto); } return $quoted; } /** * Quote an identifier. * * @param string $value The identifier or expression. * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option. * @return string The quoted identifier and alias. */ protected function _quoteIdentifier($value, $auto=false) { if ($auto === false || $this->_autoQuoteIdentifiers === true) {$q = $this->getQuoteIdentifierSymbol();return ($q . str_replace("$q", "$q$q", $value) . $q); } return $value; } /** * Returns the symbol the adapter uses for delimited identifiers. * * @return string */ public function getQuoteIdentifierSymbol() { return \"; } /** * Return the most recent value from the specified sequence in the database. * This is supported only on RDBMS brands that support sequences * (e.g. Oracle, PostgreSQL, DB2). Other RDBMS brands return null. * * @param string $sequenceName * @return string */ public function lastSequenceId($sequenceName) { return null; } /** * Generate a new value from the specified sequence in the database, and return it. * This is supported only on RDBMS brands that support sequences * (e.g. Oracle, PostgreSQL, DB2). Other RDBMS brands return null. * * @param string $sequenceName * @return string */ public function nextSequenceId($sequenceName) { return null; } /** * Helper method to change the case of the strings used * when returning result sets in FETCH_ASSOC and FETCH_BOTH * modes. * * This is not intended to be used by application code, * but the method must be public so the Statement class * can invoke it. * * @param string $key * @return string */ public function foldCase($key) { switch ($this->_caseFolding) {case Zend_Db::CASE_LOWER: $value = strtolower((string) $key); break;case Zend_Db::CASE_UPPER: $value = strtoupper((string) $key); break;case Zend_Db::CASE_NATURAL:default: $value = (string) $key; } return $value; } /** * called when object is getting serialized * This disconnects the DB object that cant be serialized * * @throws Zend_Db_Adapter_Exception * @return array */ public function __sleep() { if ($this->_allowSerialization == false) {/** @see Zend_Db_Adapter_Exception */require_once end/Db/Adapter/Exception.php;throw new Zend_Db_Adapter_Exception(get_class($this) ." is not allowed to be serialized"); } $this->_connection = false; return array_keys(array_diff_key(get_object_vars($this), array(\_connection=>false))); } /** * called when object is getting unserialized * * @return void */ public function __wakeup() { if ($this->_autoReconnectOnUnserialize == true) {$this->getConnection(); } } /** * Abstract Methods */ /** * Returns a list of the tables in the database. * * @return array */ abstract public function listTables(); /** * 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 * * @param string $tableName * @param string $schemaName OPTIONAL * @return array */ abstract public function describeTable($tableName, $schemaName = null); /** * Creates a connection to the database. * * @return void */ abstract protected function _connect(); /** * Test if a connection is active * * @return boolean */ abstract public function isConnected(); /** * Force the connection to close. * * @return void */ abstract public function closeConnection(); /** * Prepare a statement and return a PDOStatement-like object. * * @param string|Zend_Db_Select $sql SQL query * @return Zend_Db_Statement|PDOStatement */ abstract public function prepare($sql); /** * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column. * * As a convention, on RDBMS brands that support sequences * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence * from the arguments and returns the last id generated by that sequence. * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method * returns the last value generated for such a column, and the table name * argument is disregarded. * * @param string $tableName OPTIONAL Name of table. * @param string $primaryKey OPTIONAL Name of primary key column. * @return string */ abstract public function lastInsertId($tableName = null, $primaryKey = null); /** * Begin a transaction. */ abstract protected function _beginTransaction(); /** * Commit a transaction. */ abstract protected function _commit(); /** * Roll-back a transaction. */ abstract protected function _rollBack(); /** * Set the fetch mode. * * @param integer $mode * @return void * @throws Zend_Db_Adapter_Exception */ abstract public function setFetchMode($mode); /** * Adds an adapter-specific LIMIT clause to the SELECT statement. * * @param mixed $sql * @param integer $count * @param integer $offset * @return string */ abstract public function limit($sql, $count, $offset = 0); /** * Check if the adapter supports real SQL parameters. * * @param string $type positional or amed * @return bool */ abstract public function supportsParameters($type); /** * Retrieve server version in PHP style * * @return string */ abstract public function getServerVersion();}

到此,我已经晕了。你呢???

哈哈哈。。。

下面看一些简单的案例

插入数据到数据库:

127.0.0.1, username=> oot, password=>\, dbname=> est );$db = Zend_Db::factory(PDO_Mysql,$params);$row = array( username=>Jiqing, password=>jiqing90061234 );$table = user;$res = $db->insert($table,$row);if($res){ echo "成功插入新的记录!"; echo "

"; $last_insert_id = $db->lastInsertId($table); echo "新记录的ID值为:"; echo $last_insert_id; echo "

"; echo "其内容为:"; $sql = "select * from $table where id=$last_insert_id"; $result = $db->fetchRow($sql); echo "

"; foreach($result as $key=>$val){ echo $key; echo "值为:"; echo $val; echo "

"; }}else{ echo "插入数据有误";}

修改update方法

删除delete方法

都大同小异,首先连接数据库,然后填写相应参数,执行即可。

查询方法总结:

fetchAll()匹配查询结果,返回一个连续的数组。

fetchAssoc()匹配查询结果,返回一个联合的数组。

fetchCol()匹配结果的第一列,返回一个数组。

fetchOne()陪陪查询结果的第一列与第一行的值,返回一个字符串。

fetchRow()匹配查询结果的第一行,返回一个数组。

常用的是第一个和最后一个方法,其他的方法用的不是很多。

更多Zend Framework入门教学之Zend_Db数据库操作详解相关文章请关注PHP中文网!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。