栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > PHP

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

PHP 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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',
  '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();
    }
    
    if ($adapter instanceof Zend_Config) {
      if (isset($adapter->params)) {
 $config = $adapter->params->toArray();
      }
      if (isset($adapter->adapter)) {
 $adapter = (string) $adapter->adapter;
      } else {
 $adapter = null;
      }
    }
    
    if (!is_array($config)) {
      
      require_once 'Zend/Db/Exception.php';
      throw new Zend_Db_Exception('Adapter parameters must be in an array or a Zend_Config object');
    }
    
    if (!is_string($adapter) || empty($adapter)) {
      
      require_once 'Zend/Db/Exception.php';
      throw new Zend_Db_Exception('Adapter name must be specified in a string');
    }
    
    $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;
    
    if (!class_exists($adapterName)) {
      require_once 'Zend/Loader.php';
      Zend_Loader::loadClass($adapterName);
    }
    
    $dbAdapter = new $adapterName($config);
    
    if (! $dbAdapter instanceof Zend_Db_Adapter_Abstract) {
      
      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))));

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
  );
  
  protected function _dsn()
  {
    $dsn = parent::_dsn();
    if (isset($this->_config['charset'])) {
      $dsn .= ';charset=' . $this->_config['charset'];
    }
    return $dsn;
  }
  
  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();
  }
  
  public function getQuoteIdentifierSymbol()
  {
    return "`";
  }
  
  public function listTables()
  {
    return $this->fetchCol('SHOW TABLES');
  }
  
  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;
  }
  
   public function limit($sql, $count, $offset = 0)
   {
    $count = intval($count);
    if ($count <= 0) {
      
      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) {
      
      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;
    // 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);
  }
  
  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')) {
      
      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())) {
      
      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) {
      
      require_once 'Zend/Db/Adapter/Exception.php';
      throw new Zend_Db_Adapter_Exception($e->getMessage(), $e->getCode(), $e);
    }
  }
  
  public function isConnected()
  {
    return ((bool) ($this->_connection instanceof PDO));
  }
  
  public function closeConnection()
  {
    $this->_connection = null;
  }
  
  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;
  }
  
  public function lastInsertId($tableName = null, $primaryKey = null)
  {
    $this->_connect();
    return $this->_connection->lastInsertId();
  }
  
  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) {
      
      require_once 'Zend/Db/Statement/Exception.php';
      throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e);
    }
  }
  
  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();
 
 require_once 'Zend/Db/Adapter/Exception.php';
 throw new Zend_Db_Adapter_Exception($errorInfo[2]);
      }
      return $affected;
    } catch (PDOException $e) {
      
      require_once 'Zend/Db/Adapter/Exception.php';
      throw new Zend_Db_Adapter_Exception($e->getMessage(), $e->getCode(), $e);
    }
  }
  
  protected function _quote($value)
  {
    if (is_int($value) || is_float($value)) {
      return $value;
    }
    $this->_connect();
    return $this->_connection->quote($value);
  }
  
  protected function _beginTransaction()
  {
    $this->_connect();
    $this->_connection->beginTransaction();
  }
  
  protected function _commit()
  {
    $this->_connect();
    $this->_connection->commit();
  }
  
  protected function _rollBack() {
    $this->_connect();
    $this->_connection->rollBack();
  }
  
  public function setFetchMode($mode)
  {
    //check for PDO extension
    if (!extension_loaded('pdo')) {
      
      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:
 
 require_once 'Zend/Db/Adapter/Exception.php';
 throw new Zend_Db_Adapter_Exception("Invalid fetch mode '$mode' specified");
 break;
    }
  }
  
  public function supportsParameters($type)
  {
    switch ($type) {
      case 'positional':
      case 'named':
      default:
 return true;
    }
  }
  
  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
  );
  
  protected $_allowSerialization = true;
  
  protected $_autoReconnectOnUnserialize = false;
  
  public function __construct($config)
  {
    
    if (!is_array($config)) {
      
      if ($config instanceof Zend_Config) {
 $config = $config->toArray();
      } else {
 
 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();
    
    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:
   
   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);
  }
  
  protected function _checkRequiredOptions(array $config)
  {
    // we need at least a dbname
    if (! array_key_exists('dbname', $config)) {
      
      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)) {
      
      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)) {
      
      require_once 'Zend/Db/Adapter/Exception.php';
      throw new Zend_Db_Adapter_Exception("Configuration array must have a key for 'username' for login credentials");
    }
  }
  
  public function getConnection()
  {
    $this->_connect();
    return $this->_connection;
  }
  
  public function getConfig()
  {
    return $this->_config;
  }
  
  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 {
 
 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) {
      
      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;
  }
  
  public function getProfiler()
  {
    return $this->_profiler;
  }
  
  public function getStatementClass()
  {
    return $this->_defaultStmtClass;
  }
  
  public function setStatementClass($class)
  {
    $this->_defaultStmtClass = $class;
    return $this;
  }
  
  public function query($sql, $bind = array())
  {
    // connect to the database if needed
    $this->_connect();
    // is the $sql a Zend_Db_Select object?
    if ($sql instanceof Zend_Db_Select) {
      if (empty($bind)) {
 $bind = $sql->getBind();
      }
      $sql = $sql->assemble();
    }
    // make sure $bind to an array;
    // don't use (array) typecasting because
    // because $bind may be a Zend_Db_Expr object
    if (!is_array($bind)) {
      $bind = array($bind);
    }
    // prepare and execute the statement with profiling
    $stmt = $this->prepare($sql);
    $stmt->execute($bind);
    // return the results embedded in the prepared statement object
    $stmt->setFetchMode($this->_fetchMode);
    return $stmt;
  }
  
  public function beginTransaction()
  {
    $this->_connect();
    $q = $this->_profiler->queryStart('begin', Zend_Db_Profiler::TRANSACTION);
    $this->_beginTransaction();
    $this->_profiler->queryEnd($q);
    return $this;
  }
  
  public function commit()
  {
    $this->_connect();
    $q = $this->_profiler->queryStart('commit', Zend_Db_Profiler::TRANSACTION);
    $this->_commit();
    $this->_profiler->queryEnd($q);
    return $this;
  }
  
  public function rollBack()
  {
    $this->_connect();
    $q = $this->_profiler->queryStart('rollback', Zend_Db_Profiler::TRANSACTION);
    $this->_rollBack();
    $this->_profiler->queryEnd($q);
    return $this;
  }
  
  public function insert($table, array $bind)
  {
    // extract and quote col names from the array keys
    $cols = array();
    $vals = array();
    $i = 0;
    foreach ($bind as $col => $val) {
      $cols[] = $this->quoteIdentifier($col, true);
      if ($val instanceof Zend_Db_Expr) {
 $vals[] = $val->__toString();
 unset($bind[$col]);
      } else {
 if ($this->supportsParameters('positional')) {
   $vals[] = '?';
 } else {
   if ($this->supportsParameters('named')) {
     unset($bind[$col]);
     $bind[':col'.$i] = $val;
     $vals[] = ':col'.$i;
     $i++;
   } else {
     
     require_once 'Zend/Db/Adapter/Exception.php';
     throw new Zend_Db_Adapter_Exception(get_class($this) ." 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;
  }
  
  public function update($table, array $bind, $where = '')
  {
    
    $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 = '?';
 } else {
   if ($this->supportsParameters('named')) {
     unset($bind[$col]);
     $bind[':col'.$i] = $val;
     $val = ':col'.$i;
     $i++;
   } else {
     
     require_once 'Zend/Db/Adapter/Exception.php';
     throw new Zend_Db_Adapter_Exception(get_class($this) ." doesn't support positional or named binding");
   }
 }
      }
      $set[] = $this->quoteIdentifier($col, true) . ' = ' . $val;
    }
    $where = $this->_whereExpr($where);
    
    $sql = "UPDATE "
. $this->quoteIdentifier($table, true)
. ' SET ' . implode(', ', $set)
. (($where) ? " WHERe $where" : '');
    
    if ($this->supportsParameters('positional')) {
      $stmt = $this->query($sql, array_values($bind));
    } else {
      $stmt = $this->query($sql, $bind);
    }
    $result = $stmt->rowCount();
    return $result;
  }
  
  public function delete($table, $where = '')
  {
    $where = $this->_whereExpr($where);
    
    $sql = "DELETE FROM "
. $this->quoteIdentifier($table, true)
. (($where) ? " WHERe $where" : '');
    
    $stmt = $this->query($sql);
    $result = $stmt->rowCount();
    return $result;
  }
  
  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? (i.e. Not a condition)
      if (is_int($cond)) {
 // $term is the full condition
 if ($term instanceof Zend_Db_Expr) {
   $term = $term->__toString();
 }
      } else {
 // $cond is the condition with placeholder,
 // and $term is quoted into the condition
 $term = $this->quoteInto($cond, $term);
      }
      $term = '(' . $term . ')';
    }
    $where = implode(' AND ', $where);
    return $where;
  }
  
  public function select()
  {
    return new Zend_Db_Select($this);
  }
  
  public function getFetchMode()
  {
    return $this->_fetchMode;
  }
  
  public function fetchAll($sql, $bind = array(), $fetchMode = null)
  {
    if ($fetchMode === null) {
      $fetchMode = $this->_fetchMode;
    }
    $stmt = $this->query($sql, $bind);
    $result = $stmt->fetchAll($fetchMode);
    return $result;
  }
  
  public function fetchRow($sql, $bind = array(), $fetchMode = null)
  {
    if ($fetchMode === null) {
      $fetchMode = $this->_fetchMode;
    }
    $stmt = $this->query($sql, $bind);
    $result = $stmt->fetch($fetchMode);
    return $result;
  }
  
  public function fetchAssoc($sql, $bind = array())
  {
    $stmt = $this->query($sql, $bind);
    $data = array();
    while ($row = $stmt->fetch(Zend_Db::FETCH_ASSOC)) {
      $tmp = array_values(array_slice($row, 0, 1));
      $data[$tmp[0]] = $row;
    }
    return $data;
  }
  
  public function fetchCol($sql, $bind = array())
  {
    $stmt = $this->query($sql, $bind);
    $result = $stmt->fetchAll(Zend_Db::FETCH_COLUMN, 0);
    return $result;
  }
  
  public function fetchPairs($sql, $bind = array())
  {
    $stmt = $this->query($sql, $bind);
    $data = array();
    while ($row = $stmt->fetch(Zend_Db::FETCH_NUM)) {
      $data[$row[0]] = $row[1];
    }
    return $data;
  }
  
  public function fetchOne($sql, $bind = array())
  {
    $stmt = $this->query($sql, $bind);
    $result = $stmt->fetchColumn(0);
    return $result;
  }
  
  protected function _quote($value)
  {
    if (is_int($value)) {
      return $value;
    } elseif (is_float($value)) {
      return sprintf('%F', $value);
    }
    return "'" . addcslashes($value, "00nr\'"32") . "'";
  }
  
  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('/^(
      [+-]?  # optional sign
      (?:
0[Xx][da-fA-F]+   # ODBC-style hexadecimal
|d+  # decimal or octal, or MySQL ZEROFILL decimal
(?:[eE][+-]?d+)?  # optional exponent on decimals or octals
      )
     )/x',
     (string) $value, $matches)) {
     $quotedValue = $matches[1];
   }
   break;
 case Zend_Db::FLOAT_TYPE: // float or decimal
   $quotedValue = sprintf('%F', $value);
      }
      return $quotedValue;
    }
    return $this->_quote($value);
  }
  
  public function quoteInto($text, $value, $type = null, $count = null)
  {
    if ($count === null) {
      return str_replace('?', $this->quote($value, $type), $text);
    } else {
      while ($count > 0) {
 if (strpos($text, '?') !== false) {
   $text = substr_replace($text, $this->quote($value, $type), strpos($text, '?'), 1);
 }
 --$count;
      }
      return $text;
    }
  }
  
  public function quoteIdentifier($ident, $auto=false)
  {
    return $this->_quoteIdentifierAs($ident, null, $auto);
  }
  
  public function quoteColumnAs($ident, $alias, $auto=false)
  {
    return $this->_quoteIdentifierAs($ident, $alias, $auto);
  }
  
  public function quoteTableAs($ident, $alias = null, $auto = false)
  {
    return $this->_quoteIdentifierAs($ident, $alias, $auto);
  }
  
  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;
  }
  
  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;
  }
  
  public function getQuoteIdentifierSymbol()
  {
    return '"';
  }
  
  public function lastSequenceId($sequenceName)
  {
    return null;
  }
  
  public function nextSequenceId($sequenceName)
  {
    return null;
  }
  
  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;
  }
  
  public function __sleep()
  {
    if ($this->_allowSerialization == false) {
      
      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)));
  }
  
  public function __wakeup()
  {
    if ($this->_autoReconnectOnUnserialize == true) {
      $this->getConnection();
    }
  }
  
  
  abstract public function listTables();
  
  abstract public function describeTable($tableName, $schemaName = null);
  
  abstract protected function _connect();
  
  abstract public function isConnected();
  
  abstract public function closeConnection();
  
  abstract public function prepare($sql);
  
  abstract public function lastInsertId($tableName = null, $primaryKey = null);
  
  abstract protected function _beginTransaction();
  
  abstract protected function _commit();
  
  abstract protected function _rollBack();
  
  abstract public function setFetchMode($mode);
  
  abstract public function limit($sql, $count, $offset = 0);
  
  abstract public function supportsParameters($type);
  
  abstract public function getServerVersion();
}

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

哈哈哈。。。

下面看一些简单的案例

插入数据到数据库:

'127.0.0.1',
  'username'=>'root',
  'password'=>'',
  'dbname'=>'test'
  );
$db = Zend_Db::factory('PDO_Mysql',$params);
$row = array(
  'username'=>'Jiqing',
  'password'=>'jiqing90061234'
  );
$table = 'user';
$res = $db->insert($table,$row);
if($res){
  echo "成功插入新的记录!";
  echo "

"; $last_insert_id = $db->lastInsertId($table); echo "新记录的ID值为:"; echo $last_insert_id; echo "

"; echo "其内容为:"; $sql = "select * from $table where id=$last_insert_id"; $result = $db->fetchRow($sql); echo "

"; foreach($result as $key=>$val){ echo $key; echo "值为:"; echo $val; echo "

"; } }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程序设计有所帮助。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/41878.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号