【PHP ThinkPHP框架】小bug汇总[更新]
目录结构
最近开始接触PHP编程语言,遇到各种小问题,不断总结,不断进步。由于一开始就用上了ThinkPHP框架,所以不知道和一般的PHP项目有什么区别。有待研究。
1.函数调用
可能是因为我比较菜鸟,刚开始学习编写PHP页面,还没有写控制器,在页面中调试的时候调用了dump()函数,我是这么写的:$dump($pageCount);结果报错了,错误是:php function name must be a string.
大神们别喷,实在是太菜了有木有。然后我改成了dump($pageCount);,错误解决了,原来是调用函数的时候不加'$'符号,看来不能盲目使用编程语言的特殊符号啊。
2.绑定select下拉框的数据
之前想了好久该怎么绑定,想着应该和C#差不多,可就是找不到好的办法,都差点用js写了,后来发现了更加简便的方法。
代码是这样的:
<select name="select1" id="select1">
<volist name="selectitems" id="row">
<option value="{$row.id}">{$row.title}</option>
</volist>
</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>
这块就不用再详细分析了,上面都说了,接下来就是写一个控制器,控制器中的代码如下:
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 内置的类库和文件导入方法,上例导入的文件为 ThinkPHP 系统目录下 Lib/ORG/Util/Image.class.php 文件。所以要保证这个目录下的文件存在,如果没有这个目录,创建一个,并且将完整版里面的Image.class.php文件拷贝到该目录下就可以使用了。
视图文件中只需要调用方法就能正常显示验证码了:
<img src="{:U('Public/verify')}" align="absmiddle" title="如果您无法识别验证码,请点图片更换" id="verifyImage" onclick=resetVerifyCode() />
<input type="text" name="verifyCode" id="verifyCode" size="8" maxlength="4" />
同时要写一个js脚本来实现点击图片刷新验证码的功能:
<script type="text/javascript" >
function resetVerifyCode(){
$("#verifyImage").attr('src', "{:U('Public/verify/',0,0,0)}/__"+ Math.random());
}
</script>
这里注意一个细节:路径里面在“{:U('Public/verify/',0,0,0)}/__”里,verify后面必须有一个“/”,或者写在"__"前面,这样"/__",而我这里为什么两个地方都写了呢,因为这里只在verify后面添加"/"出现一个问题,就是F5刷新界面的时候可以显示验证码无误,可是点击的时候刷新不出验证码,使用了页面调试发现错误是“加载指定URL失败”,问题就出在解析后的验证码路径中verify后面没有“/”,于是我就在“__”前面添加,这样问题就解决了。
9.ThinkPHP "NotFound"错误
刚部署PHP项目的时候不太了解URL生成和重写之类的知识,总是会出现如下错误:
Not Found
The requested URL /Public/login was not found on this server.
后来发现是URL_MODEL设置问题,一般设置成1就不会有问题,设置为其他会出现问题,这个不知道是为什么,有待解决,先记录在这。
10.字符串处理的一些常用函数
<1>.trim():将字符串末尾的逗号去掉
trim($string,',');
<2>.strstr():返回字符串中,逗号出现的位移量,如果没有出现逗号则返回false
$index=strstr($string,',');
<3>.explode():将字符串用‘-’分开返回一个数组,类似于split()
explode("-",$string);
<4>.array_intersect($array1,$array2):返回两个数组中相同的部分,求交集
$sameitems=array_intersect($array1,$array2);
<5>.array_diff():返回两个数组的差集
$different=array_diff($array1,$array2);
<6>.str_replace('a','b',$str):将字符串$str中的a换成b
$str=str_replace('a','b',$str);
11.单引号和双引号
在PHP中,单引号和双引号的处理是不相同的,双引号中的内容可以被解释和替换,而单引号中的内容总被认为是普通字符。
比如:
$str = 7;
echo "str is $str"; // 打印结果: str is 7
echo 'str is $str'; // 打印结果: str is $str
echo "str is $str\n"; // 打印结果: str is 7 (同时换行)
echo 'str is $str\n'; // 打印结果: str is $str\n
所以在某些函数,比如str_replace()中需要使用双引号,这样才能正确替换字符串。
【PHP ThinkPHP框架】小bug汇总[更新]的更多相关文章
- 【Asp.Net】小BUG汇总[更新]
目录结构 1.Dictionary<T>遍历 2.Asp.net网站部署在C盘无法上传下载文件 3.Asp.Net网站发布后远程无法访问 4.GDI+中发生一般性错误 1.Dictiona ...
- Ubuntu小点汇总,更新中...
转自:http://blog.csdn.net/zxz_tsgx/article/details/39713627 昨天重装了Ubuntu14.04 64位版,又被一些基础操作/设置给搞怕了,以前安装 ...
- JDK小Bug汇总
Java官方的Logger.getGlobal().info无效 无效代码 Logger.getGlobal().info("start"); 解决方案(三选一): Logger. ...
- Android与Asp.Net Web服务器的文件上传下载BUG汇总[更新]
遇到的问题: 1.java.io.IOException: open failed: EINVAL (Invalid argument)异常,在模拟器中的sd卡创建文件夹和文件时报错 出错原因可能是: ...
- Glide图片加载框架小bug
如上一段加载图片的代码,本身是没问题的,后来测试发现有情况不显示url对应的图片,而一直显示加载超时的图片 修改如下: 将with()方法的上下文context改为图片的imageView.getCo ...
- Fundebug前端JavaScript插件更新至1.8.2,修复2个小BUG
摘要: 修复2个BUG,请大家及时更新. Fundebug前端异常监控服务 Fundebug是专业的程序异常监控平台,我们JavaScript插件可以提供全方位的异常监控,可以帮助开发者第一时间定位各 ...
- 攻城记:Thinkphp框架的项目规划总结和踩坑经验
一.项目模块规划 1.项目分为PC端.移动端.和PC管理端,分为对应目录为 /Application/Home,/Application/Mobile,/Application/Admin: 对应入口 ...
- thinkphp 框架中的一部分方法解析
1 thinkphp 框架 中判断输入的数值和数据库中的数值是否一致 首先 需要在view文件夹下建一个模板 名为zhuce.html <html> <head> &l ...
- 关于在BAE上部署ThinkPHP框架的问题
现在有点小兴奋,因为在在BAE上部署ThinkPHP框架的问题快折腾一天了,午觉都没睡,不过没白整总算有点结果.不扯淡了,直入正题吧. 之前熟悉ThinkPHP框架,想在BAE上用ThinkPHP做点 ...
随机推荐
- Debian Linux下如何以root账号登录桌面
I Debian Linux 方法有两种,一是图形界面方式设置,一是命令行设置: A. 图形界面方式: GNOME桌面下:打开“系统主菜单“,选择”系统>系统管理>登录窗口”,在弹出的窗口 ...
- mysqldump 的一些使用参数
备份数据库#mysqldump 数据库名 >数据库备份名 #mysqldump -A -u用户名 -p密码 数据库名>数据库备份名 #mysqldump -d -A --add-drop- ...
- php验证字符串长度问题
C:\Users\Administrator>php -r "echo strlen('你好')";4C:\Users\Administrator>php -r &qu ...
- JavaScript网站设计实践(三)设计有特色的主页,给主页链接添加JavaScript动画脚本
一.主页一般都会比较有特色,现在在网站设计(二)实现的基础上,来给主页添加一点动画效果. 1.这里实现的动画效果是:当鼠标悬停在其中某个超链接时,会显示出属于该页面的背景缩略图,让用户知道这个链接的页 ...
- error “base class has incomplete type”
error "base class has incomplete type" 如果base.h是你的基类,那么在子类derive中,写成如下形式: class base; clas ...
- CreateToolhelp32Snapshot
CreateToolhelp32Snapshot CreateToolhelp32Snapshot函数为指定的进程.进程使用的堆[HEAP].模块[MODULE].线程[THREAD])建立一个快照[ ...
- iOS 开发中你是否遇到这些经验问题(一)
前言 小伙伴们在开发中难免会遇到问题, 你是如何解决问题的?不妨也分享给大家!如果此文章其中的任何一条问题对大家有帮助,那么它的存在是有意义的! 反正不管怎样遇到问题就要去解决问题, 在解决问题的同时 ...
- 优化sql,返回行数少情况下,NL比hash快好多
sql如下 select t.id, t.value, tt.sort as sortno from ENGINEERING_TYPE t left join ENGINEERING_TYPE tt ...
- CSS3——选项卡切换
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 如何在ios手机端的Safari浏览器 中“查看网页源代码”
在这里给大家分享一个很简单的用苹果手机无需越狱就可以查看网页源代码的方法,不过这个方法只用于苹果手机自带的Safari浏览器 随便添加一个safari 书签 (用于一会改为查看源码功能书签)进入书签 ...