thinkphp

拖沓將近兩個月(有一點不好意思,竟然拖沓了兩個月捶闸。雖然中間穿插了期末考試夜畴,六級考試,其實重點還是自己放棄了鉴嗤,擱置了)斩启,從剛開始感覺難得看不下去,到現(xiàn)在開發(fā)出一個小項目todoist醉锅,終究是對thinkphp有了一個大概的了解兔簇。下面就以todolist為例講解thinkphp。
(一)首先是準備工作
下載thinkPHP框架最新版本硬耍,解壓縮到你將要開發(fā)的項目位置垄琐。如圖

其中index.php是入口文件,即所有的請求都要經(jīng)過此文件才能夠完成经柴。
Application 是應(yīng)用目錄狸窘,在開發(fā)過程中,我們手動要操作的文件都在這個文件夾中坯认。
Public是資源文件目錄
thinkPHP是框架目錄

  1. index.php入口文件
  2. 何為入口文件翻擒,氓涣,即所有的功能操作都要經(jīng)過此文件才能夠完成。
    代碼如下
<?php
// 檢測PHP環(huán)境
if(version_compare(PHP_VERSION,'5.3.0','<'))  die('require PHP > 5.3.0 !');
// 開啟調(diào)試模式 建議開發(fā)階段開啟 部署階段注釋或者設(shè)為false
define('APP_DEBUG',True);
// 定義應(yīng)用目錄
define('APP_PATH','./Application/');
// 引入ThinkPHP入口文件
require 'D:/Dev Apps/xampp/htdocs/sunyan2015/017/ThinkPHP/ThinkPHP.php';
// 親^_^ 后面不需要任何代碼了 就是如此簡單

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

  1. 載入thinkPHP框架入口文件
  2. 定義系統(tǒng)相關(guān)常量
  3. 定義項目路徑
  4. 定義調(diào)試模式和應(yīng)用模式
    在第一次訪問入口文件之前陋气,application文件夾沒有任何模塊劳吠,如圖

現(xiàn)在我們訪問入口文件,在瀏覽器中效果如下

此時巩趁,application文件夾就自動生成了相應(yīng)模塊
如圖



進入Home模塊痒玩,如圖



其中標記的conf,controller议慰,model蠢古,view是我們要操作的四個文件夾
  1. Conf文件夾,其中有config.Php是配置文件用來添加或修改一些配置參數(shù)
    2. Controller别凹,model草讶,view三個模塊體現(xiàn)了mvc開發(fā)模式,view模塊只負責呈現(xiàn)視圖效果番川,
    即用戶看到的網(wǎng)頁效果到涂,model模塊就相當于是一個數(shù)據(jù)庫,通過實例化model對象颁督,我們可以隨意對數(shù)據(jù)庫進行操作,controller控制器是模型和視圖之間連接的橋梁浇雹,從model中取出數(shù)據(jù)進行操作沉御,然后將結(jié)果傳遞給視圖。
    1模型實例化昭灵,我把她理解為鏈接數(shù)據(jù)庫中具體的某個表吠裆。
    如,在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數(shù)組定義的是數(shù)據(jù)庫鏈接信息,$tablePrefix定義的是標的前綴為空嘶窄。
3. 控制器怀跛,其實就是一個類,由方法組成柄冲。如TODOlist我定義了五個方法吻谋。方法中具體代碼省略,主要先看一下架構(gòu)

