thinkphp

作者: snoweek | 来源:发表于2015-07-07 19:55 被阅读1165次

    拖沓将近两个月(有一点不好意思,竟然拖沓了两个月。虽然中间穿插了期末考试,六级考试,其实重点还是自己放弃了,搁置了),从刚开始感觉难得看不下去,到现在开发出一个小项目todoist,终究是对thinkphp有了一个大概的了解。下面就以todolist为例讲解thinkphp。
    (一)首先是准备工作
    下载thinkPHP框架最新版本,解压缩到你将要开发的项目位置。如图

    其中index.php是入口文件,即所有的请求都要经过此文件才能够完成。
    Application 是应用目录,在开发过程中,我们手动要操作的文件都在这个文件夹中。
    Public是资源文件目录
    thinkPHP是框架目录

    1. index.php入口文件
    2. 何为入口文件,,即所有的功能操作都要经过此文件才能够完成。
      代码如下
    <?php
    // 检测PHP环境
    if(version_compare(PHP_VERSION,'5.3.0','<'))  die('require PHP > 5.3.0 !');
    // 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false
    define('APP_DEBUG',True);
    // 定义应用目录
    define('APP_PATH','./Application/');
    // 引入ThinkPHP入口文件
    require 'D:/Dev Apps/xampp/htdocs/sunyan2015/017/ThinkPHP/ThinkPHP.php';
    // 亲^_^ 后面不需要任何代码了 就是如此简单
    

    从上述代码中 可以看出入口文件主要完成:

    1. 载入thinkPHP框架入口文件
    2. 定义系统相关常量
    3. 定义项目路径
    4. 定义调试模式和应用模式
      在第一次访问入口文件之前,application文件夹没有任何模块,如图

    现在我们访问入口文件,在浏览器中效果如下

    此时,application文件夹就自动生成了相应模块
    如图



    进入Home模块,如图



    其中标记的conf,controller,model,view是我们要操作的四个文件夹
    1. Conf文件夹,其中有config.Php是配置文件用来添加或修改一些配置参数
      2. Controller,model,view三个模块体现了mvc开发模式,view模块只负责呈现视图效果,
      即用户看到的网页效果,model模块就相当于是一个数据库,通过实例化model对象,我们可以随意对数据库进行操作,controller控制器是模型和视图之间连接的桥梁,从model中取出数据进行操作,然后将结果传递给视图。
      1模型实例化,我把她理解为链接数据库中具体的某个表。
      如,在TODOlist中,我建立了两个表,usermessage和listmessage,所以我建立了两个模型类。userMessageModel和listmessageModel,代码如下
    <?php
    namespace Home\Model;
    use Think\Model;
    class usermessageModel extends Model{
        protected $connection=array(
        'DB_TYPE'=>'mysql',
        'DB_USER'=>'root',
        'DB_PWD'=>'123456',
        'DB_HOST'=>'localhost',
        'DB_PORT'=>'3306',
        'DB_NAME'=>'todolist',
        'DB_CHARSET'=>'utf8',
        'DB_PREFIX'=>' ',
    );
        protected $tablePrefix='';
    }
    ?>
    
    <?php
    namespace Home\Model;
    use Think\Model;
    class listmessageModel extends Model{
        protected $connection=array(
        'DB_TYPE'=>'mysql',
        'DB_USER'=>'root',
        'DB_PWD'=>'123456',
        'DB_HOST'=>'localhost',
        'DB_PORT'=>'3306',
        'DB_NAME'=>'todolist',
        'DB_CHARSET'=>'utf8',
        'DB_PREFIX'=>' ',
    );
        protected $tablePrefix='';
    }
    ?>
    

    其中$connection数组定义的是数据库链接信息,$tablePrefix定义的是标的前缀为空。
    3. 控制器,其实就是一个类,由方法组成。如TODOlist我定义了五个方法。方法中具体代码省略,主要先看一下架构

    <?php
    namespace Home\Controller;
    use Think\Controller;
    class IndexController extends Controller {
        public function index(){    
        }
        public function register(){   
        }
        public function login(){ 
          }
             public function logout(){  
             }
             public function planlist(){
             }
    }
    ?>
    

    在view模块中,一个控制器(一个类),对应一个文件夹,文件夹的名称为类的名称,此类的名称为Index,则文件夹的名称为Index,然后在此文件夹中,每个方法对应一个html文件,这是方法的模板文件。如index方法对应index.html模板文件。

     public function index(){
            $title="欢迎页面";
            $bodytitle="欢迎访问todolist";
            $this->assign("bodytitle","$bodytitle");
            $username=session("username");
            if(empty($username)){
                $login=U('Home/Index/login');
               $register=U('Home/Index/register');
               $this->assign("link1","<a href=\"$login\">登录</a>");
                $this->assign("link2","<a href=\"$register\">注册</a>");
            }else{
                $logout=U('Home/Index/logout');
                $changepassword=U('Home/Index/changepassword');
                $planlist=U('Home/Index/planlist');
                $this->assign("link1","<a href=\"$logout\">注销</a>");
                $this->assign("link2","<a href=\"$changepassword\">更改密码</a>");
                $this->assign("link3","<a href=\"$planlist\">你的列表</a>");
            }
            $this->display();
    }
    public function register(){
            $user=D("usermessage");
            $error=array();
            if($_SERVER['REQUEST_METHOD']=='POST'){
            if(!empty($_POST['username'])){
                   $data['name']=$_POST['username'];
                }else{
                    $error[]="请输入用户名";
                }
             if(!empty($_POST['password'])){
                    $data['password']=$_POST['password'];
                }else{
                    $error[]="请输入密码";
                }
             if(empty($error)){
               $r=$user->where("name='{$data['name']}'")->select();
               if(empty($r)){
                $r1=$user->add($data);
                   if($r1){
                        $this->assign("error","恭喜你,注册成功");
                    }else{
                        $this->assign("error","系统正忙,请重新注册");
                    }
               }else{
                $this->assign("error","对不起,此用户名已经注册");
               }
             }else{
                foreach($error as $msg){
                    $this->assign("error","$msg");
                }
             }   
         }
         $this->display();
        }
        public function login(){ 
            $user=D("usermessage");
            $user->create();
            $error=array();
            if($_SERVER['REQUEST_METHOD']=='POST'){
                if(!empty($_POST['username'])){
                      $username=$_POST['username'];
                    }else{
                        $error[]="请输入用户名";
                    }
                 if(!empty($_POST['password'])){
                         $password=$_POST['password'];
                    }else{
                        $error[]="请输入密码";
                    }
                if(empty($error)){
                    $r=$user->where("name='$username'")->select();
                    if(!empty($r)){
                        $r1=$user->where("name='$username' and password='$password'")->find();
                            if(!empty($r1)){
                                  $this->assign("error","登录成功");
                                $this->assign("error1","{$r1['user_id']}");
                                  session("username","$username");
                                  session('user_id',$r1['user_id']);
                                  
                            } else{
                                $this->assign("error","密码错误,请重新输入");
                            } 
                        }else{
                            $this->assign("error","对不起,此用户名并未注册"); 
                     }
                 }else{
                    foreach($error as $msg){
                    $this->assign("error","$msg");
                    }
                }
              }
              $this->display();
          }
             public function logout(){
                 $username=session('username');
                  if(!empty($username)){
                session(null);
                $username=session('username');
                if(empty($username)){
                    $this->assign('logout','注销成功');
                    
                }else{
                     $this->assign('logout','注销失败');
                }
            }else{
                $this->assign('logout','您还没有登录');
            }
                $this->display(login);
             }
             public function changepassword(){
                $error=array();
                $user=D('usermessage');
                $username=session('username');
                $user_id=session('user_id');
                if(!empty($username)){
                    if($_SERVER['REQUEST_METHOD']=='POST'){
                        if(!empty($_POST['newpassword'])){
                            $data['password']=$_POST['newpassword'];
                            //$user->password==$_POST['newpassword'];
                        }else{
                            $error[]="请输入密码";
                        }
                        if(empty($error)){
                            $r=$user->where("user_id='$user_id'")->save($data);
                            $this->assign("error2","$r");
                           if($r){
                                $this->assign("error","恭喜你,密码更改成功");
                            }else{
                                $this->assign("error","系统正忙,请重新更改密码");
                            }
                        }else{
                            foreach($error as $msg){
                            $this->assign("error","$msg");
                            }
                         }
                     }
                }else{
                    $this->assign('error','请先登录');
                }
    
                $this->display();
             }
    
             public function planlist(){
                $username=session('username');
                $user_id=session("user_id");
                $this->assign("username","$username");
                //$user=D("usermessage");
                $list=D("listmessage");
                $list->create();
               if($_SERVER['REQUEST_METHOD']=='POST'){
                   if($_POST['orderhidden']=='a'){
                    if(!empty($_POST['content'])){
                        $data['content']=$_POST['content'];
                        $data['user_id']=$user_id;
                        $r=$list->add($data);
                        if($r){
                            $this->assign("message","添加成功");
                        }else{
                            $this->assign("message","添加失败");
                        }
                    }else{
                        $this->assign("message","请输入内容");
                    }
                   }
                   if($_POST['orderhidden']=='b'){
                    $list_id=$_POST['listhidden'];
                    $r=$list->where("list_id='$list_id'")->delete();
                    if($r){
                        $this->assign("message","删除成功");
                    }else{
                        $this->assign("message","请重新点击删除");
                    }
                   }
               }
                $r=$list->field("content,list_id")->where("user_id='$user_id'")->select();
                /*if(!empty($r)){
                    $num++;
                }
                $this->assign("num",$num);*/
                $this->assign("select",$r);
                $this->display();
             }
    

    他的模板文件index.html

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN">
    <head>
    <title>{$title}</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    </head>
        <body>
            <h1>{$bodytitle}</h1>
            <!--<a href="{:U('Home/Index/login')}" >登录</a>-->
          
            </br>
            <!--<a href="{:U('Home/Index/register')}"  >注册</a>-->
             {$link2}
            </br>
             {$link3}
         </br>
        </body>
    </html>
    

    Register.html

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN">
    <head>
    <title>登录页面</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="description" content="布尔教育 http://www.itbool.com" />
    </head>
        <body>
            <form action="register" method="POST"> 
                用户名:<br />
                <input type="text" name="username" />
                <br />
                密码:<br />
                <input type="password" name="password" />
                请由字母数字或下划线组成,长度为5-21
                <br />
                <input type="submit" value="注册" />
                <input type="reset" value="重置">
            </form>
            <a href="{:U('Home/Index/index')}">返回首页</a>
            <br/>
            <a href="{:U('Home/Index/login')}">登录</a>
        </br>   
        </br>
            {$error}
            </br>
    
        </body>
    </html>
    

    Login.html

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN">
    <head>
    <title>登录页面</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="description" content="布尔教育 http://www.itbool.com" />
    </head>
        <body>
            <form action="login" method="POST"> 
                用户名:<br />
                <input type="text" name="username" />
                <br />
                密码:<br />
                <input type="password" name="password" />
                <br />
                <input type="submit" value="登录" />
                </br>
                <input type="reset" value="重置">
            </form>
            <a href="{:U('Home/Index/changepassword')}">更改密码</a>
            <br />
            <a href="{:U('Home/Index/index')}">返回首页</a>
        </br>
        <a href="{:U('Home/Index/logout')}">注销</a>
        </br>
            {$error}
            {$logout}
            {$error1}
    </html>
    

    Changepassword.html

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN">
    <head>
    <title>更改密码页面</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="description" content="布尔教育 http://www.itbool.com" />
    </head>
        <body>
            <form action="changepassword" method="POST">
                新密码:<input type="password" name="newpassword" />
                <br />
                <input type="submit" value="确定更改" />
                <input type="reset" value="重置" />
            </form>
    
            <a href="{:U('Index/login')}">登录</a>
            <br />
            <a href="{:U('Index/index')}">返回首页</a>
        </br>
            {$error}
        </br>
            {$error1}
        </br>
            {$error2}
        </body>
    </html>
    

    Planlist.html

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN">
    <head>
    <title>计划列表</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="description" content="布尔教育 http://www.itbool.com" />
    </head>
        <body>
            <h2 align="center">{$username}欢迎来到你的计划列表</h2>
            {$message}
            <table align="center" border=3>
            <foreach name="select" item="list">
                <tr>
                    <td>
                        {$list.content}
                        <form action="planlist" method="POST">
                            <input type="hidden" name="listhidden" value="{$list.list_id}" />
                            <input type="hidden" name="orderhidden" value="b" />
                            <input type="submit" value="删除" />
                         </form>
                    </td>
                </tr>
            </foreach>
            <tr>
                <td>
            <form action="planlist" method="POST">
              内容:<textarea name="content" cols="30" rows="3"></textarea>
             <br />
            <input type="submit" value="添加" />
            <input type="hidden" name="orderhidden" value="a" />
             </form>
         </td>
     </tr>
         </table>
            </br>
            <a href="{:U('Home/Index/changepassword')}">更改密码</a>
            <br />
            <a href="{:U('Home/Index/index')}">返回首页</a>
        </br>
        <a href="{:U('Home/Index/logout')}">注销</a>
        </br>
        </body>
    </html>
    

    5.下面就以上代码中的知识点进行讲解

    1. URL的动态生成:利用thinkPHP内置的U方法。
      当我点击不同链接的时候,各个模块位置在发生变化,因此固定的路径是不可行的,路径必须是可以变化的。在控制器中,U方法用法如下
    $planlist=U('Home/Index/planlist');
     $this->assign("link3","<a href=\"$planlist\">你的列表</a>");
    

    在模板文件中,U方法用法如下

    <a href="{:U('Home/Index/logout')}">注销</a>
    

    概括一下为U(模块/控制器/方法),若省略模块名,则默认为当前模块名称

    2)实例化模型类:用D方法或者M方法

    $user=D("usermessage");
    
    $list=D("listmessage");
    

    3)CURD操作和连贯操作方法
    (1 )create方法:用于创建数据对象,最典型的应用就是自动根据表单数据创建数据对象,但数据对象是保存在内存中的,并没有实际写入到数据库中,知道使用add或save方法
    (2)save方法:

    $user->where("user_id='$user_id'")->save($data);
    

    返回值是影响的记录行数
    返回值是自动增长的主键,即一个整型数据
    (3)select方法:用于数据读取,即获取数据表中的多行记录,

    $user->where("name='{$data['name']}'")->select();
    

    若查询出错,返回值是false,若查询结果为空,则返回null,否则返回二维数组
    (4)delete方法:用于数据删除

    $list->where("list_id='$list_id'")->delete();
    

    返回值是删除的记录行数
    这四个操作称为CURD操作,是对数据库的基本操作
    (5)data方法:用于设置当前要操作的数据对象的值

    $data['password']=$_POST['password'];
    

    (6)add方法用于数据写入

    $user->add($data);
    

    (7)where方法,主要用于添加数据库操作的限制条件

    $user->where("user_id='$user_id'")->save($data);
    
    $r1=$user->where("name='$username' and password='$password'")->find();
    

    (8)field方法:选择要返回或操作的字段

    $list->field("content,list_id")->where("user_id='$user_id'")->select();
    
    1. session的设置与删除
    session("username","$username");
    session('user_id',$r1['user_id']);
     session(null);
    

    5)模板文件:thinkphp内置了一个基于XML的模板引擎thinktemplate,,在变量输出和制定模板文件时,与smarty模板引擎相同
    $this->assign()
    $this->display()
    我还用到了一个循环标签foreach ,用于计划列表的输出
    方法中的变量输出:$this->assign("select",$r);
    模板文件中的循环输出

        <foreach name="select" item="list">
                <tr>
                    <td>
                        {$list.content}
                        <form action="planlist" method="POST">
                            <input type="hidden" name="listhidden" value="{$list.list_id}" />
                            <input type="hidden" name="orderhidden" value="b" />
                            <input type="submit" value="删除" />
                         </form>
                    </td>
                </tr>
    

    相关文章

      网友评论

          本文标题:thinkphp

          本文链接:https://www.haomeiwen.com/subject/wrgyqttx.html