·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> 网站建设开发 >> php网站开发 >> 【PHP ThinkPHP框架】小bug汇总[更新]

【PHP ThinkPHP框架】小bug汇总[更新]

作者:佚名      php网站开发编辑:admin      更新时间:2022-07-23
【php ThinkPHP框架】小bug汇总[更新]

目录结构

1.函数调用

2.绑定select下拉框数据

3.PHP查询功能

4.格式化时间和价钱

5.IF标签比较两个变量

6.eq标签比较两个变量

7.新增信息或者修改信息的自动验证和自动填充

8.验证码

9.NotFound

10.字符串处理函数

11.单引号和双引号

最近开始接触PHP编程语言,遇到各种小问题,不断总结,不断进步。由于一开始就用上了ThinkPHP框架,所以不知道和一般的PHP项目有什么区别。有待研究。

1.函数调用

可能是因为我比较菜鸟,刚开始学习编写PHP页面,还没有写控制器,在页面中调试的时候调用了dump()函数,我是这么写的:$dump($pageCount);结果报错了,错误是:php function name must be a string.

大神们别喷,实在是太菜了有木有。然后我改成了dump($pageCount);,错误解决了,原来是调用函数的时候不加'$'符号,看来不能盲目使用编程语言的特殊符号啊。

2.绑定select下拉框的数据

之前想了好久该怎么绑定,想着应该和C#差不多,可就是找不到好的办法,都差点用js写了,后来发现了更加简便的方法。

代码是这样的:

1 <select name="select1" id="select1">2      <volist name="selectitems" id="row">3             <option value="{$row.id}">{$row.title}</option>4      </volist>5 </select>

其中volist标签中的selectitems是控制器中从数据库取出的数据列表,在控制器中赋值给selectitems,然后直接循环绑定到option,很简单有木有。

3.PHP查询功能

终于能成功查询了,费了不少劲儿。发现其实比较简单,只是刚开始接触,不懂很多语法规则之类的,光写一个sql语句解析都写了半天。具体功能很简单,就是在首页做一个查询功能,一个下拉列表选择模块,一个文本框输入关键字,一个按钮进行查询:

<form id="form1" method="POST" action="{:U('Search/index')}" name="form1">      <span class="sbfont">搜索栏目:</span>      <select name="select1" id="select1" onchange=setSelectedID()>          <option value="-1">=请选择=</option>          <volist name="selectitems" id="row">              <option value="{$row.id}">{$row.title}</option>          </volist>       </select>        <span>关键字:</span><input name="search" type="text" size="30"/>        <input name="submit" type="submit" value=""/>        <input type="hidden" id="selectedID" name="selectedID"/></form><script type="text/javascript">      function setSelectedID(){           var selector=document.getElementById("select1");           var selectedID=document.getElementById("selectedID");           for(var i=0;i<selector.options.length;i++)           {                if(selector.options[i].selected)                 {                      selectedID.value=selector.options[i].value;                      break;                 }           }}</script>
View Code

这块就不用再详细分析了,上面都说了,接下来就是写一个控制器,控制器中的代码如下:

