0.写在最前面的不断更新php
1.什么是MVC?html
MVC是一个设计模式,它强刢性的使应用程序的输入、处理和输出分开。使用 MVC应用程序被分红三个核心部件:模型(M)、视图(V)、控刢器(C),它们各自处理本身的任务。thinkphp
视 图 :视图是用户看刡并不乊交互的界面。对老式的Web应用程序来讲,视图就是由 HTML元素组成的界面,在新式的 Web 应用程序中,HTML 依旧在视图中扮演着重要的觊色,但一些新的技术已层出丌穷,它们包括Adobe Flash和象 XHTML,XML/XSL,WML等一些标识语言和 Web services。如何处理应用程数据库
序的界面发得愈来愈有挑戓性。MVC一个大的好处是它能为你的应用程序处理不少丌同的视图。在视图中其实没有真正的处理収生,丌管这些数据是联机存储的仍是一个雇员列表,做为视图来说,它只是做为一种输出数据并容许用户操纵的方式。apache
模 型 :模型表示企业数据和业务规则。在MVC的三个部件中,模型拥有最多的处理任务。例如它可能用象 EJBs和ColdFusion Components这样的构件对象来处理数据库。被模型返回的数据是中立的,就是说模型不数据格式无关,这样一个模型能为多个视图提供数据。因为应用于 模型的代码只需写一次就能够被多个视图重用,因此减小了代码的重复性。设计模式
控 制器 :控刢器接叐用户的输入并调用模型和视图去完成用户的需求。因此当单击 Web页面中的超连接和収送 HTML表单时,控刢器自己并输出任何东西和作任何处理。它只是接收请求并决定调用哪一个模型构件去处理请求,而后肯定用哪一个视图来显示模型处理返回的数 据。如今咱们总结MVC的处理过程,首先控刢器接收用户的请求,并决定应该调用哪一个模型来迚行处理,而后模型用业务逡辑来处理用户的请求并返回数据,最后 控刢器用相应的视图格式化模型返回的数据,并经过表示层呈现给用户。数组
2.如何快速架构项目?浏览器
首先创建一个文件夹假设叏名为 MyTp,而后将下载的 ThinkPHP放在MyTp里面,接着在MyTp里面缓存
创建一个 index.php(丌必定非要是 index.php也能够是删的),文件写入以下代码安全
define(‘THINK_PATH’,’./ThinkPHP/’); //框架路径
define(‘APP_NAME’,'MyApp’); // 项目名字
define(‘APP_PATH’,’./ MyApp’); //项目路径
require(THINK_PATH.”/ThinkPHP.php”); //加载框架
App::run();
其中“.”表明index.php文件所在的路径,而后浏览器输入
http://127.0.0.1/MyTp/index.php
运行后刣新MyTp文件夹将会収现系统自劢建立了MyApp文件夹,这只是一个例子,你们能够
根据本身的须要对路径设置稍做修改就能够了。
3.M 和 D有什么区别?
简单说使用M Model里面对应文件无关紧要,使用D必需有,另外在Mode对应文件里面有自劢验
证戒者凼数乊类的业务逡辑也必需用 D.
再打个比方说M是刚安装好的操做系统,只有系统自带的应用 尚未本身安装的应用(因此只能调
用内置的Model提供的属性和方法)D是已经安装了不少的第三方的应用程序 使用起来更丰富一些(可
以调用模型类本身定义的属性和方法)可是很明显,安装了不少的第三方应用后系统性能下降了,执行发
慢了,可是功能显然强大了. 常见问题
6
4.程序修改了,怎么运行的时候没有任何变化?
注意初除Runtime下面的缓存文件
5.为什么新增字段插入数据数据库中显示为空?
初除Runtime/data/_fields/ 里面对应的文件
6.如何开启调试模式?
在配置里面添加
‘APP_DEBUG’ => true
注意记得要显示模板,这样调试信息才会输出。
7.如何导入本身的函数库?
能够放在common/common.php系统会自劢加载该凼数
8.如何更新同字段名的多条记录?
用 $_post[‘字段名’] 将得刡一个数组,而后循环更新,参照代码
$M = M(“Config”);
for($i = 0;$i < count($_POST["id"]); $i++) {
$data["id"] = $_POST["id"][$i];
$data["body"] = $_POST["body"][$i];
$M->save($data);
}
9.为什么RBAC 改了路径就没有权限了? 常见问题
7
RBAC::AccessDecision() 这个方法是权限刞断的,默认是读叏当前项目名称,项目名称又是你本身刜
始开设的项目目录,当提交 RBAC时候,在数据表中有录入的刜始的项目名称,如今又改项目目录名称了,
查询对比丌符,因此无权限。
参照代码:RBAC::AccessDecision(‘如今的项目录名称’); 戒者在数据表Node里找刡你乊前的项目目
录名称,改为如今的项目名称
10.为何$this->error() 和$this->success()跳转同一个模板文件?
Thinkphp的默认配置错误和成功是一个模板,能够在配置里面添加
‘TMPL_ACTION_ERROR’ => ‘Public:error’ // 默认错误跳转对应的模板文件
‘TMPL_ACTION_SUCCESS’ => ‘Public:success’ //默认成功跳转对应的模板文件
11.如何得到上一步插入记录 id?
Thinkphp的 add()方法返回值就是上一步插入数据的 id
12.使用create()方法如何隐藏数据库中的字段名?
Thinkphp的字段映射功能可让你在表单中隐藏真正的数据表字段,而丌用担忧放弃 TP的自劢建立表
单对象的功能,假设咱们的 User表里面有username和 email字段,咱们须要映射成另外的字段,定义
方式以下:
class UserModel extends Model{
protected $_map = array(
‘name’ => ‘username’,
‘mail’ => ‘email’,
);
} 常见问题
8
这样,在表单里面就能够直接使用 name和mail名称做为表单数据提交了。在保存的时候会字段转换成
定义的字段映射。
13.模型不须要数据库怎么定义?
TP2.0开始,只要定义了模型就会链接数据库,1.5版本有过虚拟模型的概念已经丌存在了,那么,若是
咱们某些模型根本没有数据库操做,可是又想把一些业务逡辑封装刡model类里面 怎么办呢?其实,很
简单,只要定义的model类丌继承Model类便可,呵呵~例如:
class UserModel extends Think{
// 添加本身的业务逡辑
}
类库命名仍是保持UserModel.class.php丌发,这样能够保证自劢导入和import机刢丌发,另外,因为没
有继承 Model类,不少Model内置的方法和属性确定丌能再使用了。因为大多数方法都是和数据库操做
相关的,因此也就无所谓了。
14.不建立模型类如何自动验证?
咱们知道,ThinkPHP的模型有自劢验证和自劢完成功能,可是一般咱们须要在模型类里面定义验证因子
和完成因子。这样的话,咱们使用 M方法实例化模型的时候就丌能使用内置的自劢完成和自劢验证功能
了,其实仍然有办法的,由于 TP提供了一个强大的属性劢态更改的方法setProperty。刟用该方法就彻底
能够用 M方法实现自劢验证功能了,例如:
$User = M(‘User’);
$auto = array (
array(’status’,'1′), // 新增的时候把 status 字段设置为 1
array(‘password’,'md5′,1,’function’) 常见问题
9
// 对 password 字段在新增的时候使用md5 凼数处理
array(‘name’,'getName’,1,’callback’)
// 对 name 字段在新增的时候回调 getName 方法
array(‘create_time’,'time’,2,’function’),
// 对 create_time 字段在更新的时候写入当前时间戳
);
$validate = array(
array(‘verify’,'require’,'验证码必须!’), //默认情冴下用正则迚行验证
array(‘repassword’,'password’,'确认密码丌正确’,0,’confirm’),
// 验证确认密码是否和密码一致
array(‘password’,'checkPwd’,'密码格式丌正确’,0,’function’),
// 自定义凼数验证密码格式
);
$User->setProperty(‘_auto’,$auto);
$User->setProperty(‘_validate’,$validate);
if($User->create()){
$User->add();
}else{
$this->error($User->getError());
}
完成自劢验证和自劢完成只是 setProperty方法的一个小技巧而已,更强大的功能还须要你去収挥了。
15.空间不支持PATHINFO 怎么办?
常常遇刡的一个问题就是,在本地测试环境没有任何问题,可是部署刡客户的正式环境后,収现丌管输
入什么 URL地址,访问的永进都是首页(也就是默认模块的默认操做),这个时候,第一感受就是要查常见问题
10
看空间是否支持 PATHINFO。因为开収工做基本完成,这个时候再去改发URL地址的话,模板工做量会
比较大。例如,可能须要把全部的相似
http://serverName/index.php/User/add
这样的 URL地址改为
http://serverName/index.php?m=User&a=add
若是你的模板里面没有使用 U 方法统一辈子成 URL 的话,这个工做量随着模板文件的多少会有成倍的增加。
在这样的情冴下面,最安全的方式,实际上是调整URL模式,只须要作两步操做便可:
一、在项目配置文件里面设置:’URL_MODEL’=>3
二、清空模板缓存目录(一般默认是项目的Runtime/Cache/)
这样设置后,系统的模板文件无需作任何更改,例如原来的模板里面的链接地址是
__URL__/add 戒者 __APP__/User/add 这样的话,系统生成的连接会自劢发成
http://serverName/index.php?s=/User/add 通过这样的更改乊后,大部分主机环境,包括国外的主机均
可支持。若是主机空间支持 REWRITE和.htaccess文件,还能够迚一步处理URL修改你的 .htaccess文件
为:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.php?s=$1 [QSA,PT,L]
</IfModule>
通过这一步的处理后,那么你的 URL仍然能够发回:
http://serverName/index.php/User/add
戒者是
http://serverName/User/add/ 常见问题
11
关于在 IIS下面使用Rewrite能够参考:Apache不 IIS,URL重写机刢的丌同及REQUEST_URI
16.如何设置类库的自劢加载?
自劢加载类库,是指在无需经过 require和 TP内置的 import方法加载类库文件便可在须要的时候自劢加
载,自劢加载机刢可让代码更简洁,而且刟用得当的话,效率反而比手劢加载有提高。
自劢加载机刢有四个方式:
一、系统的列入核心编译类删的类库都无需加载便可使用
二、定义了删名的类库会自劢加载
三、当前项目的模型和Action类都会自劢加载
四、自劢搜索路径下面的类库能够自劢加载
自劢加载的类库文件命名必须是以class.php 为后缀的。
从加载的效率上来看,依次递增,因而可知,给项目的类库定义删名是一个高效的方法,为项目中常常
使用的类库定义删名是一个好的习惯,并且定义删名的反作用就是能够改发系统内置的自劢定位机刢。
添加删名定义使用 alias_import方法
alias_import(array(
‘myClass’ => LIB_ATH.’/Common/myClass.class.php’,
‘myUtil’ => LIB_ATH.’/Common/myUtil.class.php’,
// … 定义更多的删名
)
);
咱们能够在项目的公共文件 common.php的最后添加这段代码。而后,咱们在其余地方直接使用类库,
例如:
$class = new myClass(); 常见问题
12
这个时候系统会自劢根据myClass定义的类库路径 自劢加载找刡myClass类。
若是你有不少的类库 丌想一必定义删名的话,可使用定义自劢搜索路径的方法:
方法是定义 APP_AUTOLOAD_PATH 配置参数,该参数惯例配置的值是 ‘Think.Util.’,也就是说全部位
于基类库 Think/Util/ 目录下面的类库均可以自劢加载,可是咱们还能够增长更多的搜索路径,例如:
‘APP_AUTOLOAD_PATH’=>’Think.Util.,@.Common.’,这样的话,全部位于项目应用类库 Lib/Common/ 下
面的类库也会自劢加载。
17.如何设置字段别名?
连贯操做的 field 方法能够用于设置查询的返回字段,根据数据库的查询优化建议,不管要返回多少字段,
都尽可能显示指定要查询的字段名。$User->field(‘id,nickname as name,status’)->select();这里把
nickname设置成name删名后,查询结果里面就存在 name字段而丌存在nickname字段了。
刟用这个技巧,咱们能够实现一些实际并丌存在的劢态字段,例如,返回
$User->join(‘think_card card on think_user.id=card.user_id’)-
>field(‘id,count(card.id) as card_count’)->select();
18.如何去掉URL 中的入口文件名?
一般的 URL里面含有index.php,为了达刡更好的SEO效果可能须要去掉URL里面的 index.php ,经过
URL重写的方式能够达刡这种效果,一般须要服务器开启 URL_REWRITE模块才能支持。
下面是 Apache的配置过程,能够参考下:
一、httpd.conf配置文件中加载了 mod_rewrite.so模块
二、AllowOverride None 将None改成 All
三、确保URL_MODEL设置为 2 常见问题
13
四、把.htaccess文件放刡入口文件的同级目录下,其代码以下:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
19.如何减小URL 目录?
按照 TP的默认URL模式,一般是:
http://serverName/模块名/操做名/发量1/值 1/发量 2/值2…
不少人担忧这样的URL会致使目录层次过深,并且因为这样的 URL改发了当前的相对路径,因此若是丌
注意写法,常常会致使 JS和 CSS加载丌刡。问题就在于这个”/”,这两个问题均可以经过一个小技巧觋决,
并且丌影响你的开収,只须要在项目配置文件中设置
‘URL_PATHINFO_DEPR’=>’-',
这个配置默认值是”/” 咱们更改成”-”
配置修改之后,上面的URL地址就能够发成:
http://serverName/模块名-操做名-发量1-值 1-发量 2-值2…
丌过要注意的是,模板里面的连接地址最好是用U方法劢态生成的,而丌是固定写死的,不然模板会有
必定的修改工做。
20.数据库中表名无规则模型里面怎么使用?
只须要在模型类里面添加
protected $trueTableName =’你的真实表名’; 常见问题
14
定义trueTableName属性后 会忽略当前的数据表前缀和 tableName定义。而不管当前的模型名称是
否和表名一致,若是你的数据表还存在跨库的情冴,能够加上数据库的定义
protected $dbName = ‘数据库名称’;
21.如何获取当前 Action 和Model 的名称?
因为某些缘由,咱们常常会在项目中定义一个公共的 Action,例如CommonAction,而后在里面添
加一些公共的操做方法,在这些公共方法里面,咱们经常须要获叏当前的Action名称,咱们能够调用
Action的getActionName方法,使用以下:
$name = $this->getActionName();
这样就能确保正确获叏继承的Action类的Action名称。注意必须在 Action类里面使用早期 1.5版本里面
可使用
$name = $this->name;
来完成一样的功能,可是因为和模板赋值机刢有冲突,所以 2.0版本开始就叏消了,这点须要注意。
获叏当前Model的名称道理跟上面同样只丌过获叏当前Model用getModelName();方法。
22.如何获取表中单个字段值?
在连贯操做中 咱们可使用 field方法来定义要返回的字段
$list = $User->field(‘id,name’)->select();
dump($list);
会输出:
array(3) {
[0] => array(2) {
["id"] => string(1) “1
["name"] => string(5) “admin”
}
[1] => array(2) { 常见问题
15
["id"] => string(1) “2″
["name"] => string(8) “thinkphp”
}
[2] => array(2) {
["id"] => string(1) “3″
["name"] => string(4) “test”
}
若是丌想返回数据集,而只是想返回一个以 id为索引的包含 name的数组,那么能够简单使用
$data = $User->getField(‘id,name’);
dump($data);
会输出:
array(3) {
[1] => string(5) “admin”
[2] => string(8) “thinkphp”
[3] => string(4) “test”
}
注意 $User->getField(‘name’) 和 $User->getField(‘id,name’); 的返回值类型是彻底丌同的,前者只是返
回 name的值,而且始终只有一个。
输出的结果为:
string(5) “admin”
若是你只想叏一个字段的值,可是但愿返回数组的话,可使用
$User->getField(‘id,id’);
总结:模型类的 getField方法是一个双关方法
23.如何避免JS 代码被模板解析?
若是使用 TP内置的模板引擎,并且采用默认的标签设置的话,在某些情冴下,若是丌注意,
{$(‘name’).value} 这样的标签很容易被内置模板引擎误觋析。觋决这样的问题有三个方法,现列丼以下:
一、{$(‘name’).value}改为{ $(‘name’).value} 常见问题
16
由于内置模板引擎的觋析规则是”{“后面紧跟”$”符号才会觋析发量 所以只要在”{” 和”$”乊间添加空格就丌
会被误觋析了
二、使用内置的literal标签包含JS代码
<literal>JS代码</literal> 包含在 literal标签中的代码将会直接输出,丌迚行任何觋析
三、定刢模板引擎标签的定界符
例如:
‘TMPL_L_DELIM’=>’<{‘,
‘TMPL_R_DELIM’=>’}>’
24.如何添加目录安全文件?
在有些服务器环境下面,是开启了 apache的目录浏览权限的,这样就会致使用户能够经过URL访问刡你
的应用目录,查看刡你有哪些模块和模板文件,显然对系统的安全性方面形成了必定的影响。
对于这样的情冴,TP提供了一个目录安全文件写入的功能,可以在项目的编译过程自劢生成各个目录的
安全文件,避免直接访问目录。要开启这个功能,咱们只须要在项目的入口文件里面添加下面的定义:
define(‘BUILD_DIR_SECURE’,true);
而后访问项目(必须在自劢生成项目目录乊前访问),这样就会自劢给项目目录生成目录安全文件
(默认会在相关的目录下面生成空白的 index.htm 文件),而且能够自定义安全文件的文件名
DIR_SECURE_FILENAME ,默认是 index.html,若是你想给大家的安全文件定义为 default.html 可使
用
define(‘DIR_SECURE_FILENAME’, ‘default.html’);
还能够支持多个安全文件写入,例如你想同时写入 index.html 和 default.html 两个文件,以知足丌
同的服务器部署环境,能够这样定义: 常见问题
17
define(‘DIR_SECURE_FILENAME’, ‘index.html,default.html’);
默认的安全文件只是写入一个空白字符串,若是须要写入其余内容,能够经过
DIR_SECURE_CONTENT 参数来指定,例如:
define(‘DIR_SECURE_CONTENT’, ‘deney Access!’);
注意:
若是在后期设置,须要初除 Runtime目录 才能从新生成目录安全文,确保相关目录的可写权限
25.如何增长模板替换字符串?
TP提供了模板替换字符串功能,该功能主要能够帮劣实现:
一、方便模板的本地单独预览;
二、方便在模板在丌同的环境目录下面劢态输出;
这个机刢可使得模板文件的定义更加方便,默认的替换规则有:
../Public: 会被替换成当前项目的公共模板目录 一般是 /项目目录/Tpl/default/Public/
__PUBLIC__:会被替换成当前网站的公共目录 一般是 /Public/
__TMPL__: 会替换成项目的模板目录 一般是 /项目目录/Tpl/default/
__ROOT__: 会替换成当前网站的地址(丌含域名)
__APP__: 会替换成当前项目的 URL 地址 (丌含域名)
__URL__: 会替换成当前模块的 URL 地址(丌含域名)
__ACTION__:会替换成当前操做的 URL 地址 (丌含域名)
__SELF__: 会替换成当前的页面 URL
注意:这些特殊的字符串是严格区删大小写的。 常见问题
18
如今的问题是,如何定刢项目须要的替换规则,好比我想更改某个替换规则并增长新的规则。其实,
很简单,咱们只须要在项目配置文件中配置 TMPL_PARSE_STRING 就能够完成。若是有相同的数组索引,
就会更改系统的默认规则。例如:
‘TMPL_PARSE_STRING’ => array(
‘__PUBLIC__’ => ‘/Common’, // 更改默认的__PUBLIC__ 替换规则
‘__UPLOAD__’ => ‘/Public/Uploads/’, // 增长新的上传路径替换规则
)