一,常用的系统变量
(1)系统变量:在模板中输出系统变量:包括server、env、session、post、get、request、cookie
{$Think.server.script_name} // 输出$_SERVER变量
{$Think.session.session_id|md5} // 输出$_SESSION变量
{$Think.get.pageNumber} // 输出$_GET变量
{$Think.cookie.name} // 输出$_COOKIE变量
以上方式还可以写成:
{$_SERVER.script_name} // 输出$_SERVER变量
{$_SESSION.session_id|md5} // 输出$_SESSION变量
{$_GET.pageNumber} // 输出$_GET变量
{$_COOKIE.name} // 输出$_COOKIE变量
系统常量 :使用$Think.const 输出
注意:server、cookie、config不区分大小写,但是变量区分大小写。例如:
{$Think.server.script_name}和{$Think.SERVER.script_name}等效
SESSION 、COOKIE还支持二维数组的输出
例如:
{$Think.CONFIG.user.user_name}
{$Think.session.user.user_name}
系统不支持三维以上的数组输出。
(2)语言变量:输出项目的当前语言定义值
{$Think.lang.page_error}
{$Think.const.MODULE_NAME}
或者直接使用
{$Think.MODULE_NAME}
(3)特殊变量 :由ThinkPHP系统内部定义的常量
{$Think.version} //版本
{$Think.now} //现在时间
{$Think.template|basename} //模板页面
{$Think.LDELIM} //模板标签起始符号
{$Think.RDELIM} //模板标签结束符号
(4)配置参数 :输出项目的配置参数值
{$Think.config.db_charset}
输出的值和 C("db_charset") 的结果是一样的。
(5)thinkphp 的系统常量(注意以下常量也可以直接在 action 控制器中直接使用)
__ROOT__ // 网站根目录地址
__APP__ // 当前项目(入口文件)地址
__URL__ // 当前模块地址
__ACTION__ // 当前操作地址
__SELF__ // 当前 URL 地址
__PUBLIC__ // 网站公共目录
二,查询技巧
一、带where条件的普通查询
1、字符串形式
$user=M("user");
$list=$user->where("id>5 and id<9")->select();
$list=$user->where($data)->select();
2、数组形式
代码如下$user=M("user");
$list=$user->where(array("username"=>"www.111cn.Net"))->select();
$list=$user->where($data)->select();
3、对象形式
代码如下$user=M("user");
$a=new stdClass();
$a->username="www.111cn.Net";
$list=$user->where($a)->select();
4、查询表达式
EQ 等于
NEQ 不等于
GT 大于
EGT 大于等于
LT 小于
ELT 小于等于
LIKE 等价与sql中的like
[NOT] BETWEEN 查询区间
[NOT] IN 查询集合
EXP 指使用标准SQL语句,实现更加复杂的情况
语法格式:$data["字段名"]=array("是表达式","查询条件");
例如
$data["username"]="www.111cn.Net";
实际上是指
代码如下$data["username"]=array("eq","www.111cn.Net");
$data["username"]=array("like","peng%");
$list=$user->where($data)->select();
$data["username"]=array(array("like","p%"),array("like","h%"),"or");
$list=$user->where($data)->select();
二、区间查询
代码如下$user=M("user");
$data["id"]=array(array("gt",20),array("lt",23),"and");
$list=$user->where($data)->select();
三、组合查询
代码如下$user=M("user");
$data["username"]="pengyanjie";
$data["password"]=array("eq","pengyanjie");
$data["id"]=array("lt",30);
$data["_logic"]="or";
$list=$user->where($data)->select();
dump($list);
四、复合查询
代码如下$user=M("user");
$data["username"]=array("eq","pengyanjie");
$data["password"]=array("like","p%");
$data["_logic"]="or";
$where["_complex"]=$where;
$where["id"]=array("lt",30);
$list=$user->where($data)->select();
相当于
(id<30) and ((username=pengyanjie) or (password like p%))
五、统计查询
代码如下echo $user->count();
echo "
";
echo $user->max("id");
echo "
";
echo $user->where("id<30")->min("id");
echo "
";
echo $user->avg("id");
echo "
";
echo $user->sum("id");
六、定位查询
代码如下$user=new AdvModel("user");//实例化高级模型AdvModel
//$user=M("user","CommonModel");//或者将AdvModel用CommonModel来继承
$list=$user->order("id desc")->getN(2);//返回结果中的第三条
$list=$user->order("id desc")->last();//返回最后一条
$list=$user->order("id desc")->first();//返回第一条
七、SQL查询
excute()主要用于更新和写入
代码如下$Model=new Model() // 实例化一个 model 对象,没有对应任何数据表
$Model->execute("update think_user set name="thinkPHP" where status=1");
query()主要用于查询
代码如下$user=M();
$list=$user->query("select * from aoli_user order by id desc");
dump($list);
八、动态查询
代码如下$user=M("user");
$list=$user->getByusername("pengyanjie");
$list=$user->getByusername("pengyanjie");
$user=new AdvModel("user");
$list=$user->top5();//前5条
三,内置模板引擎的使用方法总结
(1)下面是控制器 IndexAction 类的源码
代码如下
class IndexAction extends Action{
public function index() {
$_SESSION["name"] = "ThnkPHP Session";
$vo = array("id"=>1,"name"=>"ThinkPHP","email"=>"liu21st@gmail.com");
$this->assign("vo",$vo);
$obj = (object)$vo;
$this->assign("obj",$obj);
$this->assign("array",array(5,260,13,7,40,50,2,1));
$this->assign("num1",6);
$this->assign("num2",2);
$this->assign("num",6);
$this->display();
}
}
?>
(2)以下演示的是上面控制器赋值到模板中的一些变量,常量以及数组的一些基础性用法
普遍变量输出
代码如下num1:{$num1}
对象输出
代码如下id:{$obj:id}
name:{$obj:name}
数组输出
代码如下id:{$vo["id"]}
name:{$vo["name"]}
自动判断数组和对象输出
代码如下id:{$vo.id}
name:{$vo.name}
系统常量输出(系统常量可以不用在控制器中使用 assign 赋值)
代码如下{$Think.now|date="Y-m-d H:i:s",###}
{$Think.server.PHP_SELF}
{$Think.session.name}
对变量使用函数(这里可以是内置函数或者自定义函数)
{$vo.name|strtolower|ucwords}
Foreach 输出
{$key}:{$item}
下面这个例子使用了循环标签、Switch标签、比较标签
代码如下
[{$i}]
{$val}大于15
{$val}小于10
输出结果类似为:
[1] 奇数行 5小于10 长度为1
[2] 偶数行 260大于5 260大于15 长度为3
[3] 奇数行 13大于5 长度为2
[4] 偶数行 7大于5 7小于10 长度为1
[5] 奇数行 40大于5 40大于15 长度为2
[6] 偶数行 50大于5 50大于15 长度为2
[7] 奇数行 2小于10 长度为1
[8] 偶数行 1小于10 长度为1
ThinkPHP内置的模板引擎比较标签
输出结果类似为:
大于3
小于3
条件判断
{$num}大于5
{$num}大于3
其他{$num}
输出结果类似为:
6大于5
四、thinkphp开发技巧总结
使用thinkphp做开发的过程中的一些技巧总结,以后发现了还会继续补充,也欢迎更多的朋友在下面留言补充。
(1)不要在模板中直接使用{$_GET.id}或者{$Think.get.id},因为{$_GET.id} {$Think.get.id} 这两种方式都没有任何过滤,容易被XSS。建议使用I方法,即:{:I("get.id")}
(2)在thinkphp中如果需要获取数据库中某个表的字段该怎么办呢?示例如下:
$user=M("user");
2 $fields=$user->getDbFields();
结果将返回一个由表字段组成的一个一维数组。
(3)数据修改的过程中如果我们只需要修改某个字段的值,就可以使用setField方法,而不需要每次都调用save方法,例如:
$user=M("user");
2 $user->where("id=2")->setField("username","www.111cn.Net");
(4)涉及到比较的情况下不一定非得使用if condition这种形式的,还可以按如下的形式来写:
2
3
4
5
6
(5)在thinkphp的删除操作中可以不使用where直接使用delete来执行删除,例如:
$User->delete("2,5");//删除主键为2和5的数据
(6)关于thinkphp的几个快速操作的函数的用法说明。
C操作,操作(动态)配置: 主要用于Action方法里面
获取:C("配置参数")
设置:C("配置参数 ",新值)
A操作,快速创建Action对象:
$action=A("User"); 等效于 $action=new UserAction();
D操作,快速创建模型数据对象:
$model=D("User"); 等效于 $model=new UserModel();
S操作,快速操作缓存方法
获取:S("name")
设置:S("name","value");
删除:S("name",NULL);
F操作,快速文件数据保存方法,使用方法与S操作一样。
(7)Model命名时,默认要和数据库里的表名一致,如PhpernoteUserModel.class.php对应数据库的名称应该是 "前缀_phpernote_user",在程序代码中的调用应该是:D("PhpernoteUser");
(8)开发的过程中如不需要进行缓存,可以在入口文件中进行如下定义:
define("NO_CACHE_RUNTIME",true);
(9)在开发的过程中如果需要知道一些额外的信息,可在配置文件中进行相应的定义,下面给出几个比较常见的信息定义方式:
"SHOW_RUN_TIME"=>true,//运行时间显示
2 "SHOW_ADV_TIME"=>true,//显示详细的运行时间
3 "SHOW_DB_TIMES"=>true,//显示数据库的操作次数
4 "SHOW_CACHE_TIMES"=>true,//显示缓存操作次数
5 "SHOW_USE_MEM"=>true,//显示内存开销
(10)自定义Model类并在实例化模型(模型就是数据库操作类)时使用,举例如下:
a、在工程目录下的Lib目录下的Model目录下建立一个IndexModel.class.php,然后里面写一个方法play,此方法内容体为循环输出1至10。
b、那么在Action中的方法里,还可以这么写:
$index=M("index","IndexModel");//这里可以加上自定义的模型类一起实例化
2 $index->play();
那么会输出1至10。
(11)使用thinkphp的过程中如果需要更改默认的模板后缀名,可以在配置文件中做如下定义:
"TMPL_TEMPLATE_SUFFIX" => ".dwt"//这里就将模板后缀名改为了dwt
thinkphp自动验证与自动填充无效总结
(1)create() 方法有问题
ThinkPHP 自动验证与自动填充是在创建数据对象 create() 时实现的,因此自动验证与自动填充无效很大程度上与 create() 有关。
create 方法语法如下:
create(mixed data, string type)
data 表示接受的数据,type 表示本次的具体操作(写入还是更新数据)。两个参数都可省略,data 参数省略的情况下默认为接受 $_POST 数据,而 type 默认情况下由系统自动识别。
但系统自动识别 type 是有缺陷的,当传入的字段有主键字段时,系统就识别为更新操作,否则就是写入操作。所以当主键字段非自动增长而是需要 SQL 写入时,那么自动验证和自动填充都可能无效。
例如添加数据记录时,如果表单中有主键字段或者系统中产生了主键字段(如录入设备编号),那么 ThinkPHP 就认为本次操作为更新操作,对于例如下面设定的自动验证和填充都会略过:
代码如下protected $_validate = array(
// 新增时验证标题唯一
array("title","","标题已经存在!",0,"unique",1),
};
// 自动填充
protected $_auto = array(
// 新增时填充时间戳
array("pubtime","time",1,"function"),
);
尽管在操作中,执行了 add() 操作将数据写入了数据表,但这时会发现自动验证与自动填充无效。
出现这种情况时,只需将操作类型显式的传入 create() 方法即可,即 create($_POST,1),告诉系统本次操作为写入数据。另外如果传入的数据不是 $_POST ,也要将数据当作参数传入,如 create($_GET)。
(2)数据字段未对应
由于粗心,未对应好表单字段与数据表字段。
(3)数据表字段做了更改
在开发过程中,更改了表字段名称,而缓存未及时更新,导致系统判断为无效字段而被 unset 掉。所以在更改了表字段名称之后,及时将 Runtime/Data 下的数据表缓存清除。
(4)Model 命名错误
Model 命名错误,未严格按照规范命名,如头字母未大写或粗心导致字母顺序不对,多或少字母等。这等错误往往会直接导致模型失效,大小写这边特别需要注意。
(5)数据表无自增的id
就是数据表中没有自增的id时,验证时就会找不到需要验证的数据,所以会失败。
以上就是ThinkPHP自动验证与自动填充无效可能出现的几种原因,当出现问题时要一条一条的进行排除,相信自己一定可以找到错误的,当然还有一些未知的错误,如果您发现了另外的一种原因,请在下方留言指正。
http://m.bbyears.com/jiaocheng/49478.html
推荐访问:thinkphp框架原理