心得体会:多理解编程思想、多查阅api文档、项目架构、如何设计php
想一想以前的学习方法简直太死板了,眼见不开阔,跟牛人接触的太少了,本身闷葫芦写的乱七八糟!!重要的是眼见思想,有了总体的思路之后其余东西均可以查阅!html
zend studio的安装,直接在官网上下载,破解注册码方法见网盘安装包mysql
1.使用框架sql
在http://www.thinkphp.cn/下载须要框架。thinkphp
在zend studio下建立localphpproject 文件-》保存地址为AppServ\www\project2(这样能够用localhost访问)-》删除index.php文件-》将下载的框架文件复制到项目里面(这里会string.class会报错,直接把string 改革名字就行)数据库
导入项目:import->general->existing projects into workspaceapache
浏览器访问:http://localhost:8080/project2/demo1_thinkphp_3.2.1/编程
报错: overlaps the location of another project: 'xxxx'api
建立工做路径的时候要和建立localphp project文件保存的文件路径一致数组
2.模块化配置前台和后台
先在index.php下定义应用目录做为应用程序入口(前台吗?)-》打开网页刷新-》点击编辑器刷新
// 定义应用目录 define('APP_PATH','./WeiBo/');
在生成的weibo目录下新建文件夹Admin->直接将Home文件夹复制再更名就能够了
再将Admin 下IndexController.class.php的命名空间改成
Admin\Controller
<?php // 本类由系统自动生成,仅供测试用途 namespace Admin\Controller; use Think\Controller; class IndexController extends Controller { public function index(){ echo "houtai "; } }
admin做为后台?home做为前台?
这样就实现了先后台模块化,公共使用核心配置文件
3.导入乱码
properties->resource->other->Utf-8
4.url用户密码传递实例
如何调用操做:pathinfo:localhost/demo39/index.php/模块/控制器/操做
eg.
UserController.class
public function user($user,$pass){ echo 'user'; }
url传递值
http://localhost:8080/project2/demo1_thinkphp_3.2.1/index.php/Home/User/user/user/admin/pass/123
或者
http://localhost:8080/project2/demo1_thinkphp_3.2.1/index.php?m=Home&c=User&a=user&user=leo&pass=123
5.URL重写(参看手册:部署-》URL重写)
能够经过URL重写隐藏应用的入口文件index.php,下面是相关服务器的配置参考:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
6.没法启动服务器界面???
services.msc中apache stop->start
7.没法链接数据库??
这里真是血与泪的教训啊!
'DB_HOST'=>'localhost', 这里不能写端口啊!!!
8.加入调试分析
Common/Conf/config.php
//页面TRACE
'SHOW_PAGE_TRACE'=>true,
9.数据库的链接配置
数据库及数据库里面的表都要实现创建好,而后才在zend里面配置链接
url:localhost/phpMyadmin
(1)数据库的全局化定义
Common/Conf/config.php
两种不一样方式
//mysql全局定义 'DB_TYPE'=>'mysql', 'DB_HOST'=>'localhost', 'DB_USER'=>'root', 'DB_PWD'=>'123456789', 'DB_PORT'=>'3306', 'DB_NAME'=>'thinkphp', 'DB_PREFIX'=>'think_', //PDO专用定义 'DB_TYPE'=>'pdo', 'DB_USER'=>'root', 'DB_PWD'=>'123456789', 'DB_PREFIX'=>'think_', //表前缀,在数据库中代表是这样的 : think_user 'DB_DSN'=>'mysql:host=localhost;dbname=thinkphp;charset=UTF8',
//配置的时候就已经选择了链接的数据库名称和创建的表前缀,固然这都须要在数据库里面建立好
(2)链接
Home/Controller/UserController.class
对应四种方法
public function model(){ //建立model基类,传递user表,think_user //Model能够传递三个参数:表名、表前缀、数据库信息 (1) //$user=new Model('User'); //链接数据库 (2)// $user=M('User'); //推荐 (3) //$user=new UserModel(); (4)// $user=D('User'); //支持跨模块实例化:Admin/User
第三种方法在Home/Model建立UserModel.class.php
<?php namespace Home\Model; use Think\Model; class UserModel extends Model{ /* //更改表前缀 protected $tablePrefix='tp_'; //不包含前缀的数据表名称 protected $tableName='abc'; //更改前缀加表名 protected $trueTableName='tp_abc'; */ public function __construct(){ parent::__construct(); echo '\home'; } }
10.sql
(1)查询
字符串
M为没有前缀的数据表名
$user=M('User'); //字符串查询 //var_dump($user->where('id =1 and user="蜡笔小新"')->select());
索引数组做为条件查询
/* $condition['id']=1; $condition['user']='蜡笔小新'; $condition['_logic']='or'; var_dump($user->where($condition)->select()); */
对象查询,在PHP根目录下寻找内置类
$condition=new \stdClass(); $condition->id=1; $condition->user='蜡笔小新'; var_dump($user->where($condition)->select());
(2)表达式查询
eg.
(3)快捷查询
(4)区间查询
(5)组合查询
(6)统计查询
(7)动态查询
数据表的导入导出
12.SQL连贯操做(大概就是php语句下的sql语句查询)
这些语句都要在配置好数据库以后入口文件的Home/User/model方法下写
能够在开发手册 模型-》连贯操做下查到
13.CURD操做
(1)用到静态html文件,安装aptana插件?
http://mrthink.net/zend-studio-aptana-tips/
(2)数据建立
在工程文件下新建index.html文件
<meta charset="UTF-8"> <form method="post" action="http://localhost:8080/project2/demo1_thinkphp_3.2.1/Home/User/create"> <p>标志:<input type="text" name="name"/></p> <p>标题:<input type="text" name="title"/></p> <input type="submit" value="提交"/> </form>
注意默认提交方法为post,若为get则接收方式有差别,action指向接受数据建立数据的方法中
Home/User/create方法:
/** * 数据建立,数据提交的结果就是提交的POST的键值对 */ public function create(){ $user=M('category'); //除去前缀外的名字 //为何须要User来进行create?并非数据库里面的数据啊 var_dump($user->create()); //经过表单提交的时候默认已经构造好了一个$data对象,也能够本身手动建立 $user->add(); }
create()为建立数据源,这里是直接接受post提交过来的数据,是一个数组,可是尚未添加到数据库,这里还有其余几种建立数据源的方式,在api文档中能够查到。
add()是将数据保存到数据库。
tips:
接受post提交的数据对象
$data['user']=$_POST['user'];
按必定规则获取日期数据
$data->date=data('Y-m-d H:i:s');
若index.html文件改成get方式提交数据,由于默认是post方式,因此在接收时须要作以下改变
var_dump($user->create($_GET));
支持一系列连贯操做
(3)数据写入
使用add方法
若是在add以前已经建立数据对象的话(例如使用了create或者data方法),add方法就不须要再传入数据了。
支持一系列的连贯操做,来对所写数据加入限制条件
(4)数据读取
读取中find()和select()方法有何不一样?
find 方法:查询符合条件的第一条数据。
select 方法:查询符合条件的全部数据。
配合查询时候一系列连贯操做实现
读取字段值(相似于限制读取字段)
// 获取ID为3的用户的昵称
$nickname = $User->where('id=3')->getField('nickname');
(5)数据更新
个人妈,竟然被一个狗屁问题困扰一半天,在写路径的时候因为事先没有隐藏入口文件,在打url的时候就一直忽略了打Index.php,我在没有更爱前缀的状况下一直在改
http://localhost:8080/project2/demo1_thinkphp_3.2.1/index.php/Home/User
14.视图
这个视图好像就至关于mvc里面的v,参看 开发手册上面的视图
好比在Home目录下的控制器User中
<?php // 本类由系统自动生成,仅供测试用途 namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function index(){ $this->assign('name','labixiaoxin'); $this->display(); } }
display就是渲染出相应的view中的内容,因此须要在View->新建User文件夹-》新建对应的Index.html文件。。这里就对应上面controller里面的渲染输出的内容。
路径相关后缀均可以调整的哈
15.模板
就是视图里里面辅助输出的数据
变量输出
16.控制器
url访问
http://localhost:8080/project2/demo1_thinkphp_3.2.1/Home/User
项目名称/模块(Home)/User(控制器名称)--》这个直接就是默认访问该名字的控制器(一级)
若是是二级控制器,则为
http://localhost:8080/project2/demo1_thinkphp_3.2.1/Home/Member/User
项目名称/模块(Home)/Member(控制器二级文件夹名称)/User(控制器名称)--》这个直接就是默认访问该名字的控制器(一级)
分层控制器:是与Controller控制器同级别的其余控制器
访问时
Home\Event\UserEvent
分级控制器:是在Controller控制器下面的控制器子文件
彷佛多级控制器就是没有效果
(1)控制器的名称采用驼峰命名法
ome/Controller/IndexController.class.php
这种首字母大写 而且在名称后面加上Controller的命名方法,能够在url引用的时候直接引用controller前面的名字便可
http://serverName/index.php/Home/Index/
Index其实就是指明了IndexController这个控制器
(2)设置操做方法后缀
'ACTION_SUFFIX' => 'Action', // 操做方法后缀
(3)多级控制器
'CONTROLLER_LEVEL' => 2,
(4)实例化控制器
提供跨模块访问方法
// 实例化Home模块的User控制器
$User = new \Home\Controller\UserController();
或采用快捷调用方法A
$User = A('User');
$Blog = A('Admin/Blog');
(5) 前置和后置操做
是在执行某个操做方法以前和以后会自动调用的方法
public function _before_index()
public function _after_index()
(6)输入变量
// 采用htmlspecialchars方法对$_GET['name'] 进行过滤,若是不存在则返回空字符串 echo I('get.name','','htmlspecialchars');
param变量类型是框架特有的支持自动判断当前请求类型的变量获取方式,例如:
echo I('param.id');
I方法的第三个参数若是传入函数名,则表示调用该函数对变量进行过滤并返回 (在变量是数组的状况下自动使用array_map
进行过滤处理),不然会调用PHP内置的filter_var
方法进行过滤处理,..
filter_var() 函数经过指定的过滤器过滤变量。
filter_var(variable, filter, options)
path类型变量能够用于获取URL参数
变量过滤
用法以下: I('变量类型.变量名/修饰符');
(7)请求类型: 须要判断当前操做的请求类型是GET 、POST 、PUT或 DELETE
(8)空操做: 指系统在找不到请求的操做方法的时候,会定位到空操做(_empty
)方法来执行,利用这个机制
在url传递参数的时候,能够不输入须要的操做方法,直接就定位到_empty()方法内
(9)空控制器
指当系统找不到请求的控制器名称的时候,系统会尝试定位空控制器(EmptyController),利用这个机制咱们能够用来定制错误页面和进行URL的优化。
url:http://serverName/index.php/Home/shanghai/
根据当前控制器名字大概就是把ShangHai这个本来应该是控制器名称的地方由参数这个东西伪装取代。
<?php namespace Home\Controller; use Think\Controller; class EmptyController extends Controller{ public function index(){ //根据当前控制器名来判断要执行那个城市的操做 $cityName = CONTROLLER_NAME; $this->city($cityName); } //注意 city方法 自己是 protected 方法 protected function city($name){ //和$name这个城市相关的处理 echo '当前城市' . $name; } }
(10)插件控制器
经过在url中加入插件控制器变量的方法,会自动定位到插件控制器中的操做方法。
VAR_ADDON' => 'plugin'
插件控制器的变量由参数 VAR_ADDON 进行设置,默认为addon,例如咱们在URL中传入: http://serverName/Home/info/index/addon/SystemInfo
则实际定位到的是
Home/Addon/SystemInfo/Controller/InfoController.class.php