欧美日韩一区二区三区四区不卡,日韩欧美视频一区二区三区四区,久久精品欧美一区二区三区不卡,国产精品久久久乱弄

咨詢電話:186 7916 6165 咨詢電話:186 7916 6165 (微信同號)    在線QQ:181796286
NEWS BLOG ·
學無止境
關注開優網絡 關注前沿
mysql錯誤大全
PHP Web開發之權限模塊

PHP Web開發之ThinkPHP框架

發表日期:2015-10-23    文章編輯:南昌開優網絡    瀏覽次數:4917    標簽:PHP應用

下載ThinkPHP放到項目中
在根目錄中新建index.php //主入口文件
define('THINK_PATH','./ThinkPHP/');//定義常量引用ThinkPHP文件夾
define('APP_PATH','./home/');//定義項目路徑,系統會自動生成很多文件夾
define('APP_NAME','home');//定義項目名稱,可用于權限
require THINK_PATH.'ThinkPHP.PHP';//引用ThinkPHP文件
App::run();//調用ThinkPHP\Lib\Think\Core中的App類的run靜態方法

控制器:lib-Action文件夾
模 型:lib-Model文件夾
命名規則:UserAction.class.php
class UserAction extends Action{//新建的控制器必須繼承Action類
public function index(){ //默認方法
}
public function add(){ //add方法
}
}
創建一個CommonAction.class.php即創建接口,并讓所有控制器都繼承該接口
class CommonAction extends Action{
public function _initialize(){//系統定義的接口名稱
header('Content-Type:text/html;charset=utf-8');    //utf-8編碼
}
}
所有的自定義控制器都繼承CommonAction類就可以解決編碼問題即class UserAction extends CommonAction{}

訪問路徑:
瀏覽器中訪問:http://localhost/Test/index.php/user/index/id/5 //即/主入口/控制器/方法/參數名/參數值
//Test為項目根目錄,index.php主入口,user為UserAction控制器訪問時去掉Action,index為index方法,id為參數名,5為值
0:http://localhost/Test/index.php?a=index&m=user//普通模式a為方法,m為控制器
1:http://localhost/Test/index.php/user/index//pathinfo默認方法
2:http://localhost/Test/user/index//rewrite(偽靜態)自定義規則
3:http://localhost/Test/index.php?s=/user/index//兼容模式
在home\Conf\config.php中設置:'URL_MODEL'=>1;//1為默認可以不寫如果采用偽靜態方法就必須改為2并加上url重寫規則
偽靜態:1、開啟apache的rewirte模塊
2、在與主入口文件相同的目錄中新建.htaccess文件 規則可以到手冊中找到url重寫
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]//這里正則表達可以自定義
</IfModule>

模版與控制器關系:例以上……
就要在home\tpl\default文件夾中新建User文件夾并創建index.html文件 //User對應控制器的User去掉Action,index.html對應index方法
在function index(){ 
$this->display("指定位置","編碼utf-8","文件的類型text/xml");
$this->display();//調用該控制器的默認模版即index.html
$this->display("add");//調用該控制器對應的模版相同的文件夾中的add.html
$this->display("Index:reg");//調用Index模版下的reg.html
$this->display("sink@User:gg"); //sink是和default同級目錄下的User文件夾下的gg.html
$this->display("./Public/ss.html"); //調用根目錄下的public目錄中的ss.html 注:./為主入口即index.php的相對路徑
$this->assign("變量","值");//分配。注要先在Conf\config.php中加上改變模版變量的邊界符<{}>
}//直接調用就可以顯示模版內容
包含文件:
<include file="模塊名:操作名" />
<include file="Index:top" />Index為模塊,top為方法,在top中調用另一頁面即可實現母版頁效果

模塊替換
<form action="__URL__/add" method="post">//提交到當前模塊的add方法即:Test/home/index.php/user/add 注:add為方法
<img src="__PUBLIC__/images/log.png">//__PUBLIC__公共目錄下的images下的圖片
<a href="__URL__/edit/id/<{$vo['id']}>">編輯</a>//這里可以直接寫不需要表單
<a href="__URL__/del/id/<{$vo['id']}>">刪除</a>//__URL__為當前路徑,del為控制器中的方法名,id為參數,<{$vo['id']}>為值即循環數組中的下標值

