Thinkphp3.2.3框架学习笔记

╰+攻爆jí腚メ 2022-02-23 07:06 631阅读 0赞

1、create()自动获取数据,且比I()、$ _GET()、$ _POST()等获取安全
create方法可以对POST提交的数据进行处理,不用$ _POST[‘cpname’]去接收(通过表中的字段名称与表单提交的名称对应关系自动封装数据实例)。

  1. D('reg')->create(); //给表添加信息,html中name的值必须与数据库表的字段名一致
  2. $user->add($data); //必须添加到数据库

2、php如何获得多个相同name提交的值并保存到数据库
在表单中,做一个数组字段,如
接收数据时:$ array=$ _POST[“name”];
变量$array就是一个包含了多个相同name值的数组。
如:
HTML中代码:

  1. <form method="post" action="{:U('Cp/cp_type_check')}" enctype="multipart/form-data">
  2. <ul>
  3. <volist name="rel" id="vo">
  4. <li>
  5. <input type="text" name="name[]" value="{$vo.name}"/>
  6. <input type="hidden" name='typeid[]' value="{$vo.typeid}"/>
  7. <input type="text" name="sno[]" value="{$vo.sno}"/>
  8. </li>
  9. </volist>
  10. <li>
  11. <input type="submit" class="btn" value="批量修改"/>
  12. </li>
  13. </ul>
  14. </form>

Controller中代码:

  1. public function cp_type_check(){
  2. $typeid=I('typeid');
  3. $name=I('name');
  4. $sno=I('sno');
  5. $len=count($name);
  6. for($i=0;$i<$len;$i++){
  7. $data['typeid']=$typeid[$i];
  8. $data['name']=$name[$i];
  9. $data['sno']=$sno[$i];
  10. M('cp_type')->save($data);
  11. }
  12. $this->success('批量修改成功',U('Cp/cp_type'),2);
  13. }

3、包含文件的2中写法

  1. <include file="Include:header,Include:footer" /> //包含多个文件用,隔开
  2. <include file="Include/header" /> //包含单个文件

4、四维循环输出(按类型循环输出)
Html中:

  1. <volist name="bb" id="vo">
  2. <span>{$vo['name']}</span>
  3. <volist name="vo['vv']" id="vx">
  4. <ul>
  5. <li><span>{$vx['title']}</span></li>
  6. </ul>
  7. </volist>
  8. </volist>

Controller:

  1. $bb=M('template_type')->select();
  2. //循环新建4维数组
  3. foreach($bb as $key=>$val){
  4. $bb[$key]['vv']=M('template')->where('type='.$val['tid'])->select();//将查询到的内容赋予template _type表的新字段vv,'type='.$val['tid']用于2表关联
  5. }
  6. $this->assign('bb',$bb);
  7. $this->display();

5、模糊搜索关键词(html中搜索表单要用get方式提交,否则搜索结果点击下一页会显示未搜索状态)

  1. public function index(){
  2. if(IS_POST){ //如果有传值,则
  3. $name=I('search'); //获取搜索词
  4. $data['cpname']=array('like',"%".$name."%");//在产品名中模糊查询搜索词,%表示$name之前之后可有可无字符串
  5. $list=M('cp')->where($data)->select(); //查询具有搜索词的产品
  6. foreach($list as $key=>$val){ //替换函数修改搜索词在输出产品中产品名的式样
  7. $list[$key]['cpname']=str_replace($name,"<font color='red'>".$name."</font>",$val['cpname']);
  8. }
  9. $this->list=$list;
  10. }else{ //如果没传值,则
  11. $this->list=M('cp')->select();
  12. }
  13. $this->display();
  14. }

6、数组比直接数据安全(防SQL注入攻击)
如:

  1. M(‘list’)->where(id=1)->add(); //不安全
  2. $data[‘id’]=1;
  3. $data[‘name’]=’aliyun’;
  4. M(‘list’)->where($data)->add(); //安全

7、$ this->assign(‘list’,$ list)比$ this->list=$ list更安全

8、page分页类样式
a、简单样式
效果如下:

在这里插入图片描述

使用thinkphp自带的page分页,无需重写page.class,直接添加css样式即可。
控制器中:

  1. $User = M('User'); // 实例化User对象
  2. $count = $User->where('status=1')->count(); // 查询满足要求的总记录数
  3. $Page = new \Think\Page($count,10); // 实例化分页类 传入总记录数和每页显示的记录数(10)
  4. $show = $Page->show(); // 分页显示输出
  5. $list =$User->where('status=1')->order('create_time')->limit($Page->firstRow.','.$Page->listRows)->select(); // 进行分页数据查询 注意limit方法的参数要使用Page类的属性
  6. $this->assign('list',$list);
  7. $this->assign('page',$show);
  8. $this->display();

在html添加:

  1. <div class="Pagination">{$page}</div>

添加css样式:

  1. .Pagination a:hover,.current{background-color: #50A8E6;border: 1px solid #f54281;color: #ffffff; }
  2. .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;}
  3. .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中方便其他地方调用,代码如下:

  1. <?php
  2. function getpage($count, $pagesize = 10) {
  3. $p = new Think\Page($count, $pagesize);
  4. $p->setConfig('header', '<li class="rows">共<b>%TOTAL_ROW%</b>条记录 第<b>%NOW_PAGE%</b>页/共<b>%TOTAL_PAGE%</b>页</li>');
  5. $p->setConfig('prev', '上一页');
  6. $p->setConfig('next', '下一页');
  7. $p->setConfig('last', '末页');
  8. $p->setConfig('first', '首页');
  9. $p->setConfig('theme', '%FIRST%%UP_PAGE%%LINK_PAGE%%DOWN_PAGE%%END%%HEADER%');
  10. $p->lastSuffix = false; //最后一页不显示为总页数
  11. return $p;
  12. }
  13. ?>

