Zendframework

安装步骤:

1. 从  Zend Framework 的网页上下载最新版本。解压后,把整个目录拷贝到一个理想的地

方,假设我们解压存放在D:/web/ library/Zend.

2. 打开PHP.INI 文件  修改配置文件,以上面的配置为例,php.ini 中应有类似下面的条目:

linux  环境下  为  :  include_path = ".:/web/library"

windows环境下为  :include_path = ".;D:\ web \library"

查看extension=php_pdo.dll前面是否有‘;’,如果有就把‘;’删除,这个目的是让php

支持pdo扩展  (后期我们需要使用它来操作数据库)

3. 修改apache 中的httpd.conf 配置文件  开启重写模块支持

LoadModule rewrite_module modules/mod_rewrite.so

把allowoverride none 修改为  all

<Directory />

Options FollowSymLinks

AllowOverride all

Order deny,allow

Deny from all

</Directory>

4. 新建.htaccess文件  保存在web目录  写上代码

RewriteEngine on

#RewriteRule .* index.php

RewriteRule !\.(js|gif|jpg|png|swf|pdf|css|html|htm|rar|zip)$ index.php [NC,L]

php_flag magic_quotes_gpc off

php_flag register_globals off

5. 到目前为止,zendframework已经配置完毕

现在我们来了解下zendframework 项目的目录结构

认识web目录结构

web

application

config(系统配置文件)

config.ini

controllers(系统控制文件-)

models(模型文件-一些类文件)

views(存放视图文件-模板文件)

scripts

index

helpers

filters

library(存放zend文件)

public (存放公共文件)

index.php

.htaccess

如果是多目录比如有前台后后台,假设前台为default ,后台为admin

那么目录结构可以修改为:

web

application

config(系统配置文件)

config.ini

modules

admin

controllers  (系统控制文件-)

models

views

scripts

default

controllers  (系统控制文件-)

models

views

scripts

models(模型文件-一些类文件)

library(存放zend文件)

public (存放公共文件)

index.php

.htaccess

现在我们来看下如何使用zendframework来工作

1.首先建立一个index.php 引导程序  文件

代码为:

<?php

require_once "Zend/Loader/Autoloader.php"; //载入zend框架

Zend_Loader_Autoloader::getInstance()->setFallbackAutoloader(true); //静态载入自动类文件

$filepath = '.' .PATH_SEPARATOR .'./web/models/'.PATH_SEPARATOR .'./library'.PATH_SEPARATOR .

get_include_path();

set_include_path($filepath);

//视图文件设置

$registry = Zend_Registry::getInstance();

$view = new Zend_View();

$view->setScriptPath('./web/views/scripts/');//设置模板显示路径,

$registry['view'] = $view;//注册View

//设置视图路径  ,如果是多目录

/*

$view->setScriptPath(

array(

'default' =>'./web/modules/default/views/scripts/',

'admin' =>'./web/modules/admin/views/scripts/'

)

);

*/

//配置数据库参数,并连接数据库,如果需要数据库

/*

$config=new Zend_Config_Ini('./web/config/config.ini',null, true);

Zend_Registry::set('config',$config);

$dbAdapter=Zend_Db::factory($config->general->db->adapter,$config->general->db->config

->toArray());

$dbAdapter->query('SET NAMES UTF8');

Zend_Db_Table::setDefaultAdapter($dbAdapter);

Zend_Registry::set('dbAdapter',$dbAdapter);

*/

//设置控制器

$frontController =Zend_Controller_Front::getInstance();

$frontController->addModuleDirectory('./web/controllers ');

$frontController->setBaseUrl('/')//设置基本路径

->setParam('noViewRenderer', true)

->setControllerDirectory('./web/ controllers')

->setParam('useDefaultControllerAlways', true)

->setParam('noErrorHandler', true)

->throwExceptions(true)

->dispatch();

//多目录设置

/*    

$frontController->setControllerDirectory(

array(

'default' => './web/modules/default/controllers',

'admin' => './web/modules/admin/controllers'

)

);      

*/        

?>

2.在目录  application/controllers/  下建立文件  名称为:IndexController.php  动作控制器

默认的动作控制器(Action Controller)

Zend Framework 的默认路由规则是  http://域名/控制器名/动作(方法)名。例如:

http://example.com/user/show 会被解析到名为  User 的控制器以及该控制器中定义的

show 方法。如果该方法没有定义,则默认转到  index  方法。

注意:在代码中,控制器名的后面要加上  Controller,而动作名的后面要加上  Action

代码为:

<?php

//require_once 'Zend/Controller/Action.php';

class IndexController extends Zend_Controller_Action

