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

2019-05-02 10:06:45于海丽

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

主要是其中的

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

<?php
/**
 * Zend Framework
 *
 * LICENSE
 *
 * This source file is subject to the new BSD license that is bundled
 * with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://framework.zend.com/license/new-bsd
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@zend.com so we can send you a copy immediately.
 *
 * @category  Zend
 * @package  Zend_Db
 * @subpackage Adapter
 * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
 * @license  http://framework.zend.com/license/new-bsd   New BSD License
 * @version  $Id: Mysql.php 24593 2012-01-05 20:35:02Z matthew $
 */
/**
 * @see Zend_Db_Adapter_Pdo_Abstract
 */
require_once 'Zend/Db/Adapter/Pdo/Abstract.php';
/**
 * Class for connecting to MySQL databases and performing common operations.
 *
 * @category  Zend
 * @package  Zend_Db
 * @subpackage Adapter
 * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
 * @license  http://framework.zend.com/license/new-bsd   New BSD License
 */
class Zend_Db_Adapter_Pdo_Mysql extends Zend_Db_Adapter_Pdo_Abstract
{
  /**
   * PDO type.
   *
   * @var string
   */
  protected $_pdoType = 'mysql';
  /**
   * Keys are UPPERCASE SQL datatypes or the constants
   * Zend_Db::INT_TYPE, Zend_Db::BIGINT_TYPE, or Zend_Db::FLOAT_TYPE.
   *
   * Values are:
   * 0 = 32-bit integer
   * 1 = 64-bit integer
   * 2 = float or decimal
   *
   * @var array Associative array of datatypes to values 0, 1, or 2.
   */
  protected $_numericDataTypes = array(
    Zend_Db::INT_TYPE  => 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;
  }
}

								 
			 
相关文章 大家在看