咨询电话:186 7916 6165 咨询电话:186 7916 6165 (微信同号)    在线QQ:181796286
NEWS BLOG ·
学无止境
关注开优网络 关注前沿
mysql错误大全
PHP Web开发之权限模块

PHP Web开发之ThinkPHP框架

发表日期:2015-10-23    文章编辑:南昌开优网络    浏览次数:4433    标签: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为结束