目录结构

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写了,后来发现了更加简便的方法。

代码是这样的:

 <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汇总[更新]的更多相关文章

  1. 【Asp.Net】小BUG汇总[更新]

    目录结构 1.Dictionary<T>遍历 2.Asp.net网站部署在C盘无法上传下载文件 3.Asp.Net网站发布后远程无法访问 4.GDI+中发生一般性错误 1.Dictiona ...

  2. Ubuntu小点汇总,更新中...

    转自:http://blog.csdn.net/zxz_tsgx/article/details/39713627 昨天重装了Ubuntu14.04 64位版,又被一些基础操作/设置给搞怕了,以前安装 ...

  3. JDK小Bug汇总

    Java官方的Logger.getGlobal().info无效 无效代码 Logger.getGlobal().info("start"); 解决方案(三选一): Logger. ...

  4. Android与Asp.Net Web服务器的文件上传下载BUG汇总[更新]

    遇到的问题: 1.java.io.IOException: open failed: EINVAL (Invalid argument)异常,在模拟器中的sd卡创建文件夹和文件时报错 出错原因可能是: ...

  5. Glide图片加载框架小bug

    如上一段加载图片的代码,本身是没问题的,后来测试发现有情况不显示url对应的图片,而一直显示加载超时的图片 修改如下: 将with()方法的上下文context改为图片的imageView.getCo ...

  6. Fundebug前端JavaScript插件更新至1.8.2,修复2个小BUG

    摘要: 修复2个BUG,请大家及时更新. Fundebug前端异常监控服务 Fundebug是专业的程序异常监控平台,我们JavaScript插件可以提供全方位的异常监控,可以帮助开发者第一时间定位各 ...

  7. 攻城记:Thinkphp框架的项目规划总结和踩坑经验

    一.项目模块规划 1.项目分为PC端.移动端.和PC管理端,分为对应目录为 /Application/Home,/Application/Mobile,/Application/Admin: 对应入口 ...

  8. thinkphp 框架中的一部分方法解析

     1 thinkphp 框架 中判断输入的数值和数据库中的数值是否一致    首先 需要在view文件夹下建一个模板 名为zhuce.html <html> <head> &l ...

  9. 关于在BAE上部署ThinkPHP框架的问题

    现在有点小兴奋,因为在在BAE上部署ThinkPHP框架的问题快折腾一天了,午觉都没睡,不过没白整总算有点结果.不扯淡了,直入正题吧. 之前熟悉ThinkPHP框架,想在BAE上用ThinkPHP做点 ...

随机推荐

  1. php中用户自定义排序

    php中数组用户自定义排序函数有usort和uasort,前者键值重新排列,后者保持原数组的键值. 举例usrot: usort($filterArr, 'sortArr'); function so ...

  2. Linux下批量改动名字方法

    如果任务是把文件夹下全部的.log后缀文件名称中的2014去掉. 方法一) 脚本 这样的方法通过ls把当前文件夹下全部的文件进行遍历,然后获取文件名称,进行mv操作.例如以下: #!/bin/sh f ...

  3. 管道技巧-while read line

    http://blog.csdn.net/hunanchenxingyu/article/details/9998089

  4. Hibernate: Truly Understanding the Second-Level and Query Caches--reference

    I've written multiple articles here at Javalobby on the Hibernate O/R mapping tool, and they are usu ...

  5. Making Use of Forms and Fieldsets

    Making Use of Forms and Fieldsets So far all we have done is read data from the database. In a real- ...

  6. 浅谈iOS中的视图优化

    引言: 让我们来思考几个问题,你开发过的产品,它还有可以优化的地方吗?能增加它的帧率吗?能减少多余的CPU计算吗?是不是存在多余的GPU渲染?业务这点工作量对于越来越强大的设备面前显得微不足道,但作为 ...

  7. 多边形节点编码python脚本

    # -*- coding: cp936 -*-#本脚以最左边.Y值最大的点为起始点按顺时针为多边形节点编码,生成一个包含记录编码值和多边形FID字段的点要素类 #注意:#1.本脚本作为arcgis脚本 ...

  8. [转]oracle的ANYDATA数据类型

    本文转自:http://blog.csdn.net/yuzhenhuan01/article/details/6606106 ANYDATA数据类型是个有点奇特的类型,你可以把不同数据类型的数据通过转 ...

  9. [转]使用ADO.NET访问Oracle存储过程

    本文转自:http://www.cnblogs.com/datasky/archive/2007/11/07/952141.html 本文讨论了如何使用 ADO.NET 访问 Oracle 存储过程( ...

  10. 어느 도시 보유 하 면 사랑 이다(事態が発生すれば、ある都市の恋はしません)【Si les villes un amour】{If have love in a city}

    如果在北京拥有爱情 半夜在簋街喝啤酒 吃小龙虾 在后海的苦情歌声里 搂着你数那四合院的瓦片 如果在上海拥有爱情 去外滩手挽手 吹吹风 坐一下午 去城隍庙尝试各种小吃 嘲笑你嘴角残余的糯米糕 如果在杭州 ...