心得体会:多理解编程思想、多查阅api文档、项目架构、如何设计
想想之前的学习方法简直太死板了,眼见不开阔,跟牛人接触的太少了,自己闷葫芦写的乱七八糟!!重要的是眼见思想,有了整体的思路以后其他东西都可以查阅!
zend studio的安装,直接在官网上下载,破解注册码方法见网盘安装包
1.使用框架
在http://www.thinkphp.cn/下载需要框架。
在zend studio下创建localphpproject 文件-》保存地址为AppServ\www\project2(这样可以用localhost访问)-》删除index.php文件-》将下载的框架文件复制到项目里面(这里会string.class会报错,直接把string 改革名字就行)
导入项目:import->general->existing projects into workspace
浏览器访问:http://localhost:8080/project2/demo1_thinkphp_3.2.1/
报错: overlaps the location of another project: 'xxxx'
创建工作路径的时候要和创建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,下面是相关服务器的配置参考:
[ Apache ]
- httpd.conf配置文件中加载了mod_rewrite.so模块
- AllowOverride None 将None改为 All
- 把下面的内容保存为.htaccess文件放到应用入口文件的同级目录下
<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)输入变量
I('变量类型.变量名/修饰符',['默认值'],['过滤方法'],['额外数据源'])
// 采用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'
- 设置url
插件控制器的变量由参数 VAR_ADDON 进行设置,默认为addon,例如我们在URL中传入: http://serverName/Home/info/index/addon/SystemInfo
则实际定位到的是
Home/Addon/SystemInfo/Controller/InfoController.class.php