威尼斯登录首页由他来接替所有的数据库操作,就是了解Zend中的数据库组件的使用
分类:热门新闻

二、抽象数据库接口(利用数据操作管理类)

这编文章,主要是做些测试的东西,就是了解Zend中的数据库组件的使用,熟悉流程。

1 建立数据库表:
复制代码 代码如下:
create database club;
create table member(
id int(11) not null auto_increment,
no varchar(5) not null,
name varchar(10) not null,
age int(2) not null,
level varchar(10) not null,
sex tinyint(1) not null,
date datetime not null,
primary key(id)
)engine=MyISAM default charset=GB2312;
insert into member(id,no,name,age,level,sex,date)values
(1,'A001','wanxia',30,'hj',1,'2008-04-02 00:00:00'),
(2,'C022','liyan',29,'zs',1,'2007-05-31 00:00:00'),
(3,'A006','zhangyan',36,'hj',1,'2007-06-20 00:00:00'),
(4,'B052','luanying',42,'bj',1,'2007-02-12 00:00:00'),
(5,'A007','duxiang',26,'hj',2,'2008-03-26 00:00:00'),
(6,'C060','liuyu',38,'zs',1,'2008-10-16 00:00:00');

在用mvc模式开发的时候,model层负责数据库的所有操作,为了对数据库的操作进行统一的管理,我们需要定义一个数据库操作管理类,由他来接替所有的数据库操作,也就是整个系统中只有这个数据库操作管理类,可以直接对数据库进行操作,如果其他的类需要对数据库进行操作,那它就必须调用和通过这个类来实现。

首先复习一下数据库的基础内容,不包含数学问题。

威尼斯登录首页 1
2 读取数据
2.1 建立01.php
代码
复制代码 代码如下:

下面的Db类就是一个这样的类。

复习的例子大多是出自于书上的。

会员列表