<?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模塊中现横,一個控制器(一個類)漓拾,對應(yīng)一個文件夾阁最,文件夾的名稱為類的名稱,此類的名稱為Index骇两,則文件夾的名稱為Index速种,然后在此文件夾中,每個方法對應(yīng)一個html文件脯颜,這是方法的模板文件哟旗。如index方法對應(yīng)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","系統(tǒng)正忙闸餐,請重新注冊");
                }
           }else{
            $this->assign("error","對不起,此用戶名已經(jīng)注冊");
           }
         }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","系統(tǒng)正忙剔宪,請重新更改密碼");
                        }
                    }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","請輸入內(nèi)容");
                }
               }
               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" />
            請由字母數(shù)字或下劃線組成拂铡,長度為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">
          內(nèi)容:<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的動態(tài)生成:利用thinkPHP內(nèi)置的U方法。
    當我點擊不同鏈接的時候葱绒,各個模塊位置在發(fā)生變化感帅,因此固定的路徑是不可行的,路徑必須是可以變化的地淀。在控制器中失球,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方法:用于創(chuàng)建數(shù)據(jù)對象,最典型的應(yīng)用就是自動根據(jù)表單數(shù)據(jù)創(chuàng)建數(shù)據(jù)對象烈疚,但數(shù)據(jù)對象是保存在內(nèi)存中的黔牵,并沒有實際寫入到數(shù)據(jù)庫中,知道使用add或save方法
(2)save方法:

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

返回值是影響的記錄行數(shù)
返回值是自動增長的主鍵爷肝,即一個整型數(shù)據(jù)
(3)select方法:用于數(shù)據(jù)讀取猾浦,即獲取數(shù)據(jù)表中的多行記錄,

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

若查詢出錯阶剑,返回值是false跃巡,若查詢結(jié)果為空,則返回null牧愁,否則返回二維數(shù)組
(4)delete方法:用于數(shù)據(jù)刪除

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

返回值是刪除的記錄行數(shù)
這四個操作稱為CURD操作素邪,是對數(shù)據(jù)庫的基本操作
(5)data方法:用于設(shè)置當前要操作的數(shù)據(jù)對象的值

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

(6)add方法用于數(shù)據(jù)寫入

$user->add($data);

(7)where方法,主要用于添加數(shù)據(jù)庫操作的限制條件

$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的設(shè)置與刪除
session("username","$username");
session('user_id',$r1['user_id']);
 session(null);

5)模板文件:thinkphp內(nèi)置了一個基于XML的模板引擎thinktemplate,,在變量輸出和制定模板文件時猪半,與smarty模板引擎相同
$this->assign()
$this->display()
我還用到了一個循環(huán)標簽foreach ,用于計劃列表的輸出
方法中的變量輸出:$this->assign("select",$r);
模板文件中的循環(huán)輸出

    <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>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末兔朦,一起剝皮案震驚了整個濱河市偷线,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沽甥,老刑警劉巖声邦,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異摆舟,居然都是意外死亡亥曹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門恨诱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來媳瞪,“玉大人,你說我怎么就攤上這事照宝∩呤埽” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵厕鹃,是天一觀的道長兢仰。 經(jīng)常有香客問我,道長剂碴,這世上最難降的妖魔是什么把将? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮忆矛,結(jié)果婚禮上秸弛,老公的妹妹穿的比我還像新娘。我一直安慰自己洪碳,他們只是感情好,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布叼屠。 她就那樣靜靜地躺著瞳腌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪镜雨。 梳的紋絲不亂的頭發(fā)上嫂侍,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音荚坞,去河邊找鬼挑宠。 笑死,一個胖子當著我的面吹牛颓影,可吹牛的內(nèi)容都是我干的各淀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼诡挂,長吁一口氣:“原來是場噩夢啊……” “哼碎浇!你這毒婦竟也來了临谱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤奴璃,失蹤者是張志新(化名)和其女友劉穎悉默,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苟穆,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡抄课,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了雳旅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片跟磨。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖岭辣,靈堂內(nèi)的尸體忽然破棺而出吱晒,到底是詐尸還是另有隱情,我是刑警寧澤沦童,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布仑濒,位于F島的核電站,受9級特大地震影響偷遗,放射性物質(zhì)發(fā)生泄漏墩瞳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一氏豌、第九天 我趴在偏房一處隱蔽的房頂上張望喉酌。 院中可真熱鬧,春花似錦泵喘、人聲如沸泪电。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽相速。三九已至,卻和暖如春鲜锚,著一層夾襖步出監(jiān)牢的瞬間突诬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工芜繁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留旺隙,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓骏令,卻偏偏與公主長得像蔬捷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子伏社,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容