public function index()    {        $searchs=$_POST['search'];//接收post传来的参数        $selectedID=$_POST['selectedID'];//同传参数        $condition['category_id']=array('eq',$selectedID);//定义查询规则        $condition['title']=array('like','%'.$searchs.'%');        $resultList=$this->dao->where($condition)->select();//查询数据集        $this->assign('searchResultList',$resultList);//赋值        $this->display();    }

控制器查询出数据并且已经保存好了,接下来就是视图显示了,视图只需要将保存好的查询结果数据集显示出来就好了:

<volist name="searchResultList" id="row">   <li>      <span>{$row.create_time|date="Y-m-d",###}</span>      <a href="{$row.link_url}" target="_blank">{$row.title}</a>   </li> </volist>

好了,纠结了一整天的查询功能就分分钟做好了。

4.格式化时间和价钱

价钱格式化:{$p.sale|number_format=###, 2, '.', ''} 两位有效数字

时间格式化:{$p.time|date='Y-m-d H:i:s',###} 年月日时分秒

5.IF标签比较两个变量

<if condition="$row.name eq $col['name']"> ==需要的操作==</if>

6.eq标签比较两个变量
<eq name=”item.group_id” value=”$one.group_id”> 这里注意name不带$,value带$.

7.新增信息或者修改信息的自动验证和自动填充

自动验证部分是框架自带的验证,需要在项目的lib目录下Model文件夹里创建一个和需要验证的数据所在数据表同名的类文件,说简单了就是这个类的名字需要和我们添加或者修改数据的表的名字一致,比如,表的名字是think_user,类的名字就是UserModel.class.php。这里需要说一句题外话,如果表的名字和Model类名字不一致,需要在类里面声明表名:

PRotected $tableName = 'think_user';  //这里的think_user就是数据表的名称

这个类里面写验证信息,当Action类当中调用了create()方法的时候就会进行自动验证了,具体验证的写法如下:

<?php class UserModel extends Model {    //自动验证    protected $_validate = array(        array('username','require','请输入用户名'),       //用户名必须输入        array('username', '', '用户已存在', 0,'unique',1),    //用户名唯一性验证        array('passWord', 'require', '登录密码必填', 1),       //密码必须        array('PID','^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$','请填入正确的身份证号',1),       //身份证号验证        array('address','require','地址必须填',1),          //地址必须        array('cellphone','number','手机号为11位数字',1),        //手机号        array('email','email','Email格式不符合',1),      //Email格式        array('telephone','\d{3}-\d{8}|\d{4}-\{7,8}','电话格式不正确',1),   //国内电话号        array('repassword','password','确认密码不正确',0,'confirm'),    //确认密码是否正确    );   //自动填充   protected $_auto=array( array('create_time','time','doRegist','function'), //在增加时自动将时间擢填入表中 );}?>

这里有一点需要注意,官方文档中有这么一句话:如果定义了字段映射的话,这里的验证字段名称应该是实际的数据表字段而不是表单字段。

Action中要这样写:

$user=D('User');   //实例化Model类        $daoCreate=$user->create();   //创建新增数据的model   验证在这时候就起作用了        if($daoCreate)        {            $daoAdd = $user->add();            if(false != $daoAdd){                ....  //成功            }            else{                ....  //失败            }        }else{            exit($user->getError());   //输出验证结果        }

View当中就写需要添加的数据就行了,这样:

        <form method="post" action="{:U('Public/doRegist')}">            <table>                <tr>                    <td><label>用户名:</label></td>                    <td><input type="text" name="username" id="username"/></td>                </tr>                <tr>                    <td><label>密  码:</label></td>                    <td><input type="password" name="password" id="password"/></td>                </tr>                <tr>                    <td><label>确认密码:</label></td>                    <td><input type="password" name="repassword" id="repassword"/></td>                </tr>                <tr>                    <td><label>身份证号:</label></td>                    <td><input type="text" name="PID" id="PID" maxlength="18"/></td>                </tr>                <tr>                    <td><label>地址:</label></td>                    <td><input type="text" name="address" id="address"/></td>                </tr>                <tr>                    <td><label>手机号:</label></td>                    <td><input type="text" name="cellphone" id="cellphone" maxlength="11"/></td>                </tr>                <tr>                    <td><label>Email:</label></td>                    <td><input type="text" name="email" id="email"/></td>                </tr>                <tr>                    <td><label>电话:</label></td>                    <td><input type="text" name="telephone" id="telephone"/></td>                </tr>                <tr>                    <td></td>                    <td>                        <input  type="submit" id="submit" value="注册"/>                    </td>                </tr>            </table>        </form>
8.验证码

我现在用的是3.1.3版本的TP,框架不是完整版,所以我又从完整版里面拷贝了一个Extend文件夹替换了现在这个,因为所有扩展包都在完整版里面有。

要实现验证码功能,只需要在控制器内添加一个生成验证码的方法即可:

public function verify() {        import('ORG.Util.Image');        ob_end_clean();  //很关键,如果Image.class.php文件里的output方法中没有调用ob_clean();方法,那么这里需要写,可以防止出现“载入指定URL失败”的错误        Image::buildImageVerify();    }

import 方法是 ThinkPHP 内置的类库和文件