?php/*************************************************************** descript : mysql数据库操作管理类** author : 大龄青年* Email :wenadmin@sina.com*qq : 303015292* msn : wenguangqing@hotmail.com*************************************************************//** example 1: 获取序列* ?* $db = new Db();* $result = $db-getSeq(''art_id'', 2, 1);* ?*//** example 2: 分页查询* ?* $db = new Db();* $result = $db-queryPage(''select id,name from table'', 2, 10, DB_FETCH_ASSOC);* foreach($result as $row)* echo $row[''id''],''------''.$row[''name''].''br'';* ?*//** example 3: 插入数据* ?* $db = new Db();* $result = $db-execute(insert into table (id, name) values(1,''name''));* if($result0) echo ''插入数据成功'';* else echo ''插入数据失败'';* ?

1. 表

$link=mysql_connect("localhost","root","123"); //连接mysql服务器
$db=mysql_select_db("club"); //选择数据库
mysql_query("set names utf8",$link); //设定编码方式
$sql="Select * from member";
$result=mysql_query($sql,$link); //执行select查询
$num=mysql_num_rows($result); //获取记录查询
?>

威尼斯登录首页 2

健身俱乐部 会员名册

点击姓名可查看该会员详细资料,现有会员

人。

if($num>0)
{
?>

序号

姓名

性别

while($row=mysql_fetch_array($result))
{
echo "

".$row['id']."

.$row['name'].">".$row['name']."

"
.($row['sex']==1?"女":"男")."

";
}
?>

}
else
{
echo "俱乐部尚未发展会员。";
}
?>

2.2 建立member.php
复制代码 代码如下:

会员详细资料

$link=mysql_connect("localhost","root","123"); //连接mysql服务器
$db=mysql_select_db("club"); //选择数据库
mysql_query("set names utf8",$link); //设定编码方式
$sql="select no,name,sex,age,level,date_format(date,'%Y-%c-%d') as join_date from member "
."where name='".trim($_GET['name'])."'";
$result=mysql_query($sql,$link); //执行在select查询
?>

有了一个表,就需要将其映射到一个类中。

健身俱乐部 会员详细资料

if($row=mysql_fetch_array($result))
{
echo "编号:".$row['no']."
";
echo "姓名:".$row['name']."
";
echo "性别:".($row['sex']==1?"女":"男")."
";
echo "年龄:".$row['age']."
";
echo "级别:".$row['level']."
";
echo "加入:".$row['join_date']."
";
}
?>

威尼斯登录首页 3威尼斯登录首页 4
3 修改数据
3.1 建立level.php(修改数据)
复制代码 代码如下:

俱乐部优惠活动

威尼斯登录首页 5

俱乐部会员统计表

$link=mysql_connect("localhost","root","123"); //连接mysql服务器
$db=mysql_select_db("club"); //选择数据库
mysql_query("set name utf8",$link); //设定编码方式
$sql="Select level,count(*) as num from member group by level";
$result=mysql_query($sql,$link); //执行select查询
while($row=mysql_fetch_array($result))
{
switch($row['level']){
case 'bj':
echo "等级:白金会员     人数:".$row['num']."
";
break;
case 'hj':
echo "等级:黄金会员     人数:".$row['num']."
";
break;
default:
echo "等级:钻石会员     人数:".$row['num']."
";
}
}
?>

会员优惠升级:从

黄金会员
白金会员

升级至

白金会员
钻石会员

3.2 建立up_level.php
复制代码 代码如下:

俱乐部优惠活动

$link=mysql_connect("localhost","root","123"); //连接mysql服务器
$db=mysql_select_db("club"); //选择数据库
mysql_query("set name utf8",$link); //设定编码方式
$sql="update member set level='".trim($_POST['new_level'])
."' where level='".trim($_POST['old_level'])."'";
$result=mysql_query($sql,$link); //执行select查询
echo mysql_affected_rows($link)."人 从";
switch(trim($_POST['old_level'])){
case 'bj':
echo " 白金会员 " ;
break;
case 'hj':
echo " 黄金会员 ";
break;
default:
echo " 钻石会员 ";
}
echo "成功升级到";
switch(trim($_POST['new_level'])){
case 'bj':
echo " 白金会员 " ;
break;
case 'hj':
echo " 黄金会员 ";
break;
default:
echo " 钻石会员 ";
}
?>

威尼斯登录首页 6

威尼斯登录首页 7 
4 添加数据
4.1 建立add_member.php
复制代码 代码如下:

新增会员

这个类简单描叙了银行客户

新加入会员

编号:

姓名:

性别:

年龄:

级别:

黄金会员
白金会员
钻石会员

4.2 建立newmember.php
复制代码 代码如下:

添加会员

$link=mysql_connect("localhost","root","123"); //连接mysql服务器
$db=mysql_select_db("club"); //选择数据库
mysql_query("set names GB2312",$link); //设定编码方式
$sql="Insert member(no,name,sex,age,level,date) values('"
.trim($_POST['no'])."','".trim($_POST['name'])."','"
.trim($_POST['sex'])."','".trim($_POST['age'])."','"
.trim($_POST['level'])."',now())";
$result=mysql_query($sql,$link); //执行select查询
$m_id=mysql_insert_id($link); //得到新插入会员记录的id
if(trim($_POST['level'])=="hj") //判断新会员优惠
{
$sql="Update member set level='bj' where id='".$m_id."'";
$result=mysql_query($sql,$link); //执行会员升级优惠
$text="已享受优惠升级至白金会员。";
}
$sql="Select *,date_format(date,'%Y-%c-%d') as join_date from member "
."where id='".$m_id."'";
$result=mysql_query($sql,$link); //执行select查询
if($row=mysql_fetch_array($result))
{
echo "新会员资料:
";
echo "编号:".$row['no']."
";
echo "姓名:".$row['name']."
";
echo "性别:".($row['sex']==1?"女":"男"."
");
echo "年龄:".$row['age']."
";
echo "级别:".$row['level']."
";
echo "加入:".$row['join_date']."
";
}
echo "新会员".$row['name']."添加成功".$text;
?>

威尼斯登录首页 8 威尼斯登录首页 9

威尼斯登录首页 10 
5 创建类数据库连接
5.1 建立cls_mysql.php类文件
复制代码 代码如下:

class cls_mysql
{
protected $link_id;
function __construct($dbhost,$dbuser,$dbpw,$dbname='',$charset='GB2312')
{
if(!($this->link_id=mysql_connect($dbhost,$dbuser,$dbpw)))
{
$this->ErrorMsg("Can't pConnect MySQL Server($dbhost)!");
}
mysql_query("SET NAMES ".$charset,$this->link_id);
if($dbname)
{
if(mysql_select_db($dbname,$this->link_id)===false)
{
$this->ErrorMsg("Can't slect MYSQL database($dbname)!");
return false;
}
else
{
return true;
}
}
}
public function select_database($dbname)
{
return mysql_select_db($dbname,$this->link_id);
}
public function fetch_array($query,$result_type=MYSQL_ASSOC)
{
return mysql_fetch_array($query,$result_type);
}
public function query($sql)
{
return mysql_query($sql,$this->link_id);
}
public function affected_rows()
{
return mysql_affected_rows($this->link_id);
}
public function num_rows($query)
{
return mysql_num_rows($query);
}
public function insert_id()
{
return_insert_id($this->link_id);
}
public function selectLimit($sql,$num,$start=0)
{
if($start==0)
{
$sql.=' LIMIT '.$num;
}
else
{
$sql.=' LIMIT '.$start.', '.$num;
}
return $this->query($sql);
}
public function getOne($sql,$limited=false)
{
if($limited=true)
{
$sql=trim($sql.' LIMIT 1');
}
$res=$this->query($sql);
if($res!=false)
{
$row=mysql_fetch_row($res);
return $row[0];
}
else
{
return false;
}
}
public function getAll($sql)
{
$res=$this->query($sql);
if($res!==false)
{
$arr=array();
while($row=mysql_fetch_assoc($res))
{
$arr[]=$row;
}
return $arr;
}
else
{
return false;
}
}
function ErrorMsg($message='',$sql='')
{
if($message)
{
echo " error info:$messagenn";
}
else
{
echo "MySQL server error report:";
print_r($this->error_message);
}
exit;
}
}
?>

5.2 建立test.php
复制代码 代码如下:

include("cls_mysql.php");
?>

Mysql类库测试

$sql="Select * from member";
$db=new cls_mysql('localhost','root','123','club','GB2312');
$result=$db->selectLimit($sql,'3'); //从数据库中返回3个会员资料
if($result)
{
while($row=$db->fetch_array($result))
{
echo "会员编号: " .$row['no'].",姓名:".$row['name']."
";
}
}
?>

威尼斯登录首页 11
6 总结
6.1 mysql_connect():建立与MySQL服务器的连接
6.2 mysql_select_db():选择数据库
6.3 mysql_query():执行数据库查询
6.4 mysql_fetch_array():获取数据库记录
6.5 mysql_num_rows():获取查询得到的记录数
6.6 mysql_affected_rows():最近一次操作影响到的行数
6.7 mysql_insert_id():最近一次插入记录的ID值

2. 关联

多对多关联

类的表示

威尼斯登录首页 12

SQL表

威尼斯登录首页 13

多对多关联,是将关系抽取到一个新表中实现的。

一对多关联:

威尼斯登录首页 14

威尼斯登录首页 15

威尼斯登录首页 16

一对多关联中,多方,都有一个外键,连接到一方

一对一关联

威尼斯登录首页 17

威尼斯登录首页 18

威尼斯登录首页 19

限定关联:

威尼斯登录首页 20

威尼斯登录首页 21

这里添加了bank_ID,account_code,且是unique属性,意思是指定的银行通过指定的账户号码,可以找到一个账号。

继承

威尼斯登录首页 22

威尼斯登录首页 23

注意这里添加了account_type ,存储子类的表名,通过这个字段,可以找到对应的子类

威尼斯登录首页 24

上面已经温习了类和数据库的部分关系。

下面是具体到代码,基于Zend Framework的数据库组件,用到的数据表是上面的。会添加少量数据来测试。

数据库连接:

使用Zend_DB_Adapter ,这个对象的获得是通过工厂方法来获得,这样可以使这个组件支持多种类型的数据库。

这里主要写写MySQL的连接。其他的查看文档

$param = array(

'username'=>'root',

'password'=>'123456',

'dbname'=>'test'

);

$db = Zend_db::factory('MYSQLI',$param);

print_r($db);

这样就可以打印出类相关的信息。证明连接成功了。

查询语句:

先给Customer添加数据。

insert into Customer values(0,'user1',0);

insert into Customer values(1,'user2',0);

查询:

$Sql = "select * from Customer";

$result = $db->query($Sql);

$row = $result->fetchAll();

插入语句:

$id = 3;

$param = array(

'username'=>'root',

'password'=>'123456',

'dbname'=>'test'

);

$db = Zend_db::factory('MYSQLI',$param);

$val = array(

'customer_ID'=>$id,

'cust_name'=>'user'.$id,

'temp_amount'=>12

);

$table = 'Customer';

$rowAffect = $db->insert($table,$val);

echo $rowAffect;

上面的插入非常例牌。在使用这样的插入语句的时候,会自动给变量的值加双引号。

下面是结果

威尼斯登录首页 25

查询返回可以用以下的方法来处理:返回结果或者结果集

· fetchAll()

· fetchAssoc()

· fetchCol()

· fetchOne()

· fetchPairs()

· fetchRow()

分别测试一下。

$param = array(

'username'=>'root',

'password'=>'123456',

'dbname'=>'test'

);

$db = Zend_db::factory('MYSQLI',$param);

$table = 'Customer';

//返回所有行,作为数组

$sql = "select * from Customer";

$result = $db->fetchAll($sql);

print_r($result);

//返回所有行,作为数组,结果与上相同

$result = $db->fetchAssoc($sql);

print_r($result);

//返回所有行的第一个字段,感觉在构造语句时要不选择所有

$result = $db->fetchCol($sql);

print_r($result);

//返回一行,作为数组

$result = $db->fetchOne($sql);

print_r($result);

//返回所有行,第一个字段作为key,第二个字段作为val,是一个数组

$result = $db->fetchPairs($sql);

print_r($result);

//返回一行。

$result = $db->fetchRow($sql);

print_r($result);

更新语句:

$param = array(

'username'=>'root',

'password'=>'123456',

'dbname'=>'test'

);

$db = Zend_db::factory('MYSQLI',$param);

$set = array(

'cust_name'=>'updateusername'

);

/*这里不应该用这样的方式,会不安全

$where = 'customer_ID = 3';

*/