操作數據庫
1、在根目錄中新建config.inc.php文件
return array(
'DB_TYPE'=>'mysql',//選擇數據庫類型
'DB_HOST'=>'localhost',//服務器地址
'DB_NAME'=>'xiaobinod',//數據庫名
'DB_USER'=>'root',//用戶名
'DB_PWD'=>'123456',//密碼
'DB_PORT'=>'3306',//端口
'DB_PREFIX'=>'od_',//表前綴
'DB_CHARSET' => 'utf8',    // 編碼utf8
);
打開admin目錄和home目錄中的Config\config.php頁面中引用
$arr1=array(寫入前臺或后臺的個性配置);$arr2=include './config.inc.php';
return array_merge($arr1,$arr2);//返回$arr1和$arr2兩個數組
2、實例化數據庫
在控制器中實例化模型即:
$user=new Model('user');↓=//user為數據表即od_user表,系統自帶的默認操作user表的方法
或$user=M('user');↑=//M為系統自帶的操作user表的類
$list=$user->select();//查詢表中所有數據
dump($list);//打印出來
2.1、在Lib\Model中創建如UserModel.class.php自定義的數據庫操作可在此加上一些自定義的方法
class UserModel extends Model{
function aa(){
}
}
2.2、$user=M('user','UserModel');//實例化基本模型和自定義的UserModel模型
2.3、$user=new UserModel();↓=
2.4、$user=D('user');↑=//D為自定義的類,在Tpl\Model中創建UserModel.class.php
$list=$user->select();//select為父類Model中的方法
dump($list);
2.5、$user=new Model();↓=
2.6、$user=M();↑=
$list=$user->query("select * from od_user");
dump($list);
2.7、$user=D('admin','user');//實例化admin即后臺的user模型即調用后臺的一些數據庫操作方法
cretate方法
$user=new Model('user');//創建數據模型
if($user->create(){//使用create方法
$user->password=md5($user->password);//md5加密,注這里的password為數據表中的字段,并且為表單的名稱,即表單中的名稱和數據表中的字段名相同才有效
if($user->add()){//添加方法
$this->success('添加成功');//顯示提示信息success.html可以到Examples實例中找到必須存放到Tpl\default中創建的Public文件夾中
}else{
$this->error('添加失敗');//顯示提示信息
}
查詢
find();//只查詢一條記錄,select();//返回所有記,finkAll();//和select一樣,getField();//讀取某個字段值
$id=(int)$_GET['id'];//(int)為取整,
$list=$user->where("id=$id")->select();//查詢出id大于3的所有記錄,$id為傳入的
$list=$user->where('id>3')->limit('0,2')->order('id desc')->field('id,username as un')->select();//查詢id的兩條記錄按時間降序排列
//注:where limit order field 書寫的順序可以隨意寫
$list=$user->table(array('od_user u,od_news n'))->where('u.id=n.id');//多表查詢
$list=$user->execute("update think_user set name='thinkPHP' where status=1");//execute增、刪、改
$list=$user->query("select * form od_user where id=5"); //query查詢
搜索
if(isset($key)&&isset($type)){注:key為文本框,type為下拉列表如.username,title...
$where=$type." like '%".$key."%' "; 如:where username like '%xxxx%';
}
$list=$user->where($where)->select();
更新
$data['password']='aaa';//$data為數組password為數據表中的password字段
$data['id']='4';//和where('id=4')一樣//這種寫法必須為主鍵
$list=$user->where('id=4')->save($data);//save為更新

$list=$user->setInc('price','id=1',1);//price為字段字,id=1為條件,1為加1
$list=$user->setDec('price','id=1',1);//price為字段字,id=1為條件,1為減1
$list=$user->where('id=1')->setField(array('username','password'),array('cxlook','123456'));//第一個數組為字段名,第二個數據為值
添加
$data['username']='test';
$data['password']=md5('123456');
$list=$user->add($data);
刪除
$list=$user->where("id=$id")->delete();//刪除id為4的數據
循環數組
1、在模版頁中
<volist name="alist" id="vo">//alist為控制器中分配的變量,vo為本次循環的臨時數組
<span><{$vo['username']}></span> <span><{$vo['id']}></span>
</volist>
2、控制器中
$list=$user->field('id','username')->select();//查詢所有數據顯示id,username
$this->assign('alist',$list);//把查詢出來的數組賦給變量
修改
例:通過傳入的id進行修改
1、控制器中
$id=(int)$_GET['id'];//int為取整
$list=$user->where("id=$id")->find();//通過id只查詢一條數據
$this->assign('blist',$list);//分配變量
$this->display("./Public/edit.html");//顯示
2、模版中顯示
<form action="" method="post">
用戶名:<input type="text" name="username" value="<{$blist['username']}>">//值為分配變量數組中的下標值
<input type="hidden" name="id" value="<{$blist['id']}>">
</form>

驗證碼
把原ThinkPHP2.2中的AddOns\Library中的ORG文件夾復制到項目中的TinkPHP\Lib中
引入Image.class.php文件
function verify(){
import('ORG.Util.Image');//引用Image就為Image.class.php文件
Image::buildImageVerify(10,5,gif,90,30,'verify');
//10為個數,5為混合類型,gif為格式,90為長度,30為高度,'verify'為session的名稱,默認都可以不寫
//即Image::buildImageVerify();
}
調用驗證碼:
驗證碼:<input type="text" name="verify"><img src="__APP__/common/verify" onclick="show(this)">//APP為入口文件地址common為控制器名稱verify為方法
function show(obj){
obj.src="__APP__/common/verify/random/"+Math.random();//random為參數=隨機數
}
if($_SESSION['verify']!=md5($_POST['verify'])){//默認的verify驗證碼是md5加密的,$_POST['verify']表單中文本框的值
$this->error('驗證碼不正確');
}
分頁
import('ORG.Util.Page');//引用分頁擴展類
$user=new Model('user');
$count=$user->count();//獲取數據表的和
$page=new Page($count,5);//實例化分頁類5為頁大小

//$page->setConfig('header','個會員');//改變默認的分頁中的顯示參數.不寫為默認
//$page->setConfig('prev','上一組會員');
//$page->setConfig('next','下一組會員');
//$page->setConfig('first','首頁');
//$page->setConfig('last','尾頁');

//$page->setConfig('theme','<div>%header%</div>......');//theme自定義顯示參數 
注:在Page.class.php原文件中修改str_replace的第二個數組的排列

$show=$page->show();//輸入分頁
$list=$user->field('id,username,email')->order('id desc')->limit($page->firstRow.','.$page->listRows)->select();
//firstRow起始頁,listRows每頁顯示數
$this->assign('page',$show);//分配變量
前臺<{$page}>//顯示分頁
搜索查詢分頁
public function index() {//默認方法
$f = new Model ( "feedback" );//引入客戶留言表
import ( "ORG.Util.Page" );//引入分頁類
$count = $f->count ();//獲取總記錄數
$page = new Page ( $count, 10 );//實例化分頁
$show = $page->show ();//輸出顯示分頁
$list = $f->order ( "createdate desc" )->limit ( $page->firstRow . ',' . $page->listRows )->select ();//獲取列表
$this->assign ( 'list', $list );//分配
$this->assign ( 'page', $show );
$this->display ( "Index:feedback" );//顯示Index目錄下的feedback.html文件
}
public function key() {
$key = $_POST ['txtkey'];
$f = new Model ( "feedback" );
import ( "ORG.Util.Page" );
$count = $f->where ( "username like '%$key%'" )->count ();//獲取條件的記錄數
$page = new Page ( $count, 5 );
$show = $page->show ();
$list = $f->where (" username like '%$key%'" )->order("createdate desc")->limit ( $page->firstRow . ',' . $page->listRows )->select ();//獲取條件的列表
$this->assign ( 'list', $list );
$this->assign ( 'page', $show );
$this->display ( "Index:feedback" );
}
文件上傳
if (empty ( $_FILES['fuimg'] )) {//判斷file標簽中是否有值
echo "<script language=JavaScript>alert('請選擇要上傳的文件');history.go(-1);</script>";
}
或者
//if(strlen($_FILES['fuimg']['name'])==0){ //判斷名稱為fuimg的file標簽的name是否存在
//echo "<script>alert('請選擇上傳文件');history.go(-1);</script>";
//}
import('ORG.Net.UploadFile');//引用上傳類
$up = new UploadFile ();//實例化上傳類
$up->maxSize = '1000000';//文件大小1M即1百萬
$up->saveRule = uniqid;//上傳文件的文件名格式
$up->allowExts = array ('jpg', 'bmp', 'png', 'jpeg', 'gif' );//允許上傳的文件格式
$up->thumb = true;//是否生成縮略圖
$up->thumbMaxWidth = '300,500';//縮略圖寬第一個300,第二個500,即可以生成兩個縮略圖
$up->thumbMaxHeight = '200,400';//縮略圖高
$up->thumbPrefix = 's_,m_';//縮略圖的前綴
$up->thumbRemoveOrigin = false;//是否移除原圖片
$up->autoSub = true;//是否啟動子目錄
$up->subType = 'date';//子目錄的方式'hash'或'date'
$up->dateFormat = 'Ymd';//子目錄時間的格式
$date = date ( 'Ymd', time () );//獲取當前日期
$up->savePath = "./Public/upload/";//保存路徑./Public即與主入口同級的文件夾
$up->thumbPath = "./Public/upload/$date/";//縮略圖保存的目錄即在當前日期下
if ($up->upload ()) {//upload方法
$info = $up->getUploadFileInfo ();//getUploadFileInfo 返回成功后的信息
$file=M('user');//實例化user表
$data['filename']=$info[0]['savename'];//savename上傳成功后文件名......保存過到數據庫中或存到SESSION中再插入數據庫

//或者:$_SESSION ['img'] = $info [0] ['savename'];//把上傳后的圖片名稱保存到session中
$this->assign('info',$_SESSION ['img']);//分配session
$this->display("Index:user");//顯示模板文件即Index目錄下的user.html文件
} else {
$error = $up->getErrorMsg ();//getErrorMsg 返回失敗后的信息
echo "<script language=JavaScript>alert('$error');history.go(-1);</script>";
exit ();
}

前臺調用:
<?php 
if(empty($info)){//分配的info不存在時
echo "<img width='100' height='78' src='__PUBLIC__/upload/none_100_78.jpg' />";
}
else
{
$img=explode('/',$_SESSION ['img']);//以'/'號分割session
$tmp=$img[0].'/s_'.$img[1];//縮略圖路徑:20120808/s_503dcec16deda.jpg
echo "<img width='100' height='78' src='__PUBLIC__/upload/$tmp' />";//存在info是的圖片路徑
}
?>
Ajax提交
getJSON方法提交
控制器
public function add(){
$mes=new Model('news');
if($mes->add($_GET)){//GET方法傳入的
$this->ajaxReturn($_GET,'添加信息成功',1);//ajaxReturn系統自帶的方法
}else{
$this->ajaxReturn(0,'添加信息失敗',0);
}
}
模版:
<div style="color:red" id="mess">
<form action="__URL__/add" method="get">//get方式
標題<input name="txttitle" type="text" id="txttitle" size="50"><br>
信息<textarea name="txtbody" cols="50" rows="8" id="txtbody"></textarea><br>
<input type="button" value="提交">
</form>
<script type="text/javascript" src="__PUBLIC__/js/jquery.js"></script>//引用jquery
<script type="text/javascript">
$(function(){
    $('input:button').click(function(){//單出按鈕時
        var $title = $('#txttitle').val();
        var $body = $('#txtbody').val();
 var $mess = $('#mess);
        if ($title.length == 0 || $body.length == 0) {
            alert("請輸入完整再提交");
        } 
$.getJSON('__URL__/add', {title: $title,body: $body}, function(json){//$.getJSON方法{}中的為數據 function為回調函數
 if (json.status == 1) {//返回的json狀態
$mess.html('標題為' + json.data.title + '信息為' + json.data.body);//json中的信息
            }
            else {
                $mess.html('信息添加失敗,請檢查');                            
            }                        
        })
    })
})
</script>
第二種:getJSON方法提交
控制器:
$username=$_GET['username'];
$mes=new Model('user');
if($mes->where("username='$username'")->find()){
$this->ajaxReturn($username,'不可以注冊',1);//通過傳入的用戶名判斷是否可以注冊
}else{
$this->ajaxReturn($username,'可以注冊',0);
}
模版:
function checkUsername(username) {
var username = $.trim(username);  
var url = "__URL__/checkUser/username/" + username+"/random/"+Math.random();//完整的url加上隨機數
    $.getJSON(url, function (data) {
if(data.status==1){//返回的狀態
$("#mes_username").html("該用戶名已存在");
            return;
}
         else {
            $("#mes_username").html("可以注冊");
            return;
        }
    });
<input type="text"  onblur="checkUsername(this.value);"  name="txtname" class="text" id="txtname" />  
第三種:普通的POST提交
模板:
 <script type="text/javascript" src="__PUBLIC__/js/jquery-1.6.1.min.js">
        </script>
        <script>
            $(function(){
                $('input:button').click(function(){//按鈕單擊時
                    var $username = $('#username').val();//獲取文件框
                    var $mess = $('#mess');
                    if ($username.length == 0) {
                        alert("請輸入完整再提交");
                        return;
                    }
                    $.post('__URL__/add', {//post提交(路徑,{名稱:值},返回函數,類型.'json')
                        username: $username
                    }, function(json){
                        if (json.status == 1) {
                            $mess.html('標題為' + json.data.username);
                        }
                        else {
                            $mess.html('信息添加失敗,請檢查');
                        }
                    }, 'json');
                })
            })
        </script>
<div style="color:red" id="mess">
<form action="__URL__/add" method="post">
    <input type="text" name="username" id="username"/>
    <br>
    <input type="button" value="提交">
</form>
控制器:
public function add() {
$admin = new Model ( 'admin' );
$data['username']=trim($_POST['username']);
$list=$admin->add($data);
if($list>0){
$this->ajaxReturn($data,'添加成功',1);
}else{
$this->ajaxReturn(0,'添加失敗',0);
}
}
第四種:ThinkPHP封裝的AJAX方法POST提交
1、把原文件中的Examples\Public中的JS文件夾復制到項目中public/js中//復制文件
模版:
<script src="__PUBLIC__/js/Base.js"></script>//引用js文件不可以亂
<script src="__PUBLIC__/js/prototype.js"></script>
<script src="__PUBLIC__/js/mootools.js"></script>
<script src="__PUBLIC__/js/Ajax/ThinkAjax.js"></script>
<script>
function add(){
ThinkAjax.sendForm('frm','__URL__/add',wc,'result');//frm為表單id,wc為回調函數,result為顯示信息的id也可以不要
}
function wc(data,status){
if(status!=1){
alert('發送失敗請檢查');
}else{
$('list').innerHTML+='標題'+data.title+',信息'+data.message;
}
}
</script>
<div id="result"></div>
<div id="list"></div>
<form action="__URL__/add" method="POST" id="frm">//post方法提交的
標題<input type="text" name="title"><br>
信息<input type="text" name="message"><br>
<input type="button" value="提交" onclick="add()">
</form>
控制器:
$m=M('Message');
if($vo=$m->create()){
if($m->add()){
$this->ajaxReturn($vo,'用戶添加成功',1);//ajaxReturn
}else{
$this->ajaxReturn(0,'添加失敗',0);
}
}else{
$this->error($m->getError());
}
緩存
1、在config.php配置文件中加上
'DATA_CACHE_TYPE'=>'file',//緩存的格式file為文件格式
'DATA_CACHE_TIME'=>'3600',//緩存時間
控制器:
$list=S('list');//獲取緩存
if(empty($list)){//如果緩存不存在時
$user=M('user');
$list=$user->select();
S('list',$list,3600);//創建緩存名稱為list內容為$list時間為3600
echo '這是未經過緩存服務器的,直接查找數據庫的';
}
dump($list);
S('data',NULL);//刪除緩存
視圖
class UserViewModel extends ViewModel{//創建模型必須繼承ViewModel類
public $viewFields=array(//創建數組$viewFields用于定義視圖包括的字段。不可以改
'User'=>array('id','username','password'),//user為表名,數組即要查詢的字段名
'User_message'=>array('id'=>'uid','userid','info','_on'=>'User.id=User_message.userid'),//'id'=>'uid'把id改別名為uid,_on為關聯條件
);
控制器:
$user=new UserViewModel();//實例化自定義的模型D('UserView');
$list=$user->select();
dump($list);
模版
1、分配變量:如$this->assign('title','你好');前臺<{$title}>
2、分配數組:如$a=$user->where('id=1')->find();
$this->assign('title',$a);
前臺:<{title.id}> <{title.username}>或者:<{title['id']}> <{title['username']}>
3、分配函數:<{title:username|strtolower|md5}> 用:號賦值,用|號直接寫函數
    <{title:username|substr=0,5}> 即,截取把用戶名截取5位數  <{變量|函數=參數}>
    <{createdate|date='Y-m-d H:i:s',###}> date時間函數,###即把cratedate拿來賦值
4、引用上下的母版頁
    <include file='./Public/header.html' />注此處不需要<{}>只要用<>這種xml風格的標簽。
    <{include file='./Public/foot.html'} / >引用底頁文件

常用方法
截取字符串
1、在控制器方法中加上load('extend'); //打開類庫
2、在模板文件中使用<{$vo['body']|msubstr=0,20}> //使用0為開始處,20為結束
主站蜘蛛池模板: 铁岭市| 驻马店市| 阳谷县| 安仁县| 蓝田县| 常熟市| 喀喇| 香河县| 广平县| 阳新县| 宁都县| 虞城县| 永城市| 虎林市| 大埔区| 申扎县| 武汉市| 盐山县| 晋宁县| 海淀区| 安国市| 湟中县| 漯河市| 安吉县| 长武县| 清徐县| 和林格尔县| 永和县| 隆安县| 渭源县| 达孜县| 阿巴嘎旗| 凤阳县| 石阡县| 玉树县| 鹤岗市| 临沂市| 吉林市| 高尔夫| 重庆市| 图片|