>

数据库使用示例,Framework中选择介绍

- 编辑:金沙国际平台登录 -

数据库使用示例,Framework中选择介绍

Gateway/Worker模型 数据库使用示例

From:

1、数据库配置Applications/XXX/Config/Db.php

<?phpnamespace Config;/** * mysql配置 * @author walkor */class Db{    /**     * 数据库的一个实例配置,则使用时像下面这样使用     * $user_array = Db::instance->select(‘name,age‘)->from->where(‘age>12‘)->query();     * 等价于     * $user_array = Db::instance->query(‘SELECT `name`,`age` FROM `users` WHERE `age`>12‘);     * @var array     */    public static $user = array(        ‘host‘    => ‘127.0.0.1‘,        ‘port‘    => 3306,        ‘user‘    => ‘your_user_name‘,        ‘password‘ => ‘your_password‘,        ‘dbname‘  => ‘user‘,        ‘charset‘    => ‘utf8‘,    );}

2、Applications/XXX/Event.php

<?phpuse GatewayWorkerLibGateway;use GatewayWorkerLibDb;/** * 数据库示例,假设有个user库,里面有个user表 */class Event{   /**    * 有消息时触发该方法,根据发来的命令打印2个用户信息    * @param int $client_id 发消息的client_id    * @param string $message 消息    * @return void    */   public static function onMessage($client_id, $message)   {        // 发来的消息        $commend = trim($message);        if($commend !== ‘get_user_list‘)        {            Gateway::sendToClient($client_id, "unknown commendn");            return;        }        // 获取用户列表(这里是临时的一个测试数据库)        $ret = Db::instance(‘user‘)->select(‘*‘)->from(‘users‘)->where(‘uid>3‘)->offset->limit->query();        // 打印结果        return Gateway::sendToClient($client_id, var_export($ret, true));   }}

率先大家先援用些概念:
厂子形式:特地定义多少个类来担任创制别的类的实例,被创制的实例平时都持有其同的父类。工厂情势属于类的始建立模型式,平日依据自变量的不等再次来到不相同类的实例。
厂子格局的真面目是由二个工厂类依据传入的参量,动态控制应该创制出哪二个成品的实例。工厂方式式涉及到工厂剧中人物、抽象产品剧中人物和现实产品剧中人物。
厂子(Creator)剧中人物:是工厂格局的主干,它承担兑现存立全体实例的里边逻。工厂类可以被外边一直调用,创设所需产品对象。
抽象产品(Product)剧中人物:是工厂情势所开创全体指标的父类,它肩负描述全数实例所共有的公家接口。
切实产品(Concrete Product)剧中人物:是工厂格局的创立目的,全部的指标都是充当这几个剧中人物的某部具体类的实例。
ZF中的zend_db正是工厂形式的一个很好的例证。
接下去就起来开展剖析。。。。。。
配置zf的时候,大家能够将数据库的总是操作音信放在Bootstrap.php文件中

数据库类使用的局地演示

复制代码 代码如下:

配置

在Config/Db.php中陈设数据库音讯,假设有七个数据库,能够在Db.php中配置三个实例 譬喻下面配置了多个数据库实例

<?phpnamespace Config;class Db{    // 数据库实例1    public static $db1 = array(        ‘host‘    => ‘127.0.0.1‘,        ‘port‘    => 3306,        ‘user‘    => ‘mysql_user‘,        ‘password‘ => ‘mysql_password‘,        ‘dbname‘  => ‘db1‘,        ‘charset‘    => ‘utf8‘,    );    // 数据库实例2    public static $db2 = array(        ‘host‘    => ‘127.0.0.1‘,        ‘port‘    => 3306,        ‘user‘    => ‘mysql_user‘,        ‘password‘ => ‘mysql_password‘,        ‘dbname‘  => ‘db2‘,        ‘charset‘    => ‘utf8‘,    );}

<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
function __construct($app){
parent::__construct($app);
$url=constant('APPLICATION_PATH').DIRECTORY_SEPARATOR.'configs'.DIRECTORY_SEPARATOR.'config.ini';
$dbconfig=new Zend_Config_Ini($url,null,true);
$db=Zend_Db::factory($dbconfig->general->db->adapter,$dbconfig->general->db->params->toArray());
// var_dump($db);
$db->query('SET NAMES UTF8');
Zend_Db_Table::setDefaultAdapter($db);
}
}
?>

运用办法

use GatewayWorkerLibDb;$db1 = Db::instance(‘db1‘);$db2 = Db::instance(‘db2‘);// 获取所有数据$db1->select(‘ID,Sex‘)->from(‘Persons‘)->where(‘sex= :sex‘)->bindValues(array(‘sex‘=>‘M‘))->query();//等价于$db1->select(‘ID,Sex‘)->from(‘Persons‘)->where("sex= ‘F‘ ")->query();//等价于$db1->query("SELECT ID,Sex FROM `Persons` WHERE sex=‘M’");// 获取一行数据$db1->select(‘ID,Sex‘)->from(‘Persons‘)->where(‘sex= :sex‘)->bindValues(array(‘sex‘=>‘M‘))->row();//等价于$db1->select(‘ID,Sex‘)->from(‘Persons‘)->where("sex= ‘F‘ ")->row();//等价于$db1->row("SELECT ID,Sex FROM `Persons` WHERE sex=‘M’");// 获取一列数据$db1->select(‘ID‘)->from(‘Persons‘)->where(‘sex= :sex‘)->bindValues(array(‘sex‘=>‘M‘))->column();//等价于$db1->select(‘ID‘)->from(‘Persons‘)->where("sex= ‘F‘ ")->column();//等价于$db1->column("SELECT `ID` FROM `Persons` WHERE sex=‘M’");// 获取单个值$db1->select(‘ID,Sex‘)->from(‘Persons‘)->where(‘sex= :sex‘)->bindValues(array(‘sex‘=>‘M‘))->single();//等价于$db1->select(‘ID,Sex‘)->from(‘Persons‘)->where("sex= ‘F‘ ")->single();//等价于$db1->single("SELECT ID,Sex FROM `Persons` WHERE sex=‘M‘");// 复杂查询$db1->select(‘*‘)->from(‘table1‘)->innerJoin(‘table2‘,‘table1.uid = table2.uid‘)->where(‘age > :age‘)->groupBy(array(‘aid‘))->having(‘foo="foo"‘)->orderBy(array(‘did‘))->limit(10)->offset(20)->bindValues(array(‘age‘ => 13));// 等价于$db1->query(SELECT * FROM `table1` INNER JOIN `table2` ON `table1`.`uid` = `table2`.`uid` WHERE age > 13 GROUP BY aid HAVING foo="foo" ORDER BY did LIMIT 10 OFFSET 20“);// 插入$insert_id = $db1->insert(‘Persons‘)->cols(array(‘Firstname‘=>‘abc‘, ‘Lastname‘=>‘efg‘, ‘Sex‘=>‘M‘, ‘Age‘=>13))->query();等价于$insert_id = $db1->query("INSERT INTO `Persons` ( `Firstname`,`Lastname`,`Sex`,`Age`) VALUES ( ‘abc‘, ‘efg‘, ‘M‘, 13)");// 更新$row_count = $db1->update(‘Persons‘)->cols(array(‘sex‘))->where(‘ID=1‘)->bindValue(‘sex‘, ‘F‘)->query();// 等价于$row_count = $db1->update(‘Persons‘)->cols(array(‘sex‘=>‘F‘))->where(‘ID=1‘)->query();// 等价于$row_count = $db1->query("UPDATE `Persons` SET `sex` = ‘F‘ WHERE ID=1");// 删除$row_count = $db1->delete(‘Persons‘)->where(‘ID=9‘)->query();// 等价于$row_count = $db1->query("DELETE FROM `Persons` WHERE ID=9");

在输入文件处,通过三个Zend_Application对象来调用bootstrap(),类Bootstrap的构造函数就能被调用。
在构造函数中,通过Zend_Db::factory()大家就能够博取多少个操作数据库的对象实例。
经过三个Zend_Config_Ini 实例读取config.ini中有关消息作为参数字传送递给工厂函数Zend_Db::factory()
config.ini 的信息
[general]
db.adapter =PDO_MYSQL
db.params.host =localhost
db.params.username =root
db.params.password =
db.params.dbname = 数据库名
Zend_Db::factory()
里头参数一:表示要操作的数据库类型,举个例子PDO_MYSQL
参数二:表示连接数据库的新闻,满含劳动器名,顾客名,密码,要三番五次的数据库

先抛出四个提个难点:
①借使大家要操作的数据库是MSSQL,该怎么操作
②这里我们应用的是Zend_Db::factory(),假设大家运用古板的法子,该怎么操作

解答:
① 我们只需求在config.ini文件旅长PDO_MYSQL修改成PDO_MSSQL即可
② 守旧办法创造一个操作数据库的指标实例:
$db=new Zend_Db_Adapter_Pdo_Mysql($config)
其中:$config信息从config.ini中读取
标题来了:大家应用守旧的方法来创设贰个对象实例的话,大家必将有二个流程来决断当前要操作的数据库类型吧?
比如:

复制代码 代码如下:

switch ($dbType){
case 'PDO_MYSQL':
....
case 'PDO_MSSQL':
....
case 'PDO_SQLITE':
....
}

我们还得依据分裂的数据库类型,写不相同的操作数据库的说话,那样岂不是很费劲
唯独,这一体的全套,zf通过工厂情势都早已帮我们搞好了,使用起来十二分有益

Zf中什么是怎么着贯彻工厂形式的啊?
率先,得有一个华而不实基类:Zend_Db_Adapter_Abstract,该类是工厂格局所创立的保有指标的父类,他承受提供全体实例要所共有的接口。
此类不独有提供了部分大家非常纯熟操作数据库的完成格局,举个例子:select,update,insert,delete,query,fetchRow,fetchAssoc;另外,也提供了有的接口,用以在子类中开展落到实处,比如:limit,getServerVersion,closeConnection,describeTable等等

复制代码 代码如下:

abstract class Zend_Db_Adapter_Abstract
{
//..
}
abstract class Zend_Db_Adapter_Pdo_Abstract extends Zend_Db_Adapter_Abstract
{
//..
}
class Zend_Db_Adapter_Pdo_Mysql extends Zend_Db_Adapter_Pdo_Abstract
{
//...达成针对Mysql数据库的操作
}
class Zend_Db_Adapter_Pdo_Mssql extends Zend_Db_Adapter_Pdo_Abstract
{
//....实现针对Mssql数据库的操作
}
class Zend_Db_Adapter_Pdo_Sqlite extends Zend_Db_Adapter_Pdo_Abstract
{
//....完成针对Sqlite数据库的操作
}

如上关联足以用一张图轻易的代表出来

图片 1
接下去,大家追踪下Zend_Db::Factory()到底是贯彻基于不一致的参数选拔分歧的数据库的。

图片 2

你或者感兴趣的稿子:

  • Zend Framework开采入门非凡教程
  • Zend Framework入门之景况布署及第一个Hello World示例(附demo源码下载)
  • Zend Framework入门知识点小结
  • Zend Framework 2.0事变管理器(The EventManager)入门教程
  • Zend Framework入门教程之Zend_View组件用法示例
  • Zend Framework入门教程之Zend_Registry组件用法详解
  • Zend Framework入门教程之Zend_Config组件用法详解
  • Zend Framework入门教程之Zend_Session会话操作详解
  • Zend Framework入门教程之Zend_Mail用法示例
  • Zend Framework入门教程之Zend_Db数据库操作详解
  • Zend Framework入门应用实例详解

本文由编程发布,转载请注明来源:数据库使用示例,Framework中选择介绍