{

function init()

{

$this->registry = Zend_Registry::getInstance();

$this->view = $this->registry['view'];

$this->view->baseUrl = $this->_request->getBaseUrl();

}

function indexAction()

{

$welcome = "欢迎你进入PHP高级开发系列教程-ZENDFRAMEWORK";

$this->view->welcome = $welcome;

echo $this->view->render('index/index.html');

}

}

?>

3.在application/views/scripts/index  下建立文件,名称为  index.html  的视图(页面)脚本

代码为:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title><?=$this->welcome?></title>

<style>

div{ background-color:#f1f1f1; border:1px solid #CCCCCC; text-align:center; line-height:40px;

width:300px; margin:50px auto;}

</style>

</head>

<body>

<div>

<?=$this->welcome?>

</div>

</body>

</html>

4.建立错误控制文件

默认情况下,Zend Framework 的错误处理插件是被注册的。它需要一个错误控制器来处理

错误。缺省的错误控制处理被假定为  ErrorController 以及其中定义的  errorAction。

编辑  application/controllers/ErrorController.php,输入:

<?php

/** Zend_Controller_Action */

require_once 'Zend/Controller/Action.php';

class ErrorController extends Zend_Controller_Action

{

public function errorAction()

{

}

}

5.下面是对应的视图脚本。编辑  application/views/scripts/error/error.phtml,输入:

<!DOCTYPE htmlPUBLIC "-//W3C//DTD XHTML 1.0

Strict//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html>

<head>  

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>错误</title>

</head>

<body>

<h1>错误</h1>

</body>

</html>

6.运行

好,现在运行网站。在浏览器中键入下面三个地址,得到的结果应该是一样的——就是最最

常见的“Hello, World!“。

http://域名

http://域名/index

http://域名/index/index

如果是这样,那么恭喜你  以上就是zendframework的配置过程

下面我们将要来学习zendframework 数据库连接操作,多目录的操作。

Zendframework--------数据库操作

现在我们回头看下入口文件index.php

里面有段代码我们之前注释掉的

//配置数据库参数,并连接数据库,如果需要数据库

/*

$config=new Zend_Config_Ini('./web/config/config.ini',null, true);

Zend_Registry::set('config',$config);

$dbAdapter=Zend_Db::factory($config->general->db->adapter,$config->general->db->config

->toArray());

$dbAdapter->query('SET NAMES UTF8');

Zend_Db_Table::setDefaultAdapter($dbAdapter);

Zend_Registry::set('dbAdapter',$dbAdapter);

*/

现在我们要把这段代码注释去掉

我们需要在web/config/下建立一个文件  为  config.ini

并在里面写入代码

[general]

db.adapter=PDO_MYSQL

db.config.host =localhost

db.config.username =root

db.config.password= 123456

db.config.dbname=zend

PDO_mysql为数据库操作对象

db.config.host   为数据库主机

db.config.username   为数据库用户名

db.config.password   为数据库密码

db.config.dbname   为需要操作的数据库

数据库文件配置写完,现在来看下数据的操作

我们已经创建了MVC中的V和C,现在我们就开始创建M

在数据库中创建一个表  zend

id 为主键,自动增长

dbAdapter  类型操作数据

在indexController.php    init(方法中增加代码)

//数据库dbAdapter操作

$this->db = $this->registry['dbAdapter'];

同时新增mysqlAction方法

Function mysqlAction(){

}

你可以通过浏览器开始访问这个方法:http://域名/index/mysql

1.CODE:

//添加引号防止数据库***

//第一种是quote() 方法. 该方法会根据数据库adapter为标量加上 合适的引号;

假如你试图对一个数组做quote操作, 它将为数组中 每个元素加上引号,并用","分隔返回

$db = $this->db;

// 为标量加引号

$value = $db->quote('St John"s Wort');

//$value 现在变成了 '"St John\"s Wort"' (注意两边的引号)

echo $value;

2.CODE

// 为数组加引号

$value = $db->quote(array('a', 'b', 'c'));

// $value 现在变成了 '"a", "b", "c"' (","分隔的字符串)

print_r($value);

3.CODE:

//第二种是 quoteInto() 方法. 你提供一个包含问号占 位符的基础字符串 , 然

后在该位置加入带引号的标量或者数组. 该 方法对于随需构建查询sql语句和条件语句是

很有帮助的. 使用 quoteInto处理过的标量和数组返回结果与quote() 方法相同

// 在where语句中为标量加上引号

$where = $db->quoteInto('id = ?', 1);

// $where 现在为 'id = "1"' (注意两边的引号)

Echo $where;

4.CODE:

// 在where语句中为数组加上引号

$where = $db->quoteInto('id IN(?)', array(1, 2, 3));

