这编文章,主要是做些测试的东西,就是了解Zend中的数据库组件的使用,熟悉流程。
首先复习一下数据库的基础内容,不包含数学问题。
复习的例子大多是出自于书上的。
1. 表
有了一个表,就需要将其映射到一个类中。
这个类简单描叙了银行客户
2. 关联
多对多关联
类的表示
SQL表
多对多关联,是将关系抽取到一个新表中实现的。
一对多关联:
一对多关联中,多方,都有一个外键,连接到一方
一对一关联
限定关联:
这里添加了bank_ID,account_code,且是unique属性,意思是指定的银行通过指定的账户号码,可以找到一个账号。
继承
注意这里添加了account_type ,存储子类的表名,通过这个字段,可以找到对应的子类
上面已经温习了类和数据库的部分关系。
下面是具体到代码,基于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;
上面的插入非常例牌。在使用这样的插入语句的时候,会自动给变量的值加双引号。
下面是结果
查询返回可以用以下的方法来处理:返回结果或者结果集
· 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;
结果如下:
删除语句:
$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;
结果:
除了上面的方法外,还有更加方便更加多功能的组件可以实现对数据库的操作。
就是使用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 = $stmFetch->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);
基础语法到此为止,下一篇将是更加高级的东西,也是最重要的东西,期待自己快点学懂