$where = $db->quoteInto('customer_ID=?',3);

$table = 'Customer';

$rowAffect = $db->update($table,$set,$where);

echo $rowAffect;

结果如下:

威尼斯登录首页 26

删除语句:

$param = array(

'username'=>'root',

'password'=>'123456',

'dbname'=>'test'

);

$db = Zend_db::factory('MYSQLI',$param);

$table = 'Customer';

$where = $db->quoteinto('customer_ID=?',3);

$rowAffect = $db->delete($table,$where);

echo $rowAffect;

结果:

威尼斯登录首页 27

除了上面的方法外,还有更加方便更加多功能的组件可以实现对数据库的操作。

就是使用statement组件。

测试的方式与上面相同。由于全部是英文,可能会有些错误。以后要注意修正。

创建statement

$param = array(

'username'=>'root',

'password'=>'123456',

'dbname'=>'test'

);

$db = Zend_db::factory('MYSQLI',$param);

$table = 'Customer';

//使用select,show,desc来返回结果集

$sql1 = "select * from Customer";

$sql2 = "show tables";

$sql3 = "desc Customer";

$stm1 = $db->query($sql1);

$stm2 = $db->query($sql2);

$stm3 = $db->query($sql3);

//使用statement的构造函数,使用了预构造sql语句,statement的执行方法,问号参数

