Thinkphp3.2.3框架学习笔记
1、create()自动获取数据,且比I()、$ _GET()、$ _POST()等获取安全
create方法可以对POST提交的数据进行处理,不用$ _POST[‘cpname’]去接收(通过表中的字段名称与表单提交的名称对应关系自动封装数据实例)。
D('reg')->create(); //给表添加信息,html中name的值必须与数据库表的字段名一致
$user->add($data); //必须添加到数据库
2、php如何获得多个相同name提交的值并保存到数据库
在表单中,做一个数组字段,如
接收数据时:$ array=$ _POST[“name”];
变量$array就是一个包含了多个相同name值的数组。
如:
HTML中代码:
<form method="post" action="{:U('Cp/cp_type_check')}" enctype="multipart/form-data">
<ul>
<volist name="rel" id="vo">
<li>
<input type="text" name="name[]" value="{$vo.name}"/>
<input type="hidden" name='typeid[]' value="{$vo.typeid}"/>
<input type="text" name="sno[]" value="{$vo.sno}"/>
</li>
</volist>
<li>
<input type="submit" class="btn" value="批量修改"/>
</li>
</ul>
</form>
Controller中代码:
public function cp_type_check(){
$typeid=I('typeid');
$name=I('name');
$sno=I('sno');
$len=count($name);
for($i=0;$i<$len;$i++){
$data['typeid']=$typeid[$i];
$data['name']=$name[$i];
$data['sno']=$sno[$i];
M('cp_type')->save($data);
}
$this->success('批量修改成功',U('Cp/cp_type'),2);
}
3、包含文件的2中写法
<include file="Include:header,Include:footer" /> //包含多个文件用,隔开
<include file="Include/header" /> //包含单个文件
4、四维循环输出(按类型循环输出)
Html中:
<volist name="bb" id="vo">
<span>{$vo['name']}</span>
<volist name="vo['vv']" id="vx">
<ul>
<li><span>{$vx['title']}</span></li>
</ul>
</volist>
</volist>
Controller:
$bb=M('template_type')->select();
//循环新建4维数组
foreach($bb as $key=>$val){
$bb[$key]['vv']=M('template')->where('type='.$val['tid'])->select();//将查询到的内容赋予template _type表的新字段vv,'type='.$val['tid']用于2表关联
}
$this->assign('bb',$bb);
$this->display();
5、模糊搜索关键词(html中搜索表单要用get方式提交,否则搜索结果点击下一页会显示未搜索状态)
public function index(){
if(IS_POST){ //如果有传值,则
$name=I('search'); //获取搜索词
$data['cpname']=array('like',"%".$name."%");//在产品名中模糊查询搜索词,%表示$name之前之后可有可无字符串
$list=M('cp')->where($data)->select(); //查询具有搜索词的产品
foreach($list as $key=>$val){ //替换函数修改搜索词在输出产品中产品名的式样
$list[$key]['cpname']=str_replace($name,"<font color='red'>".$name."</font>",$val['cpname']);
}
$this->list=$list;
}else{ //如果没传值,则
$this->list=M('cp')->select();
}
$this->display();
}
6、数组比直接数据安全(防SQL注入攻击)
如:
M(‘list’)->where(id=1)->add(); //不安全
$data[‘id’]=1;
$data[‘name’]=’aliyun’;
M(‘list’)->where($data)->add(); //安全
7、$ this->assign(‘list’,$ list)比$ this->list=$ list更安全
8、page分页类样式
a、简单样式
效果如下:
使用thinkphp自带的page分页,无需重写page.class,直接添加css样式即可。
控制器中:
$User = M('User'); // 实例化User对象
$count = $User->where('status=1')->count(); // 查询满足要求的总记录数
$Page = new \Think\Page($count,10); // 实例化分页类 传入总记录数和每页显示的记录数(10)
$show = $Page->show(); // 分页显示输出
$list =$User->where('status=1')->order('create_time')->limit($Page->firstRow.','.$Page->listRows)->select(); // 进行分页数据查询 注意limit方法的参数要使用Page类的属性
$this->assign('list',$list);
$this->assign('page',$show);
$this->display();
在html添加:
<div class="Pagination">{$page}</div>
添加css样式:
.Pagination a:hover,.current{background-color: #50A8E6;border: 1px solid #f54281;color: #ffffff; }
.Pagination{float: right;height: auto;_height: 45px; line-height: 20px;margin-right: 15px;_margin-right: 5px; color:#565656;margin-top: 10px;_margin-top: 20px; clear:both;}
.Pagination a,.Pagination span{ font-size: 14px;text-decoration: none;display: block;float: left;color: #565656;border: 1px solid #ccc;height: 34px;line-height: 34px;margin: 0 2px;width: 34px;text-align: center;}
b、精美样式
效果图:
先封装getpage函数,将这个方法放到Application\Common\Common\function.php中方便其他地方调用,代码如下:
<?php
function getpage($count, $pagesize = 10) {
$p = new Think\Page($count, $pagesize);
$p->setConfig('header', '<li class="rows">共<b>%TOTAL_ROW%</b>条记录 第<b>%NOW_PAGE%</b>页/共<b>%TOTAL_PAGE%</b>页</li>');
$p->setConfig('prev', '上一页');
$p->setConfig('next', '下一页');
$p->setConfig('last', '末页');
$p->setConfig('first', '首页');
$p->setConfig('theme', '%FIRST%%UP_PAGE%%LINK_PAGE%%DOWN_PAGE%%END%%HEADER%');
$p->lastSuffix = false; //最后一页不显示为总页数
return $p;
}
?>
控制器中使用的代码如下:
public function showAllUsers() {
$m = M('User');
$where = "id>10";
$count = $m->where($where)->count();
$p = getpage($count,10); //调用自定义分页函数,传入参数
$show = $p->show(); // 分页显示输出
$list = $m->field(true)->where($where)->order('id')->limit($p->firstRow, $p->listRows)->select(); // 进行分页数据查询 注意limit方法的参数要使用Page类($p)的属性
$this->assign('list', $list);
$this->assign('page',$show);
$this->display();
}
接下来在View中的使用:
<style>
.pages a, .pages span { display: inline-block; padding: 2px 5px; margin: 0 1px; border: 1px solid #f0f0f0; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; }
.pages a, .pages li { display: inline-block; list-style: none; text-decoration: none; color: #58A0D3; }
.pages a.first, .pages a.prev, .pages a.next, .pages a.end { margin: 0; }
.pages a:hover { border-color: #50A8E6; }
.pages span.current { background: #50A8E6; color: #FFF; font-weight: 700; border-color: #50A8E6; }
</style>
<div class="pages">{$page}</div>
9、在HTML中截取字数
{$vv['title']|substr=0,15}<if condition="strlen($vv['title']) gt 15">...</if>//从下标0位置开始向右截取15个字母,汉字相应转换个数,如果大于15则加…
或:
<volist name='type' id='vo'>
<p>{$vo['name']}</p>
<ul>
<volist name="vo['vv']" id='vc'>
<li>
<a href="#{$vc['subid']}"><img src="__IMG__/side_li.gif" />
<?php
if(mb_strlen($vc['subname'], 'utf-8') > 6){ //mb_strlen($str, 'utf-8')可使每个中英文及符号只算一个字符
?>
{$vc['subname']|mb_substr=0, 6, 'utf-8'} ...
<?php
}else{
?>
{$vc['subname']}
<?php
}
?>
</a>
</li>
</volist>
</ul>
</volist>
10、thinkPHP中多表联合查询(下例为3表联合查询)
$list = $message->join('user on message.userid=user.id')->join('article on message.wid=article.wid')->order('message.mid desc')->limit($Page->firstRow.','.$Page->listRows)->select();
11、验证码显示及检测
html中:
<form action="{:U('Index/jc')}" method="post">
<div><input type="text" class="username" name="username"/></div>
<div><input type="text" class="pwd" name="pwd"></div>
<input type="text" class="verify" name="verify"/>
<img src="{:U('Index/yzm')}" onClick="this.src=this.src+'?id='+Math.random()" width="80" height="40">
<input type="submit" name="submit" value="登 录">
</form>
controller中:
//验证码
public function yzm(){
$config = array (
'fontSize' => 25, // 验证码字体大小
'length' => 4, // 验证码位数
'imageW' => 200,
'imageH' => 50,
'useNoise' => false, // 关闭验证码杂点
'useCurve' => false,
'bg' => array(235,235,235), //背景色
);
ob_clean();//不加可能会在上传服务器后不显示
$verify = new \Think\Verify($config);
$verify->fontttf='simkai.ttf'; //字体文件
$verify->useZh=true; //打开中文
$verify -> entry(); //默认为空,同一页有多个验证码时,需标明1、2、3等
}
//检测验证码
public function jc(){
$data['username']=I('username');
$data['pwd']=I('pwd');
$verify=I('verify'); //获取验证码
$rel=M('username')->find($data); //数据库查找匹配信息
$aa=new \Think\Verify();
$aa->check($verify);
if($verify){ //判断验证码
if($rel['userid']){ //判断用户名及密码
$_SESSION['username']=$rel['username']; //保存用户名
$_SESSION['userid']=$rel['userid']; //保存userid值
$this->success('登录成功',U('Index/index'),2);
}else{
$this->error('用户名或密码错误,请重新登陆');
}
}else{
$this->error('验证码错误');
}
}
12、循环输出外部链接的两种方法(否则会带有localhost/xxx/index.php/Home/index/www.xxx.com)
13、登录某个模块的路径(域名/index.php/模块名)
登录后台:域名/index.php/admin
登录前台:域名/index.php/home,登录前台可简写成:域名,即可
登录Home1模块:域名/index.php/home1
14、如何将多维数组$ data变成一维数组$ user
$data=M('user')->field('name')->select();
php版本大于5.5.0时用:
$user = array_column($data,'name');
php版本大于5.4.0且小于5.5.0时用:
$user = array_map(function($item){return $item['name'];},$data);
php版本小于5.4.0时用for循环。
还没有评论,来说两句吧...