控制器中使用的代码如下:

  1. public function showAllUsers() {
  2. $m = M('User');
  3. $where = "id>10";
  4. $count = $m->where($where)->count();
  5. $p = getpage($count,10); //调用自定义分页函数,传入参数
  6. $show = $p->show(); // 分页显示输出
  7. $list = $m->field(true)->where($where)->order('id')->limit($p->firstRow, $p->listRows)->select(); // 进行分页数据查询 注意limit方法的参数要使用Page类($p)的属性
  8. $this->assign('list', $list);
  9. $this->assign('page',$show);
  10. $this->display();
  11. }

接下来在View中的使用:

  1. <style>
  2. .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; }
  3. .pages a, .pages li { display: inline-block; list-style: none; text-decoration: none; color: #58A0D3; }
  4. .pages a.first, .pages a.prev, .pages a.next, .pages a.end { margin: 0; }
  5. .pages a:hover { border-color: #50A8E6; }
  6. .pages span.current { background: #50A8E6; color: #FFF; font-weight: 700; border-color: #50A8E6; }
  7. </style>
  8. <div class="pages">{$page}</div>

9、在HTML中截取字数

  1. {$vv['title']|substr=0,15}<if condition="strlen($vv['title']) gt 15">...</if>//从下标0位置开始向右截取15个字母,汉字相应转换个数,如果大于15则加…

或:

  1. <volist name='type' id='vo'>
  2. <p>{$vo['name']}</p>
  3. <ul>
  4. <volist name="vo['vv']" id='vc'>
  5. <li>
  6. <a href="#{$vc['subid']}"><img src="__IMG__/side_li.gif" />
  7. <?php
  8. if(mb_strlen($vc['subname'], 'utf-8') > 6){ //mb_strlen($str, 'utf-8')可使每个中英文及符号只算一个字符
  9. ?>
  10. {$vc['subname']|mb_substr=0, 6, 'utf-8'} ...
  11. <?php
  12. }else{
  13. ?>
  14. {$vc['subname']}
  15. <?php
  16. }
  17. ?>
  18. </a>
  19. </li>
  20. </volist>
  21. </ul>
  22. </volist>

10、thinkPHP中多表联合查询(下例为3表联合查询)

  1. $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中:

  1. <form action="{:U('Index/jc')}" method="post">
  2. <div><input type="text" class="username" name="username"/></div>
  3. <div><input type="text" class="pwd" name="pwd"></div>
  4. <input type="text" class="verify" name="verify"/>
  5. <img src="{:U('Index/yzm')}" onClick="this.src=this.src+'?id='+Math.random()" width="80" height="40">
  6. <input type="submit" name="submit" value="登 录">
  7. </form>

controller中:

  1. //验证码
  2. public function yzm(){
  3. $config = array (
  4. 'fontSize' => 25, // 验证码字体大小
  5. 'length' => 4, // 验证码位数
  6. 'imageW' => 200,
  7. 'imageH' => 50,
  8. 'useNoise' => false, // 关闭验证码杂点
  9. 'useCurve' => false,
  10. 'bg' => array(235,235,235), //背景色
  11. );
  12. ob_clean();//不加可能会在上传服务器后不显示
  13. $verify = new \Think\Verify($config);
  14. $verify->fontttf='simkai.ttf'; //字体文件
  15. $verify->useZh=true; //打开中文
  16. $verify -> entry(); //默认为空,同一页有多个验证码时,需标明1、2、3等
  17. }
  18. //检测验证码
  19. public function jc(){
  20. $data['username']=I('username');
  21. $data['pwd']=I('pwd');
  22. $verify=I('verify'); //获取验证码
  23. $rel=M('username')->find($data); //数据库查找匹配信息
  24. $aa=new \Think\Verify();
  25. $aa->check($verify);
  26. if($verify){ //判断验证码
  27. if($rel['userid']){ //判断用户名及密码
  28. $_SESSION['username']=$rel['username']; //保存用户名
  29. $_SESSION['userid']=$rel['userid']; //保存userid值
  30. $this->success('登录成功',U('Index/index'),2);
  31. }else{
  32. $this->error('用户名或密码错误,请重新登陆');
  33. }
  34. }else{
  35. $this->error('验证码错误');
  36. }
  37. }

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

  1. $data=M('user')->field('name')->select();

php版本大于5.5.0时用:

  1. $user = array_column($data,'name');

php版本大于5.4.0且小于5.5.0时用:

  1. $user = array_map(function($item){return $item['name'];},$data);

php版本小于5.4.0时用for循环。

发表评论

表情:
评论列表 (有 0 条评论,631人围观)

还没有评论,来说两句吧...

相关阅读

    相关 THINKPHP框架配置

    1,首先在ThinkPHP的官网上下载THINKPHP所需要的资源包。 2,下载后解压要appache的服务器下的根目录下。 3,然后再项目的index.php中加入req

    相关 thinkphp笔记

    最近做的一个项目使用thinkphp3.2做的。这里总结一下    更新数据可以用$data\[''\],save之前一定要写where条件。不然是不能入库的    已一个

    相关 Thinkphp学习笔记

    Thinkphp中项目配置共享全局配置: 因为项目中的配置返回的是一个数组,所以只要和全局的配置文件中的数组合并就好了 <?php $config = array();

    相关 thinkPHP框架

    安装ThinkPHP的方法很多,你可以直接到[ThinkPHP的官网][ThinkPHP]去下载,下载完之后直接解压就可以了;或者你也可以到ThinkPHP官方维护的Git地址