2014-01-17 09:46:24 关键词:zendframework和数据库整合 毕业设计 贵阳网站建设

《一步一步跟我学PHP》第63讲:PHP中zend framework和数据库整合

来源: 百优资源网 作者:管理员

核心提示:php常见框架有哪些?MVC核心设计思想是把数据的输入、数据的处理和数据的显示分开。zend  framework怎样和数据库链接。本文在贵阳网站建设多年的实践中,对zend framework进行介绍。
已被点击
查看
收藏
  • 开心网
  • 人人网
  • i贴吧
分享
分享

| 服装连锁店ERP管理系统

服装连锁店ERP管理系统可以高效完成物流配送,考勤管理,工资管理,员工管理,报表管理,陈列管理等功能,是服装连锁企业理想的选择。[详细]

手动刷新 更新时间:14:08:37
---------------------------------------------

---------------------------------------------

《一步一步跟我学PHP》第63讲:PHP中zend framework和数据库整合

描述:php常见框架有哪些?MVC核心设计思想是把数据的输入、数据的处理和数据的显示分开。zend  framework怎样和数据库链接。本文在贵阳网站建设多年的实践中,对zend framework进行介绍。

一、zend framework连接数据库
    zend  framework版用户登录系统(用户登录后,显示消息列表)
    要完成用户登录后显示消息列表的功能,先要进行数据库创建,再进行网站建设。
