拖沓將近兩個月(有一點不好意思,竟然拖沓了兩個月捶闸。雖然中間穿插了期末考試夜畴,六級考試,其實重點還是自己放棄了鉴嗤,擱置了)斩启,從剛開始感覺難得看不下去,到現(xiàn)在開發(fā)出一個小項目todoist醉锅,終究是對thinkphp有了一個大概的了解兔簇。下面就以todolist為例講解thinkphp。
(一)首先是準備工作
下載thinkPHP框架最新版本硬耍,解壓縮到你將要開發(fā)的項目位置垄琐。如圖
其中index.php是入口文件,即所有的請求都要經(jīng)過此文件才能夠完成经柴。
Application 是應(yīng)用目錄狸窘,在開發(fā)過程中,我們手動要操作的文件都在這個文件夾中坯认。
Public是資源文件目錄
thinkPHP是框架目錄
- index.php入口文件
- 何為入口文件翻擒,氓涣,即所有的功能操作都要經(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';
// 親^_^ 后面不需要任何代碼了 就是如此簡單
從上述代碼中 可以看出入口文件主要完成:
- 載入thinkPHP框架入口文件
- 定義系統(tǒng)相關(guān)常量
- 定義項目路徑
- 定義調(diào)試模式和應(yīng)用模式
在第一次訪問入口文件之前陋气,application文件夾沒有任何模塊劳吠,如圖
現(xiàn)在我們訪問入口文件,在瀏覽器中效果如下
此時巩趁,application文件夾就自動生成了相應(yīng)模塊
如圖
進入Home模塊痒玩,如圖
其中標記的conf,controller议慰,model蠢古,view是我們要操作的四個文件夾
- 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.下面就以上代碼中的知識點進行講解
- 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();
- 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>