// $where 现在为 'id IN("1", "2", "3")' (一个逗号分隔的字符串)

Echo $where;

5.CODE:

//直接查询

// 使用完整的sql语句直接进行查询.

$sql = $db->quoteInto(

'SELECT * FROM zend WHERE id > ?',

'1'

);

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

// 使用PDOStatement对象$result将所有结果数据放到一个数组中

$rows = $result->fetchAll();

print_r($rows);

6.CODE:

//你可以将数据自动的绑定到你的查询中。这意味着你在查询中可以设定 多个指定的

占位符,然后传送一个数组数据以代替这些占位符。这些替 换的数据是自动进行加引号处

理的,为防止数据库***提供了更强的安 全性

$result = $db->query(

'SELECT * FROM zend WHERE id > :placeholder',

array('placeholder' => '1')

);

// 使用PDOStatement对象$result将所有结果数据放到一个数组中

$rows = $result->fetchAll();

print_r($rows);

7.CODE:

//你也可以手工设置sql语句和绑定数据到sql语句。这一功能通过 prepare() 方

法得到一个设定好的PDOStatement对象,以便直 接进行数据库操作.

// 这次, 设定一个 PDOStatement 对象进行手工绑定.

$stmt = $db->prepare('SELECT * FROM zend WHERE id > :placeholder');

$stmt->bindValue('placeholder', '3');

$stmt->execute();

// 使用PDOStatement对象$result将所有结果数据放到一个数组中

$rows = $stmt->fetchAll();

print_r($rows);

8:CODE

//插入数据

//可以使用 insert()方法将要插入的数据绑定并创建 一个insert语句(绑定的数

据是自动进行加引号处理以避免数据库***的)

//返回值并 不是 最后插入的数据的id,这样做的原因在于一些表 并没有一个自增

的字段;相反的,这个插入的返回值是改变的数据行数(通常情况为1)。 假如你需要最后插入

的数据id,可以在insert执行后调用 lastInsertId() 方法。

//

// INSERT INTO zend

// (username)

// VALUES ('123123');

//

// 以"列名"=>"数据"的格式格式构造插入数组,插入数据行

$row = array (

'username'  => time(),

);

// 插入数据的数据表

$table = 'zend';

// i插入数据行并返回行数

$rows_affected = $db->insert($table, $row);

$last_insert_id = $db->lastInsertId();

echo $last_insert_id;

9:CODE

//更新数据

//可以使用 update() 方法确定需要update的数据并且创建一个 update语句(确

定的数据是自动加引号处理以避免数据库***的)。

//你可以提供一个可选的where语句说明update的条件(注意:where语句并 不是

一个绑定参数,所以你需要自己数据进行加引号的操作)。

//

// UPDATE zend

// SET username = "zppx"

// WHERE id = "20";

//

// 以"列名"=>"数据"的格式构造更新数组,更新数据行

$set = array (

'username' => 'zppx',

);

// 更新的数据表

$table = 'zend';

// where语句

$where = $db->quoteInto('id = ?', '20');

// 更新表数据,返回更新的行数

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

10:CODE

//删除数据

//可以使用 delete() 方法创建一个delete语句;你 也可以提供一个where语句

以说明数据的删除条件。(注意:where语句并不是一个绑 定参数,所以你需要自己进行数据

加引号处理)。

//

// 需要删除数据的表

// WHERE username = "zppx";

//

// 创建一个 $db对象, 然后...

// 设定需要删除数据的表

$table = 'zend';

// where条件语句

$where = $db->quoteInto('username = ?', 'zppx');

// 删除数据并得到影响的行数

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

11:CODE

//取回查询结果

//可以使用query()方法直接对数据库进行操作,但是通常情况 下,仍然还是需要

选择数据行并返回结果。以fetch开头的一系列的 方法可以实现这个要求。对于每一种 fetch

系列 的方法来说,你需 要传送一个select的sql语句;假如你在操作语句中使用指定的占位

符,你也可以 传送一个绑定数据的数组对你的操作语句进行处理和替换。 Fetch系列 的方法

包括

//fetchAll()

// 取回结果集中所有字段的值,作为连续数组返回

$result = $db->fetchAll(

"SELECT * FROM zend WHERE username = :title",

array('title' => 'zppx')

);

//fetchAssoc()

// 取回结果集中所有字段的值,作为关联数组返回

// 第一个字段作为码

$result = $db->fetchAssoc(

"SELECT * FROM zend WHERE username = :title",

array('title' => 'zppx')

);

//fetchCol()

// 取回所有结果行的第一个字段名

$result = $db->fetchCol(

"SELECT username FROM round_table WHERE username = :title",

array('title' => 'zppx')

);

//fetchOne()

// 只取回第一个字段值

