侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

数据库  /  管理员 发布于 6年前   280

本文实例讲述了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',  'username'=>'root',  'password'=>'',  'dbname'=>'test'  );$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 '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;}

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

主要是其中的

$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 'Zend/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 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, 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 '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;  }}

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

_config settings.   *   * @return string   */  protected function _dsn()  {    // baseline of DSN parts    $dsn = $this->_config;    // don't 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 '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 {      $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(), $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 'Zend/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't 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 'Zend/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 'Zend/Db/Adapter/Exception.php';        throw new Zend_Db_Adapter_Exception($errorInfo[2]);      }      return $affected;    } catch (PDOException $e) {      /**       * @see Zend_Db_Adapter_Exception       */      require_once 'Zend/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 string      Quoted 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 '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');    }    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 'Zend/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 'named'   * @return bool   */  public function supportsParameters($type)  {    switch ($type) {      case 'positional':      case 'named':      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't support getting attributes      return 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 'Zend/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't use array_merge() because keys might be integers      foreach ((array) $config['options'] as $key => $value) {        $options[$key] = $value;      }    }    if (array_key_exists('driver_options', $config)) {      if (!empty($config['driver_options'])) {        // can't 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 'Zend/Db/Adapter/Exception.php';          throw new Zend_Db_Adapter_Exception('Case must be one of the following constants: '. 'Zend_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 = 'Zend_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 'Zend/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 'Zend/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 'Zend/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 adapter's 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 adapter's default profiler class,   * Zend_Db_Profiler.   *   * An instance of Zend_Db_Profiler sets the adapter's 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. Th

  • 上一条:
    Zend Framework数据库操作方法实例总结
    下一条:
    ZendFramework框架实现连接两个或多个数据库的方法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 分库分表的目的、优缺点及具体实现方式介绍(0个评论)
    • DevDB - 在 VS 代码中直接访问数据库(0个评论)
    • 在ubuntu系统中实现mysql数据存储目录迁移流程步骤(0个评论)
    • 在mysql中使用存储过程批量新增测试数据流程步骤(0个评论)
    • php+mysql数据库批量根据条件快速更新、连表更新sql实现(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2017-06
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-01
    • 2018-05
    • 2018-10
    • 2018-11
    • 2020-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2021-02
    • 2021-04
    • 2021-07
    • 2021-08
    • 2021-11
    • 2021-12
    • 2022-02
    • 2022-03
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-07
    • 2023-08
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-03
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客