创建数据库:
SET FOREIGN_KEY_CHECKS=0;
DROP TABLE IF EXISTS `message`;
CREATE TABLE `message` (
  `message_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `sender` varchar(64) NOT NULL,
  `getter` varchar(64) NOT NULL,
  `sendtime` datetime NOT NULL,
  `content` varchar(2000) NOT NULL,
  PRIMARY KEY (`message_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
 添加一些数据备用:
INSERT INTO `message` VALUES ('1', '张三', '李海', '2012-07-19 14:01:33', '你好啊,还在吗?');
INSERT INTO `message` VALUES ('2', '李四', '张国荣', '2012-07-09 14:02:18', '风继续吹');
INSERT INTO `message` VALUES ('3', '回音哥', '郭德纲', '2012-07-26 14:02:39', '我的歌声里');
INSERT INTO `message` VALUES ('4', '李逍遥', '大s', '2012-07-26 14:03:25', '真漂亮');
INSERT INTO `message` VALUES ('5', '张柏芝', '谢霆锋', '2012-07-27 14:04:39', '原谅我吧');
INSERT INTO `message` VALUES ('6', '周立波', '周瑾', '2012-07-30 14:05:13', '你不和我搭档了吗?');
INSERT INTO `message` VALUES ('7', '李云龙', '刘少奇', '2012-07-17 14:07:08', '我是华野的');
INSERT INTO `message` VALUES ('8', '毛总东', '邓小平', '2012-07-25 14:07:40', '全心全意为人民服务');
INSERT INTO `message` VALUES ('9', '邓小平', '江泽民', '2012-07-25 14:08:10', '发展是硬道理');

步骤1:要完成数据的显示,显示使用module功能来实现。
   
在zend framework中,通过zend_Db_Table功能,进行数据库操作,类似于MVC中的sqlhelper。
    添加一个module,名字和表名保持一至,是一个类。通常也可以写成表名module等形式(如messageModule)。申明一个类,切记该类要继承自zend_db_Table类,写上表名和主键名称。说明该类和数据库的哪张表对应,通过message对象实例可以完成对表的crud操作。Message.php的程序设计代码如下:
<?php
Class Message extends Zend_db_Tabel{
Protected $_name=’message’;
Protected $_primary=’message_id’;
}
?>
步骤2:在调用这个类,需要先在indexController.php中引入该类:
Require_once ’../models/message.php’;
在indexAction()跳转之前先到数据库查询一下。
    public function indexAction()
    {
        // action body
  file_put_contents('d:\mylog.txt',__FILE__.date('Y-m-d H:i:s')."indexaction...\r\n",FILE_APPEND);
  $messageModel=new Message();
$res=$messageModel->fetchall();
echo "<pre>";
print_r($res);
echo "</pre>";
  $this->render('index');
    }
步骤3:配置数据库
在\configs\ application.ini中进行数据库配置。
[mysql]
db.adapter=PDO_MYSQL
db.params.host=localhost
db.params.username=root
db.params.password=123456
db.params.dbname=sqdb1
要求apache要启动PDO功能。
此时运行是没有返回的,因为还没有进行数据库适配器初始化。

步骤4:初始化数据库适配器。Bootstrap.php的__construct针对数据库进行action进行初始化工作。
 //初始化我们的数据库适配器
$url=constant("APPLICATION_PATH").DIRECTORY_SEPARATOR.'configs'.DIRECTORY_SEPARATOR.'application.ini';
 $dbconfig=new  Zend_Config_Ini($url,"mysql");
 $db=Zend_Db::factory($dbconfig->db);
 $db->query('SET  NAMES  UTF8');
 Zend_Db_Table::setDefaultAdapter($db);//

也可以把这段代码放在init中比较好。
配置PHP错误日志:Php.ini中,配置error_log=”d:\phperr.log”

    怎样把控制器中获取的数据(array object.int….)分配给视图呢?
$this->view->res=$res;//这样就分配了。
下一个问题就是在视图中显示数据了。
在views\scripts\index\index.phtml中加代码:
<?php foreach ($this->res  as $message){?>
<?=$message['message_id']?>--<?=$message['getter']?>
<?php }?>

    测试后显示的内容如下:
Array
(
    [0] => Array
        (
            [message_id] => 3
            [sender] => bbb
            [getter] => aaa
            [sendtime] => 2014-01-02 18:02:23
            [content] => aaaaabbbbb
        )

    [1] => Array
        (
            [message_id] => 4
            [sender] => ccc
            [getter] => aaa
            [sendtime] => 2014-01-02 18:02:23
            [content] => aaaaaccccc
        )

    [2] => Array
        (
            [message_id] => 5
            [sender] => ccc
            [getter] => aaa
            [sendtime] => 2014-01-02 18:25:49
            [content] => aaaaaccccc
        )

    [3] => Array
        (
            [message_id] => 6
            [sender] => ddd
            [getter] => aaa
            [sendtime] => 2014-01-02 18:26:27
            [content] => aaaaaccccc
        )

二、重写机制  .htaccess
    为何每次访问后,index.php都会被定位?不管发送什么请求(比如404错误),系统都会访问到index.php?这就是.htaccess文件的重写机制在起作用。
    总控index.php每次都被调用,是必经过程。即使输入harry.com/uu,只要保证前面的域名不变化,怎么访问资源都会到总控。
在 .htaccess文件中,代码如下:
RewriteEngine On   启用重写机制
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
    表示可以是除了\n的任意字符。也就是说不管输入什么内容都会被转到index.php文件来。在php项目中,我们通过对url的重写,可以完成整个只有一个入口的项目。

三、设计单入口、多入口的程序

    在php项目中,我们通过对url的重写,可以完成整个只有一个入口的项目。
    在zend studio中新建一个临时的PHP测试项目,名为temptest。
    在其中建一个enter.php,代码为:
<?php
  echo "enter.php";
?>
再建一个aa.php
<?php
  echo "aa.php";
?>
再建一个bb.php
<?php
  echo "bb.php";
?>
    在建一个目录controller,在其中建一个mycontroller.php文件。代码为:
<?php
     echo "我是控制器mycontroller.php";
?>
    为这个项目配置一个虚拟主机temptest.com(过程略)
    配置好虚拟主机后,在IE地址栏输入http://temptest.com/aa.php即显示aa.php。输入http://temptest.com/bb.php即显示bb.php。输入http://temptest.com/controller/mycontroller.php即显示我是控制器mycontroller.php。 也就是说程序的入口是随意的,任何人都可以访问,对项目来说是很危险的。在项目的根目录中创建一个.htaccess文件,内容为:
RewriteEngine On
RewriteRule ^.*$ enter.php
    这样,不管在IE地址栏输入什么内容,都会转到enter.php文件。这就是单一入口。
如果将规则设置为:
RewriteEngine On
RewriteRule ^.*$\.php enter.php
RewriteRule ^.*$\.html enter2.php
    则如果在地址栏输入以php结束的地址时,转到enter.php文件,如果是以html地址结束的,则跳转到enter2.php文件。从而实现多入口。
    注意,该功能的实现需要在apache中启用rewrite重写机制。

    在地址栏输入:http://myzf.com/index/index,框架自己会调用controller/indexController.php.这里应用到一种反射机制。从地址中分析出index,再去找controller/indexController.php.
    如果运行出现错误则调用 ErrorController.php 该控制器来处理,它是处理机制。我们的控制器区分大小写。
    在IndexController.php中添加自己的方法:
public function testAction()
{
    echo "testing";
 exit();
}
    在地址栏输入:http://myzf.com/index/test,可以显示现testing。系统也通过以前的总控流程进行调用。分析日志文件可以发现,当在地址栏输入http://myzf.com/index/index 或者http://myzf.com/index/test,都会进行初始化等过程。
D:\wwwroot\PHP\myenv\Apache2.2\htdocs\MYZF\myzf\public\index.php2014-01-15 20:30:11
D:\wwwroot\PHP\myenv\Apache2.2\htdocs\MYZF\myzf\application\Bootstrap.php2014-01-15 20:30:11Bootstrap...
D:\wwwroot\PHP\myenv\Apache2.2\htdocs\MYZF\myzf\application\controllers\IndexController.php2014-01-15 20:30:11init...
    如果输入的地址有误,即http://myzf.com/index/ss,系统找不到controllers\ssController.php而产生404错误,此时日志文件显示出也是要进行初始化等过程的。
D:\wwwroot\PHP\myenv\Apache2.2\htdocs\MYZF\myzf\public\index.php2014-01-15 20:31:04
D:\wwwroot\PHP\myenv\Apache2.2\htdocs\MYZF\myzf\application\Bootstrap.php2014-01-15 20:31:04Bootstrap...
D:\wwwroot\PHP\myenv\Apache2.2\htdocs\MYZF\myzf\application\controllers\IndexController.php2014-01-15 20:31:04init...
注意:xxAction  的格式  xx不能大写。

四、如何添加控制器、视图、module
  步骤1:先在controllers文件下添加testController.php,必须要继承Zend_Controller_Action。
<?php
class  testController  extends  Zend_Controller_Action{
  public   function  init(){
     }
  public function loginAction(){
    //echo '用户登录';
    $this->render("login");
  }
}
 步骤2:在scripts目录中添加目录test,用来放控制器对应的文件。建一个login.phtml文件,内容为
<h1>登录成功</h1>
 步骤3:将控制器loginAction中添加代码:
  public function loginAction(){
    //echo '用户登录';
    $this->render("login");
  }
    意思是查找到test控制器所对应的login.phtml文件。
步骤3:在IE地址栏输入:http://myzf.com/test/login,则显示登录成功的信息。表示成功。

五、对前面数据库整合代码的优化
    在Bootstrap.php文件中,以前已实现了对数据库初始化工作,但不是很合理,需要做代码的优化。方法是抽象出来一个类(BaseController )。让其它需要的来继承即可。
    BaseController .php程序设计代码:
<?php  //做一个父类,专门供其它的Controller来继承
class  BaseController  extends Zend_Controller_Action{
 public function init()
{
  //初始化我们的数据库适配器
 $url=constant("APPLICATION_PATH").DIRECTORY_SEPARATOR.'configs'.DIRECTORY_SEPARATOR.'application.ini';
 $dbconfig=new  Zend_Config_Ini($url,"mysql");
 $db=Zend_Db::factory($dbconfig->db);
 $db->query('SET  NAMES  UTF8');
 Zend_Db_Table::setDefaultAdapter($db);
}
 }
    在bootstrap.php中删除数据库初始化部分的代码,并在IndexController.php文件中引入文件Require_once 'BaseController.php';将类继承自class IndexController extends BaseController。删除其中的function init()方法。重新运行程序之后即可实现数据库数据的显示。

【推荐阅读】
 软件设计和网站建设策略分析
 第54讲:PHP smarty模板内建函数
 第55讲:PHP smarty模板自定义函数
 第56讲:PHP smarty模板内部留言本的实现
 第57讲:PHP smarty模板中变量操作和变量调节器
 第58讲:PHP smarty模板中内建函数
 第59讲:PHP smarty模板中自定义函数
 第60讲:PHP smarty配置文件、常量、变量
 第61讲:PHP smarty方法、高级特性
 第62讲:PHP中zend framework原理分析
 第63讲:PHP中zend framework和数据库整合
 第64讲:PHP中zend framework实例——投票系统
 第65讲:PHP中zend framework Zend_Db_Table详解

声明:本站内容凡注明"来源:百优资源网"的所有文字、图片等资料,版权均属百优资源网原创,任何媒体、网站或个人不得转载、链接、转贴或以其他方式复制发布/发表。本网站部分资源来源于网络,如果有侵犯你的权利,请联系本站删除。

网友评论
用户名 密码 自动登录 登录
*网友评论仅供其表达个人看法 发表评论
  • 软件设计 196
    使用VC++加载图片技巧

    软件设计 | 使用VC++加载图片技巧

    在界面添加图片,在VB、delphi等软件设计语言中很简单,但是在VC++中是很难实现,这过程不但要对图片进行导入,还要显示,最后要清除内存。下面小编对这个方法进行了整理,直接复制就可以实现使用VC++加载图片技巧了。

    毕业设计 683
    毕业设计论文智能管理系统设计的意义

    毕业设计 | 毕业设计论文智能管理系统设计的意义

    毕业设计(论文)是高等院校人才培养过程中不可或缺的重要环节,一直受到各高等学校的高度重视。毕业论文网上管理是高校信息化的一个重要体现,本文对毕业设计论文智能管理系统设计的意义进行介绍。

    毕业论文 812
    西昊人体工学椅 重新定义“好椅子”的标准

    毕业论文 | 西昊人体工学椅 重新定义“好椅子”的标准

    高端椅业领导者西昊人体工学电脑椅以其极具人性关怀的产品对好椅子的标准进行了重新定义。西昊人体工学椅创办于1999年,一直专注于人体工学椅的研发、制造和销售,最初产品主要销往欧美

860010-1102010400