$sql4 = "select * from Customer where customer_ID = ?";

$stm4 = new Zend_Db_Statement_Mysqli($db,$sql4);

$stm4->execute(array('1'));

//使用名字参数,这里运行错误,看来MySQL是不支持这个方法了。

/*

$sqlname = "select * from Customer where customer_ID = :id";

$stmname = new Zend_Db_Statement_Mysqli($db,$sqlname);

$stmname->execute(array(":id"=>'1'));

*/

//一行一行返回所有数据:自动移动到下一行,没有则返回FALSE

//由于上面不断的执行,所以要重新执行

$stmFetch = new Zend_Db_Statement_Mysqli($db,$sql1);

$stmFetch->execute();

while ($row class="underline">= class="underline">$stmFetch class="underline">->fetch()){

echo $row['cust_name'].'<br/>';

}

//返回所有数据,指针移动到最后

$rows = $stmFetch->fetchAll();

for($i=0;$i<count($rows);$i++){

echo $rows['cust_name'];

}

//改变fetch模式

$num = new Zend_Db_Statement_Mysqli($db,$sql1);

$num->execute();

$num->setFetchMode(Zend_Db::FETCH_NUM);

$rows = $num->fetchAll();

print_r($rows);

//返回一行指定的列,通过数字来指定

$column = new Zend_Db_Statement_Mysqli($db,$sql1);

