代码改变世界

Zend Framework 第九节数据库操作学习总结

2012-07-28 17:49  java环境变量  阅读(171)  评论(0编辑  收藏  举报

Zend_Db_Adapter
得到一个实例
$config = array(
   'host'     => '127.0.0.1',
   'username' => 'root',
   'password' => '',
   'dbname'   => 'zf',
   'port'       => '3306',
);
$db = Zend_Db::factory('MYSQLI',$config);
关于Zend_Db
第一大部分:读数据
fetchAll()方法可以接受:
1.select sql语句
2.Zend_Db_Select.对象
实际上以下方法,也是可以接受这两个参数
默认情况下返回的是相关数组,
可以过方法setFetchMode()改变返回
如果setFetchMode(Zend_Db::FETCH_OBJ)返回的是对象数组

fetchPairs()这个比较特别,返回一相关数组。
键为第一列返回的值,值为第二列的值,其它列忽略

age name
10 a
20 b
查询后返回array(10=>'a',20=>'b');

fetchRow()这个方法返回一行,具体返回是相关数组还是什么用setFetchMode()决定
fetchCol()返回第一列
fetchOne()返回第一行,第一列。为一个值不是数组
fetchAssoc()返回相关数组,相当于fetchAll()默认情况下的返回值

第二大部分:写数据
insert()
第一个参数为要插入数据的表
第二个参数为相关数组array("字段"=>"值")
要插入的数据会自动处理,所以如果想不自动处理而是当做mysql表达式
需要在传递时加 Zend_Db_Expr
如:
$row=array(
   'name'=>'curdate()',
   'address' => new Zend_Db_Expr ('curdate()')
)
这样子字段name会插入一个curdate()的字符串,而address插入一个时间值(curdate()的结果)
lastInsertId()
如果表中有自增长的字段,则插入数据后会返回这个值

第三大部分,更新数据
update()
第一个参数,数据表
第二个参数,更新后的值
第三个参数,条件,一个表达式
如:$db->update('test',$row,"name='terry' or address='terry'");
如果第三个参数为数组形式如$where=array("name='terry'","address='terry'");
会把各个值用and 连起来。因此看来还是直接写一个语句方便

第四大部分,删除
delete()
第一个参数,数据表
第二个参数,条件
用法同update()一样

到此关于Zend_Db_Adapter从得到一个对象,到添加,删除,更新,插入数据就结束了
现在工作中常用的也就这些

其它
listTables() 列出当前数据库中的所有表
describeTable()列出一个表的字段情况

Zend_Db_Select
这个也工作中常用的
得到一个对象
$select=$db->select()

$select->from()
from有三个参数
第一个:哪个表
第二个:哪此字段,用*表示所有字段,或把要显示的字段放在一个数组中
SELECT `test`.`name` AS `n`, (age+5) AS `a` FROM `test`有时候注意加()表示这个一个
表达式
第三个: 哪个数据库

$select->join()
第一个参数,要join的表,
第二个参数,连接条件
第三个参数,要jion的表列出哪些字段,若为array()一个也不列,如果为空,列出所有


$select->where()
$select->orwhere()
实际上放到一个把所有条件,不管是or,and放在一个句子里就可
分开做的目录是为了安全提供一个?,然后一个字符串做替换,如
where('price > ?', $minimumPrice);

$select->group()分组
$select->having()分组查询数据的条件

$select->order()
按什么排序列,参加为数组(多个字段)或字符串(一个字段)

$select->limit(a,b)从第了个取a长度个
这里有注意a,b必须为整数,如果写成"a,b",刚只有a起作用,意思从第0条返回a条

$select->distinct()
无参数,去掉重复的值。有时候与groupby返回的结果一样

执行select的查询
$stmt = $db->query($select);

$result = $stmt->fetchAll();
或用
$stmt = $select->query();
$result = $stmt->fetchAll();
如果直接用
$db->fetchAll($select)结果一样


Zend_Db_Table
必须要继承自 Zend_Db_Table_Abstract
表接口,只能操作一个表,前边的Zend_Db,Zend_Db_Select可以操作多个表
可以构造多个表对象,以同时操作多个表
有多种方法,指明表名及数据库名,如
class test extends Zend_Db_Table_Abstract
{
   法一
   protected $_name='test';
   protected $_schema='zf';
   法二
   protected $_name='zf.test';
}

class test extends Zend_Db_Table_Abstract{}
法一
$test=new test(array('name'=>'test','schema'=>'zf'))
法二
$test=new test(array('name'=>'zf.test'))
当然也可以不指定数据库,默认的为Zend_Db中的库

在使用Zend_Db_Table之前,必须指定数据库连接器,用于指到一个活动的数据库连接

有三种方法
第一.在构造中用'db'指明如果$test=new test(array('db'=>$db))
第二;Zend_Db_Table_Abstract::setDefaultAdapter($db);不过这样子只能用一个
固定的数据库连接
第三:
Zend_Registry::set('my_db', $db);
$table = new Bugs(array('db' => 'my_db'));
这样子看了就法一还是比较常用的

插入数据
insert()
更新数据
update{}
....................实际上这些方法是调用了Zend_Db中同样的方法。
只是少了第一个参数,数据表的名子

另一个比Zend_Db多的是find方法,可以按主键查找数据,它返回的数据不是数组,而是
对象rowset

组合主键是用
class BugsProducts extends Zend_Db_Table_Abstract{
protected $_name = 'bugs_products';  
protected $_primary = array('bug_id', 'product_id');
}
$table = new BugsProducts();
// Find a single row with a compound primary key
// Returns a Rowset
$rows = $table->find(1234, 'ABC');
// Find multiple rows with compound primary keys
// Also returns a Rowset
$rows = $table->find(array(1234, 5678), array('ABC', 'DEF'));

zend_Db_Table中的fetchAll方法,也是返回对象rowset
参数
fetchAll($where = null, $order = null, $count = null, $offset = null)

fetchRow返回一个对象row其中的toArray()方法可以将对象转成数组
也可以用createRow()方法,先创建一个row然后指定数据再save
前者相当于update,后者相当于insert
delete用于删除,详情看http://framework.zend.com/manual/en/zend.db.table.row.html



用fecthRow对读的数据可以直接修改,并用save方法保存到数据库

info()返回与表有关的内容,相当于Zend_Db 中的DescribeTable('tablename')