$result = $db->fetchOne(

"SELECT COUNT(*) FROM zend WHERE username = :title",

array('title' => 'zppx')

);

//fetchPairs()

// 取回一个相关数组,第一个字段值为码

// 第二个字段为值

$result = $db->fetchPairs(

"SELECT username, id FROM zend WHERE username = :title",

array('title' => 'zppx')

);

//fetchRow()

// 只取回结果集的第一行

$result = $db->fetchRow(

"SELECT * FROM zend WHERE username = :name",

array('name' => 'zppx')

);

以上都是在控制文件中操作的,现在我们来看下在models中是如何操作数据库的

我们在models中新建一个文件 名称为:Zenduser.php

代码为:

class Zenduser extends Zend_Db_Table

{

protected $_name ="zend"; // 默认表为'class_name'你可以通过这个参数修改

protected $_primary = 'id';//默认主键  为’id’ 你可以通过这个参数修改

function init() {

$this->_db = $this->getAdapter();//获取数据库操作

parent::init();

}

}

注意:类名称和文件名称保持一致

在indexController.php文件中增加一个方法,modelAction

Function modelAction(){

}

你可以通过浏览器开始访问这个方法:http://域名/index/mysql

现在我们来完善这个方法,通过代码来了解

$db = $this->db;

$Zenduser = new Zenduser();

//如果是直接调用models中的类成员,则新加数据 只需要将列名:数据的关联数组作为参数,

调 用insert()方法即可.(zend framework)会自动对数据进行加引号处理, 并返回插入的

最后一行的id值

//插入

// INSERT INTO zend

// (username)

// VALUES ("zppx")

$data = array(

'username' => 'zppx'

);

$id = $Zenduser->insert($data);

echo $id;

//更新数据

//要修改表中的任意行数据,我们可以设定一个列名:数据的关联数组作为参数,调

用update()方法,同是通过一个where条件从句来决定需要改变的行.该方法将会 修改表中数

据并返回被修改的行数.

// UPDATE zend

// SET username = "szzppx"

// WHERE id = "23"

$set = array(

'username' => 'szzppx',

);

$where = $db->quoteInto('id = ?', '23');

$rows_affected = $Zenduser->update($set, $where);

//删除数据

//要删除表中的数据,我们可以调用delete()方法,同时通过一个where条件 分句

来决定需要删除的行.该方法将会返回被删除的行数

//(zend framework)不会对条件分句进行加引号处理,所以你需要使用该表 的

zend_db_adapter对象完成该工作.

// DELETE FROM zend

// WHERE username = "szzppx"

//

$where = $db->quoteInto('username = ?', 'szzppx');

$rows_affected = $Zenduser->delete($where);

//根据主键查找数据

//通过调用find()方法,可以使用主键值轻松地在表中检索数据.假如你只想要查询

某 一条数据,该方法将回返回一个zend_db_table_row对象,而当你想要查询多条记录时 ,

将会返回一个zend_db_table_rowset对象

// SELECT * FROM zend WHERE id = "1"

$row = $Zenduser->find(1);

// SELECT * FROM zend WHERE id IN("1", "2", 3")

$rowset = $Zenduser->find(array(1, 2, 3));

//取回一条记录,不按主键

// SELECT * FROM zend

// WHERE username = "zppx"

// AND sex = "1"

// ORDER BY id desc

$where = $db->quoteInto('username = ?', 'zppx')

. $db->quoteInto('AND sex = ?', '1');

$order = 'id';

$row = $Zenduser->fetchRow($where, $order);

//取回多条记录

//假如需要一次检索多条记录.可以使用fetchAll()方法.和使用fetchRow()方

法类 似,该方法不仅仅可以设定where和order分句,也可以设定limit-count和

limit-offset值来限制返回的结果数.执行该方法后,把选择的结果作为一个

Zend_Db_Table_Rowset对象返回.

//注意,(zend framework) 将不会对where语句进行加引号处理,所以你需要 通

过zend_db_adapter进行数据处理

// SELECT * FROM zend

// WHERE username = "zppx"

// ORDER BY id

// LIMIT 10 OFFSET 20

$where = $db->quoteInto('username = ?', 'zppx');

$order = 'id';

$count = 10;

$offset = 20;

$rowset = $Zenduser->fetchAll($where, $order, $count, $offset);

现在我们来看下如何在models中如何操作数据库代码

在Zenduser.php中增加一个方法

function inserDate(){

//查询

$result = $this->_db->fetchPairs(

"SELECT username, id FROM zend WHERE username = :title",

array('title' => 'zppx')

);

print_r($result);

}

我们继续完善控制文件

增加代码

$Zenduser->inserDate();

我们就可以看到执行的结果