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_Table
Zend_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();
...
}
?>
在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_tri
before insert on tag
for each row
declare
nextid number;
begin
IF :new.tagid IS NULL or :new.tagid=0 THEN
select tag_seq.nextval
into nextid
from 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);
?>