Zend Framework入门教程之Zend_Db数据库操作详解
| 
                         本文实例讲述了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',$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方法 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; }点评:这个方法就是核心了,代码量不多,但是作用很明确,它会通过你提供的两个参数,自动生成相应的数据库连接类的对象。具有一定的灵活性,机动性。 主要是其中的 这段代码会引入相应的数据库连接类,比如前面的两个例子,就是分别引入了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,false,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+))/',$matches)) {
        $row[$type] = 'decimal';
        $precision = $matches[1];
        $scale = $matches[2];
      } else if (preg_match('/^float((d+),$matches)) {
        $row[$type] = 'float';
        $precision = $matches[1];
        $scale = $matches[2];
      } else if (preg_match('/^((?:big|medium|small|tiny)?int)((d+))/',$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;
  }
}
                         (编辑:莱芜站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!  | 
                  
