吾爱源码
首页 > 站长学院 > 网络编程 > Zend Framework入门教程之Zend_Db数据库操作详解

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

作者:佚名 来源:吾爱源码 2017-01-11 12:57:18

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

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

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

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

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

连接mysql数据库

代码:

<?php
require_once 'Zend/Db.php';
$params = array('host'=>'127.0.0.1',
  'username'=>'root',
  'password'=>'',
  'dbname'=>'test'
  );
$db = Zend_Db::factory('PDO_Mysql',$params);

点评:

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

代码:

<?php
require_once 'Zend/Db.php';
$params = array('dbname'=>'test.mdb');
$db = Zend_Db::factory('PDO_Sqlite',$params);

点评:

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

下面是查询的代码案例:

<?php
require_once 'Zend/Db.php';
$params = array('host'=>'127.0.0.1',
  'username'=>'root',
  'password'=>'',
  'dbname'=>'test'
  );
$db = Zend_Db::factory('PDO_Mysql',$params);
$sql = $db->quoteInto('SELECT * FROM user WHERE id<?','5');
$result = $db->query($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类中的内容:

<?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 [email protected] 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, $precisio
  • 热门软件
  • 热门标签
返回顶部