Zendframework
php
安装步骤:css
1. 从 Zend Framework 的网页上下载最新版本。解压后,把整个目录拷贝到一个理想的地html
方,假设咱们解压存放在D:/web/ library/Zend.mysql
2. 打开PHP.INI 文件 修改配置文件,以上面的配置为例,php.ini 中应有相似下面的条目:linux
linux 环境下 为 : include_path = ".:/web/library"web
windows环境下为 :include_path = ".;D:\ web \library"sql
查看extension=php_pdo.dll前面是否有‘;’,若是有就把‘;’删除,这个目的是让php数据库
支持pdo扩展 (后期咱们须要使用它来操做数据库)apache
3. 修改apache 中的httpd.conf 配置文件 开启重写模块支持windows
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();
咱们就能够看到执行的结果