Zend Framework数据库操作

xiaoxiao2026-06-12  10

说明: 摘自ZF手册中文版 1.执行查询并返回结果1.1 使用 Zend_Db_Adapter 一旦你得到了一个Zend_Db_Adapter 实例, 你可以直接 执行sql语句进行查询. Zend_Db_Adapter 传送这些sql语 句到底层的PDO对象,由PDO对象组合并执行他们,在有查询结果的情况 下,返回一个PDOStatement对象以便对结果进行处理。

<?php // 创建一个$db对象,然后查询数据库 // 使用完整的sql语句直接进行查询. $sql = $db->quoteInto( 'SELECT * FROM example WHERE date > ?', '2006-01-01' ); $result = $db->query($sql); // 使用PDOStatement对象$result将所有结果数据放到一个数组中 $rows = $result->fetchAll(); ?>

或者使用fetch开头系列方法获得结果集:

对于每一种 fetch系列 的方法来说,你需 要传送一个select的sql语句;假如你在操作语句中使用指定的占位符,你也可以 传送一个绑定数据的数组对你的操作语句进行处理和替换。 Fetch系列 的方法包括:

fetchAll()

fetchAssoc()

fetchCol()

fetchOne()

fetchPairs()

fetchRow()

<?php // 创建一个 $db对象, 然后... // 取回结果集中所有字段的值,作为连续数组返回 $result = $db->fetchAll( "SELECT * FROM round_table WHERE noble_title = :title", array('title' => 'Sir') ); // 取回结果集中所有字段的值,作为关联数组返回 // 第一个字段作为码 $result = $db->fetchAssoc( "SELECT * FROM round_table WHERE noble_title = :title", array('title' => 'Sir') ); // 取回所有结果行的第一个字段名 $result = $db->fetchCol( "SELECT first_name FROM round_table WHERE noble_title = :title", array('title' => 'Sir') ); // 只取回第一个字段值 $result = $db->fetchOne( "SELECT COUNT(*) FROM round_table WHERE noble_title = :title", array('title' => 'Sir') ); // 取回一个相关数组,第一个字段值为码 // 第二个字段为值 $result = $db->fetchPairs( "SELECT first_name, favorite_color FROM round_table WHERE noble_title = :title", array('title' => 'Sir') ); // 只取回结果集的第一行 $result = $db->fetchRow( "SELECT * FROM round_table WHERE first_name = :name", array('name' => 'Lancelot') ); ?>

1.2 使用Zend_Db_Select方法

使用Zend_Db_Select方法是一种不受数据库约束构建select的sql语句的工具 (ares注:用户可以使用该方法生成查询的sql语句,而不需要考虑各种数据 库sql语句的差别)。虽然该方法明显还不完善,但是的确为我们提供一种方 法,帮助我们在不同的后台数据库进行相同的查询工作。除此之外,它还可 以避免sql语句攻击。

创建一个zend_db_select实例最简单的方法就是使用zend_db_adapter::select()方法

 

<? php

//在model中取得连接,并进行相应数据库操作

$this->db = Zend_Registry::get('db');       

$select = $this->db->select(); $select->from('link_info', 'link_info.*')                ->join('link_tag_collect', 'link_info.linkid=link_tag_collect.linkid')                ->where('user_friend.userid=?',$userid)

               ->distinct(link_info.linkid)                ->order('link_tag_collect.addtime DESC')                -2007-12-18>limit(10,0); $sql = $select->__toString();         $result = $this->db->fetchALL($sql);

?>

1.3 使用 Zend_Db_TableZend_Db_Table 是Zend Framework的表模块.它通过zend_db_adapter连接到数据库,为数据库模式检查表对象,并对该表进行操作和查询.

<?php class RoundTable extends Zend_Db_Table {} $table = new RoundTable(); $db = $table->getAdapter(); // SELECT * FROM round_table // WHERE noble_title = "Sir" // ORDER BY first_name // LIMIT 10 OFFSET 20 $where = $db->quoteInto('noble_title = ?', 'Sir'); $order = 'first_name'; $count = 10; $offset = 20; $rowset = $table->fetchAll($where, $order, $count, $offset); ?>

以上都为废话,从ZF手册中皆能得到。

在实际中,我最常使用的是

 

从model中获得数据库连接,然后使用ZEND_DB_SELECT。

在tag.php中

<?php  public function getTopTag(){                 $select = $this->db->select();         $select->from($this->_name, '*')                ->order('TAGTOTAL DESC')                ->limit(10,0);                       $sql = $select->__toString();         $result = $this->db->fetchALL($sql);         return $result;     } ?>

在TagController.php中

<?php class TagController extends Zend_Controller_Action private $tag; function init() { parent::init(); Zend_Loader::loadClass('Tag'); $this->tag = new Tag(); } function topAction(){ $thi->tag->getTopTag(); ... } ?>

 

使用ZEND_DB_TABLE

在Tag.php中

<?php class Tag extends Zend_Db_Table { protected $_name = "TAG_INFO"; protected $_primary = 'TAGID'; } ?> 在TagController.php中 <?php class TagController extends Zend_Controller_Action private $tag; function init() { parent::init(); Zend_Loader::loadClass('Tag'); $this->tag = new Tag(); } function topAction(){ $order = 'TAGTOTAL'; $count = 10; $offset = 0;   $thi->tag->fetchAll( $order, $count, $offset); ... } ?>

最好还是选用方法一,能够将对数据的操作都封装在model中。2.插入数据无论是DB还是Table类,都使用insert()方法。对于Oracle来说,如果要使用sequence作为自增的主键的话,需要使用trigger。比如,有tag表,主键为tagid,其对应的sequence为tag_seq,要插入数据时,需要先新建trigger:create or replace trigger tag_tribefore insert on tagfor each rowdeclarenextid number;beginIF :new.tagid IS NULL or :new.tagid=0 THENselect tag_seq.nextvalinto nextidfrom sys.dual;:new.tagid:=nextid;end if;end tag_tri;其余部分和插入其它数据库相同

<?php $table_name='TAG'; $row = array ( 'TAGNAME' => $tagname, 'TAGTOTAL' => '1' ); $this->db->insert($table_name,$row); ?>

3.更新数据3.1直接执行update语句,参见文档。3.2如果update语句中,有包含数据库的特殊关键字时,需要先将数据选出,然后再更新

<?php $where = $this->db->quoteInto('tagname = ?',$tagname); $rowset = $this->tag->fetchAll($where); $count=$rowset->count(); $tag = $rowset->current(); if($count!=0){ $tagid=$tag->TAGID; //tagtotal+1 $tag->TAGTOTAL ++; //应判断一下当前用户是否 $tag->save(); } ?>

4.删除数据

<?php //删除已有的collect表中记录 // where条件语句 $where = $this->db->quoteInto('USERID = ?', $userid) .$this->db->quoteInto('AND LINKID = ?', $linkid); // 删除数据并得到影响的行数 $rows_affected = $this->collect->delete($where); ?>

tips:注意表名、字段名等的大小写!

相关资源:Zend Framework数据库操作技巧总结
转载请注明原文地址: https://www.6miu.com/read-5050017.html

最新回复(0)