Zendframework登陆注册实例教程

本文详细介绍如何使用Nginx、PHP及Zend Framework搭建Web应用环境,并通过实战案例展示如何创建一个基于MVC架构的简单登录注册系统。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.服务器配置

说明:这个实例的开发系统环境是windows 7,所用服务器是Nginx1.0.5Zendframework框架的版本是1.11.9PHP5.3.6,所用数据库是MySQL 5.1.50

首先从配置Nginx开始,在这里面需要开启URLrewrite

这个是我的nginx.conf文件中配置虚拟主机部分

文件:D:\nginx\nginx-1.0.5\conf\nginx.conf

location ~ \.php$ {

            root           html;

            fastcgi_pass   127.0.0.1:9000;

 

             #如果是一个文件夹,访问规则301

             if (-d $request_filename){

                 rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;

             }

 

             #如果没有改文件访问默认文件

             if (!-e $request_filename) {

                    rewrite ^/(.*)$ /myproject/index.php last;

         }

 

             #自动在访问URL后面加"/"

             if (-d $request_filename){

                   rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;

             }

 

            fastcgi_index  index.php;

            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

             fastcgi_param PATH_INFO $fastcgi_script_name;

           

             include        fastcgi_params;

二.建立项目

然后在你的Nginxhtml目录下建立如下文件

myproject/

/application

/controllers

/models

/views

/filters

/helpers

/scripts

              /blog

                       /login.html

                      /register.html

                      article.html

 

/library

/public

/images

/scripts

/styles

 

Zend Framework 的控制器,Zend_Controller,被设计支持使用clean urls 的网站。为实现这个目的,所有的请求需要通过单一的index.php 文件,这就是所知的启动文件(bootstrapper)。这给我们提供了程序中所有页面的中心点并确保运行环境配置正确。我们

.htaccess 文件来实现这个目的,.htaccess myproject 的根目录中,内容如下:

文件:myproject/.htaccess

 

RewriteEngine on

RewriteCond %{SCRIPT_FILENAME} !-f

RewriteCond %{SCRIPT_FILENAME} !-d

RewriteRule ^(.*)$ index.php/$1

RewriteRule 非常简单并可以翻译为“对任何url, 重定向到index.php”。

然而,对于图像,JavaScript CSS 文件的请求不应该重定向到启动文件,把这些文件放到public 目录下myproject/public 下:

文件:myproject/public/.htaccess

RewriteEngine off

虽然我们当前的rewrite rules 不需要太严格,但我们还是在application library 目录下添加一些.htaccess 文件用来保护我们的程序:

文件:myproject/application/.htaccess

deny from all

文件:myproject/library/.htaccess

deny from all

三.网站

启动文件

接下来我们开始正式开始这个项目,首先是启动文件,也就是放在myproject根目录下的index.php它是个跳转的文件,在里面告诉请求执行那些操作。

文件myproject/index.php

<?php

 error_reporting(E_ALL|E_STRICT); //在开启错误报告

 date_default_timezone_set('Asia/Shanghai'); //配置地区 
 set_include_path('.' .PATH_SEPARATOR .'./library'
  .PATH_SEPARATOR .'./application/models/'
  . PATH_SEPARATOR . './application/controllers/' 
       . PATH_SEPARATOR . './application/views/' 
  .PATH_SEPARATOR . get_include_path());  //配置环境路径

 // require_once 'Zend/Loader.php';
 // Zend_Loader::registerAutoload();//设置Zend Framework 自动载入类文件

 require_once "Zend/Loader/Autoloader.php";  //载入zend框架
 Zend_Loader_Autoloader::getInstance()->setFallbackAutoloader(true); //静态载入自动类文件
 $registry = Zend_Registry::getInstance(); //静态获得实例
 $view = new Zend_View(); //实例化zend 模板
 $view->setScriptPath('./application/views/scripts/');//设置模板显示路径
 $registry['view'] = $view;//注册View

 
 //配置数据库参数,并连接数据库 
 $config=new Zend_Config_Ini('./application/configs/config.ini',null, true);
 Zend_Registry::set('config',$config);//注册
 $dbAdapter=Zend_Db::factory($config->general->db->adapter,$config->general->db->config->toArray());//创建zend_db_adapter对象
 $dbAdapter->query('SET NAMES UTF8');//调用adapter的query方法,设置数据库获取的数据与浏览器同步
 Zend_Db_Table::setDefaultAdapter($dbAdapter);//设置默认的适配器
 Zend_Registry::set('dbAdapter',$dbAdapter);
  
 
 //设置控制器
 $frontController =Zend_Controller_Front::getInstance();
 $frontController->setBaseUrl('/zendframe')//设置基本路径
     ->setParam('noViewRenderer', true)
     ->setControllerDirectory('./application/controllers')
     ->throwExceptions(true)
     ->dispatch();    //run
     
?>

 

注意我们没有在文件的结尾放?>,因为它不是必须的并且有个好处是:我们可以防止当多余的whitespace 发生在?>后面出现难以调试的错误。

 

创建模型(M)

做这个例子需要建立一个用户信息的数据库,之后在mysql里建立一个数据库,里面需要有如下数据,一个数据表login里面含有三个字段id,username,password

然后我们在models里面建立自己的模型:

文件:myproject/application/models/login.php

 

<?php
 //这里定义的类名最好和数据库的表明一致,控制器类调用该类时才不会报错
 class Login extends Zend_Db_Table{
  protected $_name = 'login';
  protected $_primary = 'id';
  protected $_username;
  protected $_password;
  protected $_id;
 
  public function checkUnique($username){
   $query = $this->_db->select()->from('login')->where('username = ?',$username);
   $result = $this->getAdapter()->fetchOne($query);
   if($result){
    return true;
   }else{
    return false;
   }
  }
 }
?>
 

连接数据库需要有配置文件,Zend Framework 提供了一个Zend_Config 来提供灵活的面向对象访问配置文件。此刻,配置

文件可以是一个PHP 数组,一个INI 文件或者XML 文件。我们将使用INI 文件:

文件:myproject/application/config.ini

[general]
db.adapter = PDO_MYSQL
db.config.host = localhost
db.config.username = root
db.config.password =
db.config.dbname = zend

创建models文件

1、Blog.php

<?php
class Blog extends Zend_Db_Table{
 protected $_name = 'blog'; //定义表
 protected $_primary = 'id'; //定义表的主键
}

2、login.php

<?php
 //这里定义的类名最好和数据库的表明一致,控制器类调用该类时才不会报错
 class Login extends Zend_Db_Table{
  protected $_name = 'login';
  protected $_primary = 'id';
  protected $_username;
  protected $_password;
  protected $_id;
 
  public function checkUnique($username){
   $query = $this->_db->select()->from('login')->where('username = ?',$username);
   $result = $this->getAdapter()->fetchOne($query);
   if($result){
    return true;
   }else{
    return false;
   }
  }
 }
?>

 

创建试图文件(V)

使用Zend studio创建视图文件可以在Zend studio里面右键项目—newàotherà会弹出下面页面,建立视图文件。

 

有了控制器可以开始写我们的视图文件了,基于MVC模式写的Zendframework的视图文件扩展名是.phtml,,这边也可以直接建立html具体的代码里面注意下url就行

文件:myproject\application\views\scripts\blog\login.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="GENERATOR" content="Zend Studio" />
<meta http-equiv="Content-Language" content="en">
<link rel="stylesheet" type="text/css" href="<?php echo $this->baseUrl;?>/Public/css.css" />
<title><?php echo $this->escape($this->title);?></title>
</head>
<body>
<? echo $this->title;?>
<div id="bodyDiv" align="center"> 
 <div id="loginTable">
  <form action="<?php echo $this->baseUrl;?>/blog/checklogin" name="form" method="post">   
   <table>
   <tr>CRM系统登陆</tr>
   <tr><td>账号:</td><td><input type="text" name="username" id="username"></td></tr> 
   <tr><td>密码:</td><td><input type="password" name="password" id="password"></td></tr> 
   <tr><td></td><td><input type="submit" name="submit" id="submit"  onclick="_validate();" value="登录"></td></tr>
   </table>
  </form>
  <a href="<?php echo $this->baseUrl;?>/blog/register">点此注册</a>  
 </div>
 <div id="test">
  <div>测试数据库连接的正确与否片段</div>
  <div>
  <? foreach($this->login as $login):?>
   username:<?php echo $this->escape($login->username); ?>
   password:<?php echo $login['password']?>
  <? endforeach;?>
  </div>
 </div> 
</div>
</body>
<script>
//验证表单是否为空
function _validate(){
 if(document.getElementById('username').value==""){
  alert("请输入账户名");
  return false;
 }else{
  if(document.getElementById('password').value==""){
   alert("请输入密码");
   return false;
  }
 }
}
</script>
</html>
 

其中考虑到代码的公共部分可以重复使用,可以提取header.html和footer.html在视图里加了头部和脚部的文件。

文件:myproject/application/views/scripts/header.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" xml:lang="en" lang="en">

<head>

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

Page 9 of 18

<title><?php echo $this->escape($this->title); ?></title>

</head>

<body>

<div id="content">

 

文件:myproject/application/views/scripts/footer.html

</div>

</body>

</html>

设置控制器(C)

 

Zend studio里面右键项目—newàotherà会弹出下面页面,建立控制器。

 

 

 

假如我们把这个网站的首页设为登录界面,则在设置的默认控制器为

文件:myproject/application/controllers/IndexController.php

<?php
class BlogController extends Zend_Controller_Action{
 function init(){
  $this->initView();
  $this->view->baseUrl = $this->_request->getBaseUrl();//注意变量的大小写与html中调用的变量是一致的
  Zend_Loader::loadclass('Blog');
 }
 
 function indexAction(){
  $this->_forward('login'); //定义首页直接跳转到登陆页面login.html
 }
 
 function loginAction(){
  $this->view->title = '登陆界面';  
  $login = new Login();
  $this->view->login = $login->fetchAll();
  echo $this->view->render('blog/login.html');//注意要加echo,否则输不出结果  
 } 
 
 function checkloginAction(){
  $username = trim($this->_request->getPost('username'));
  $password = trim($this->_request->getPost('password'));
  echo 'username'.$username;
  echo 'password'.$password;
  if($username!=null&&$password!=null){
   $login = new Login();   
   $db = $login->getAdapter();   
   $where = $db->quoteInto('username=?',$username)
     .$db->quoteInto('And password=?',$password); 
   $result = $login->fetchRow($where);
   if($result){
    $this->_redirect('blog/article');
   }else{
   echo "您输入的信息有误";
    $this->_forward('login');
    //$this->_redirect('blog/login');
   }
  }else{
   echo "登陆失败";
   $this->_forward('login');
   //$this->_redirect('blog/login');
  }  
 }
        
    function articleAction(){
        
    }
   
    function registerAction(){
        $this->view->title = "register";
        if(strtolower($_SERVER['REQUEST_METHOD'])=='post'){
         $username = $this->_request->getParam('username');
         $password = $this->_request->getParam('password');
         $login = new Login();
         //$db = $login->getAdapter(); 
         if($username!=null&&$password!=null){
          if($login->checkUnique($username)){
           echo "该账号已经存在";
           $this->_forward('register');
          }else{
           $data = array(
            'username'=>$username,
            'password'=>$password,
           );
           $result = $login->insert($data);
           if($result){
            echo "恭喜您,注册成功";
            $this->_redirect('blog/login');
           }else{
            echo "出错啦,重新注册下咯";
            $this->_redirect('blog/register');
           }
          }     
         }else{
          echo "请填写完成信息";
          //$this->_redirect('blog/register');
          $this->_forward('register');
         } 
        }else{
          echo  $this->view->render('blog/register.html');
        }
     }
        
 function logoutAction() {
        // 处理注销
  $storage = new Zend_Auth_Storage_Session ();
        $storage->clear ();
        $this->_redirect ( '/index/index' );
    }
   
    function successAction() {

        // 注册成功

    }
 
}

好了,现在在浏览器里输入你的URL就可以看到如下界面了,如果想要测试数据库连接可以把上面代码中的<div style="display:none;">style去掉。

URL: http://localhost/myproject/blog

 

 

接下来我们来处理登录表单发送的POST请求,在action里面写了它的controlleraction的名字在上面的代码中我们已经给出了,然后是逻辑判断之后我们会增加登录成功的页面和出错的页面:

文件:myproject\application\views\scripts\blog\register.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="GENERATOR" content="Zend Studio" />
<meta http-equiv="Content-Language" content="en">
<link rel="stylesheet" type="text/css" href="<?php echo $this->baseUrl;?>/Public/css.css" />
<title><?php echo $this->escape($this->title);?></title>
</head>
<body>
<? echo $this->title;?>
<div id="bodyDiv" align="center"> 
 <div id="loginTable">
  <!--<form action="<?php echo $this->baseUrl;?>/Blog/article" method="post" onsubmit="_validate();">-->
   <form action="<?php echo $this->baseUrl;?>/blog/register" method="post" onsubmit="_validate();">
   <table>
   <tr>CRM系统注册</tr>
   <tr><td>账号:</td><td><input type="text" name="username" id="username"></td></tr> 
   <tr><td>密码:</td><td><input type="password" name="password" id="password"></td></tr> 
   <tr><td></td><td><input type="submit" name="submit" id="submit" value="注册"></td></tr>
   </table>
  </form>
  <a href="<?php echo $this->baseUrl;?>/blog/login">返回</a>  
 </div> 
</div>
</body>
<script>
//验证表单是否为空
function _validate(){
 if(document.getElementById('username').value==""){
  alert("请输入账户名");
  document.getElementById('username').focus();
  return false;
 }else{
  if(document.getElementById('password').value==""){
   alert("请输入密码");
   document.getElementById('password').focus();
   return false;
  }
 }
}
</script>
</html>

以及一些CSS的文件:

注册文件:myproject /public/styles/site.css

body,html {

font-size:100%;

margin: 0;

font-family: Verdana,Arial,Helvetica,sans-serif;

color: #000;

background-color: #fff;

}

h1 {

font-size:1.4em;

color: #800000;

background-color: transparent;

}

#content {

width: 770px;

margin: 0 auto;

}

label {

width: 100px;

display: block;

float: left;

}

#formbutton {

margin-left: 100px;

}

a {

color: #800000;

}

 

有了登录的例子我们可以继续写注册了其实原理都一样,只不过使用的SQL语句有差别而已,我们还是先建立控制器controller和视图view文件吧.

 

在创建模型文件的时候可能会有checkUnique()函数有所困惑,现在可以明确了,在注册的控制器里用到的。当用户填写表单数据发送到后台之后检测用户名是否存在,不存在时候可以在数据表中插入一条数据,注意一定是以数组形式插入。

最后看一下这个网站的目录结构了:

myproject/

/application

/controllers

         /BlogController.php

 /models

         /login.php

         /Blog.php

/views

/filters

/helpers

/scripts

         /blog

                  /login.html

                  /register.html

 /.htaccess

                            /config.ini

/library

              /Zend…(此处省略一万字…)

              /.htaccess

/public

/images

/scripts

/styles

         /site.css

/.htaccess

/.htacccess

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值