您的位置:首页 > 编程语言 > PHP开发

thinkphp_3.2.1

2016-05-04 09:49 302 查看

【推荐阅读】微服务还能火多久?>>>

心得体会:多理解编程思想、多查阅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 ]

  1. httpd.conf配置文件中加载了mod_rewrite.so模块
  2. AllowOverride None 将None改为 All
  3. 把下面的内容保存为.htaccess文件放到应用入口文件的同级目录下
  1. <IfModule mod_rewrite.c>
  2. RewriteEngine on
  3. RewriteCond %{REQUEST_FILENAME} !-d
  4. RewriteCond %{REQUEST_FILENAME} !-f
  5. RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
  6. </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

 

<?phpnamespace 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 方法:查询符合条件的所有数据。

配合查询时候一系列连贯操作实现

 

读取字段值(类似于限制读取字段)

  1. // 获取ID为3的用户的昵称
  2. $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控制器同级别的其他控制器

访问时
  1. 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)实例化控制器

提供跨模块访问方法

  1. // 实例化Home模块的User控制器
  2. $User = new \Home\Controller\UserController();

或采用快捷调用方法A

  1. $User = A('User');
  2. $Blog = A('Admin/Blog');

 

(5) 前置和后置操作

是在执行某个操作方法之前和之后会自动调用的方法

 
  1. public function _before_index()
  2. 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这个原本应该是控制器名称的地方由参数这个东西假装取代。

    <?phpnamespace 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

 

 

 

 

 

 

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: