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

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

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

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

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

连接mysql数据库

代码:

<"htmlcode">
<"htmlcode">
<"htmlcode">
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类中的内容:

<"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('/^(("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类,抽象类

<"$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('/(("htmlcode">
<"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. 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 'Zend/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 'Zend/Loader.php';
        Zend_Loader::loadClass($profilerClass);
      }
      $profilerInstance = new $profilerClass();
    }
    if (!$profilerInstance instanceof Zend_Db_Profiler) {
      /** @see Zend_Db_Profiler_Exception */
      require_once 'Zend/Db/Profiler/Exception.php';
      throw new Zend_Db_Profiler_Exception('Class ' . get_class($profilerInstance) . ' does not extend '
        . 'Zend_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" doesn't 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 int     The 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 = '" doesn't 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 int     The 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"'" . 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 = '0';
      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('/^(
             [+-]"WHERE date < ";
   * $date = "2005-01-02";
   * $safe = $sql->quoteInto($text, $date);
   * // $safe = "WHERE date < '2005-01-02'"
   * </code>
   *
   * @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('"myschema"."mytable"
   *
   * Or, an array of one or more identifiers that may form a qualified identifier:
   * <code>
   * $adapter->quoteIdentifier(array('myschema','my.table'))
   * </code>
   * 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 'Zend/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 'named'
   * @return bool
   */
  abstract public function supportsParameters($type);
  /**
   * Retrieve server version in PHP style
   *
   * @return string
   */
  abstract public function getServerVersion();
}

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

哈哈哈。。。

下面看一些简单的案例

插入数据到数据库:

<"成功插入新的记录!";
  echo "<p>";
  $last_insert_id = $db->lastInsertId($table);
  echo "新记录的ID值为:";
  echo $last_insert_id;
  echo "<p>";
  echo "其内容为:";
  $sql = "select * from $table where id=$last_insert_id";
  $result = $db->fetchRow($sql);
  echo "<p>";
  foreach($result as $key=>$val){
    echo $key;
    echo "值为:";
    echo $val;
    echo "<p>";
  }
}else{
  echo "插入数据有误";
}

结果为:

成功插入新的记录!
新记录的ID值为:13
其内容为:
id值为:13
username值为:Jiqing
password值为:jiqing90061234

修改update方法

删除delete方法

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

查询方法总结:

fetchAll()匹配查询结果,返回一个连续的数组。
fetchAssoc()匹配查询结果,返回一个联合的数组。
fetchCol()匹配结果的第一列,返回一个数组。
fetchOne()陪陪查询结果的第一列与第一行的值,返回一个字符串。
fetchRow()匹配查询结果的第一行,返回一个数组。

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

更多关于zend相关内容感兴趣的读者可查看本站专题:《Zend FrameWork框架入门教程》、《php优秀开发框架总结》、《Yii框架入门及常用技巧总结》、《ThinkPHP入门教程》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家基于Zend Framework框架的PHP程序设计有所帮助。

标签:
Zend,Framework,Zend_Db,数据库操作

免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
狼山资源网 Copyright www.pvsay.com

稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!

昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。

这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。

而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?