$column->execute();

$rowcol = $column->fetchColumn(1);

echo $rowcol;

//返回一个对象,这个有点不知道用在何处

$obj = new Zend_Db_Statement_Mysqli($db,$sql1);

$obj->execute();

$rowobj = $obj->fetchObject();

print_r($rowobj);

Select 组件:

就是给查询专用的组件,通过db_adapter来得到,执行所有方法都是返回一个字符串,用于组合成查询语句,比我写的查询语句生成,高级多的东西了。以后有机会一定要好好看看他的代码。下面是测试的代码,详细请看帮助文档。

$param = array

(

'username'=>'root',

'password'=>'123456',

'dbname'=>'test'

);

$db = Zend_Db::factory('MySqli',$param);

$select = $db->select();

//随便弄的查询

$select->from('Customer','*')

->where('customer_ID=1');

$rows = $db->query($select);

print_r($rows->fetchAll());

unset($select);

//查询多列数据

$select = $db->select();

$select->from('Customer',array('customer_ID','cust_name'));

$rows = $db->query($select);

$rows = $rows->fetchAll();

print_r($rows);

unset($select);

//多表联合查询,对于其他联合查询,参数一致

$select = $db->select();

//select * from Customer join address on address.customer_ID = customer.Customer_ID

$select->from('Customer','*');

$select->join('address','address.Customer_ID = Customer.Customer_ID');

$rows = $db->query($select);

$rows = $rows->fetchAll();

print_r($rows);

unset($select);

//where语句的and和or

$select = $db->select();

//select * from Customer join address on address.customer_ID = customer.Customer_ID

$select->from('Customer','*');

$select->where('customer_ID=?',1);

$rows = $db->query($select);

$rows = $rows->fetchAll();

print_r($rows);

unset($select);

//Group By 语句

$select = $db->select();

//select * from Customer join address on address.customer_ID = customer.Customer_ID

$select->from('Customer','count(customer_ID)');

$select->group(array('temp_amount'));

$rows = $db->query($select);

$rows = $rows->fetchAll();

print_r($rows);

unset($select);

//Having语句

$select = $db->select();

//select * from Customer join address on address.customer_ID = customer.Customer_ID

$select->from('Customer','count(customer_ID) as id');

$select->group(array('temp_amount'));

$select->having('id=2');

$rows = $db->query($select);

$rows = $rows->fetchAll();

print_r($rows);

unset($select);

//order by语句

$select = $db->select();

//select * from Customer join address on address.customer_ID = customer.Customer_ID

$select->from('Customer','*');

$select->order('customer_ID desc');

$rows = $db->query($select);

$rows = $rows->fetchAll();

print_r($rows);

unset($select);

//limit 语句

$select = $db->select();

//select * from Customer join address on address.customer_ID = customer.Customer_ID

$select->from('Customer','*');

$select->order('customer_ID desc');

$select->limit(1,1);

$rows = $db->query($select);

$rows = $rows->fetchAll();

print_r($rows);

unset($select);

//翻页功能

$select = $db->select();

//select * from Customer join address on address.customer_ID = customer.Customer_ID

$select->from('Customer','*');

$select->order('customer_ID desc');

$select->limitPage(1,1);

$rows = $db->query($select);

$rows = $rows->fetchAll();

print_r($rows);

unset($select);

基础语法到此为止,下一篇将是更加高级的东西,也是最重要的东西,期待自己快点学懂

本文由威尼斯在线注册平台发布于热门新闻,转载请注明出处:威尼斯登录首页由他来接替所有的数据库操作,就是了解Zend中的数据库组件的使用

上一篇:本文的目的在于为新手指明方向 下一篇:没有了
猜你喜欢
热门排行
精彩图文