有向图最短路 bfs NOIP2014 道路搜索

1
在TP开发中,要追加一个应用模块,就在Action文件夹里建立一个类,类的文本命名格式是模块名称+Action.class.php。例如我们这边的采纳模块是Index,所以定义文件名为IndexAction.class.php

输入输出格式

输入格式:

输入文件名为road .in。

先是行有六个用一个空格隔开的整数n 和m ,表示图有n 个点和m 条边。

接下去的m 行每行2 个整数x 、y ,之间用一个空格隔开,表示有一条边从点x
指向点y 。

末段一行有六个用一个空格隔开的整数s 、t ,表示起源为s ,终点为t 。

输出格式:

出口文件名为road .out 。

输出唯有一行,包含一个平头,表示满足题目叙述的最短路径的长短。假如如此的门道不设有,输出-
1 。

Action:模块控制器类,你暂时可以领悟为一个Action文件表示着一个使用模块,Action文件中的每一个艺术(function)代表着一个操作,操作分为有出口到模板的操作和只具执行不需要输出的操作。对于有出口的操作,则意味着了你的项目中一个突显给用户选用的web页面。(注意:这不是专业的术语解释)

问题叙述

在有向图G 中,每条边的长短均为1
,现给定起源和终极,请您在图中找一条从起源到顶点的途径,该路线满意以下规则:

1 .路径上的所有点的出边所针对的点都直接或直接与极端连通。

2 .在满足条件1 的状态下使路径最短。

注意:图G 中或者存在重边和自环,题目保证终点没有出边。

请您输出符合条件的门路的长度。

Logs文件夹:项目中机动发出的日志文件会存放在此地。暂不必理会。

说明

解释1:

上图所示,箭头表示有向道路,圆点表示城市。起源1
与终点3 不联网,所以知足题

目描述的门道不存在,故输出- 1 。

解释2:

上图所示,知足条件的路子为1

  • >3- >4- >5。注意点2 不可以在答案路径中,因为点2连了一条边到点6
    ,而点6 不与终端5 连通。

对于30%的数据,0<n≤10,0<m≤20;

对于60%的数据,0<n≤100,0<m≤2000;

对于100%的数据,0<n≤10,000,0<m≤200,000,0<x,y,s,t≤n,x≠t。

 

有向图的最短路问题,第一次bfs判连通。

本身并不会对第二次搜索起名,就是依据第一次bfs的一个最短路吧。

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<queue>
 6 using namespace std;
 7 int n,m,s,e,cnt;
 8 int a[200010],b[200010],head[10010],w[10010];
 9 bool check[10010];
10 struct data{
11     int nex,to;
12 }edge[200010];
13 void add(int start,int end){
14     edge[++cnt].nex=head[start];
15     edge[cnt].to=end;
16     head[start]=cnt;
17 }
18 void bfs(){
19     queue<int>q;
20     q.push(e);
21     check[e]=1;
22     while(!q.empty()){
23         int p=q.front();
24         q.pop();
25         for(int i=head[p];i;i=edge[i].nex)
26             if(!check[edge[i].to]){
27                 q.push(edge[i].to);
28                 check[edge[i].to]=1;
29             }
30     }
31 }
32 bool judge(int x){
33     for(int i=head[x];i;i=edge[i].nex)
34         if(!check[edge[i].to]) return 0;
35     return 1;
36 }
37 void bfsbfs(){
38     queue<int>q;
39     memset(w,0x3f3f3f3f,sizeof(w));
40     w[s]=0;
41     q.push(s);
42     while(!q.empty()){
43         int p=q.front();
44         q.pop();
45         if(!judge(p)) continue;
46         for(int i=head[p];i;i=edge[i].nex)
47             if(w[edge[i].to]==0x3f3f3f3f){
48                 w[edge[i].to]=w[p]+1;
49                 q.push(edge[i].to);
50             }
51     }
52 }
53 int main(){
54     scanf("%d%d",&n,&m);
55     for(int i=1;i<=m;i++){
56         scanf("%d%d",&a[i],&b[i]);
57         add(b[i],a[i]);
58     }
59     scanf("%d%d",&s,&e);
60     bfs();
61     if(!check[s]){
62         printf("-1\n");
63         return 0;
64     }
65     cnt=0;
66     memset(edge,0,sizeof(edge));
67     memset(head,0,sizeof(head));
68     for(int i=1;i<=m;i++) add(a[i],b[i]);
69     bfsbfs();
70     if(w[e]!=0x3f3f3f3f) printf("%d\n",w[e]);
71     else printf("-1\n");
72     return 0;
73 }

 

4 与ThinkPHP同级新建一个文件夹,起名为 Myapp,也就是项目名称

 寻找道路

复制代码

输入输出样例

输入样例#1:

3 2  
1 2  
2 1  
1 3  

输出样例#1:

-1

输入样例#2:

6 6  
1 2  
1 3  
2 6  
2 5  
4 5  
3 4  
1 5  

输出样例#2:

3

4 提前先爽一下吗。再度使用PhpMyAdmin,在该表中插入一些数目
sql如下:

代码知识要点(摘自手册:ThinkPHP模板指南,此后的知识要点均来自TP官方手册,不再讲明)

5
打开浏览器输入地方:http://127.0.0.1/,我们可以看到,定义的模板变量已经输出来了。
外加补充知识:
1 倘诺要同时输出五个模板变量,可以采取下面的法子:

大概实操:

  1. <!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN”>
  2. <html>
  3. <head>
  4. <title>{$name}</title>
  5. </head>
  6. <body>
  7. 测试输出: {$name}
  8. </body>
  9. </html>
  1. <?php
  2. if (!defined(‘THINK_PATH’)) exit();
  3. return array(
  4. ‘DB_TYPE’=>’mysql’, // 使用的数据库是mysql
  5. ‘DB_HOST’=>’localhost’,
  6. ‘DB_NAME’=>’myapp’,// 数据库名
  7. ‘DB_USER’=>’root’,
  8. ‘DB_PWD’=>’123456’,// 填写您总是数据库的密码
  9. ‘DB_PORT’=>’3306’,

  10. ‘DB_PREFIX’=>’think_’, // 数据表表名的前缀
    请参见http://thinkphp.cn/Article/10

  11. );

  12. ?>

在html中,要输出$array[‘name’]的值,代码是

三创设数据表,并对项目举行部署,以便连接到数据库。

  1. <?php
  2.     // 定义ThinkPHP路径
  3.     define(‘THINK_PATH’,’./ThinkPHP’);
  4.     // 定义项目名称
  5.     define(‘APP_NAME’,’Myapp’);
  6.     // 定义项目路线
  7.     define(‘APP_PATH’,’./Myapp’);
  8.     // 加载入口文件
  9.     require(THINK_PATH.’/ThinkPHP.php’);
    1.     // 实例化这一个序列
    1.     $App = new App();
    1.     // 执行最先化
    1.     $App->run();
  10. ?>

你可以精晓为
http:// 服务器地址 / 入口文件地方 / 应用模块名称 /具体操作名称/ GET变量参数

1 下载TP1.5正式版

1
在Myapp/Tpl/default/下树立一个文本夹,按照使用模块的称号,我们将这个文件夹命名为Index

  1. $array = array();
  2. $array[‘name’]    =    ‘thinkphp’;
  3. $array[’email’]   =    ‘liu21st@gmail.com’;
  4. $array[‘phone’]   =    ‘12335678’;
  5. $this->assign(‘array’,$array);
  6. $this->display();

 

出于时日关系,此系列联合学习课程更新的进度会相比较慢些,请多原谅,上一章节的情节请看这里。
http://bbs.thinkphp.cn/viewthread.php?tid=4673&extra=page%3D1

复制代码

在添砖加瓦在此以前,我们有必不可少认识一下梯次文件夹的用处。

 

复制代码

那般,就足以在模板文件中而且输出name、email和phone两个变量。
2 大家接纳方面的变量定义,将所有数组定义为一个模板变量来输出

复制代码

config.php代码如下:

3 将以此数组循环输出

  1. class IndexAction extends Action{
  2.     public function index(){
  3.     }
  4. }

这行字。并自动为你创制好项目标目录。接下来,我们以此序列添砖加瓦。

智能形式下的URL基本社团是这样的
http://servername/appName/moduleName/actionName/params

1
我们这里运用的是Mysql数据库,利用PhpMyadmin新建一个数据库,名称为myapp。
起名,行使示例主题中的sql如下:

  1. <!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN”>
  2. <html>
  3. <head>
  4. <title>{$name}</title>
  5. </head>
  6. <body>
  7. <iterate name=”array” id=”vo”>
  8. {$vo}<br />
  9. </iterate>

  10. </body>

  11. </html>

http://127.0.0.1/index.php/Index/index

复制代码

注意:以下的步骤,仅仅是TP灵活的布署形式之中一种,实际支付中可以遵照自己的气象去重新设定。
关于怎么那么做,大家会在最后再作总括,我觉着先实操然后再拓展认证相比便于精晓。以下不再重复解释。

Conf文件夹:项目标周转配置文件config.php将放在那一个文件夹里,(还有路由配置,调试配置等,请先忽略)

  1. INSERT INTO `think_form` (`id`, `title`, `content`,
    `create_time`, `update_time`, `status`, `email`) VALUES
  2. (1, ‘这是测试数据’, ‘dfdf’, 1212724876, 0, 1, ‘dddd@ddd.com’);

 

本条体系,伊始定下的对象为,从零初步,以TP示例主旨中的Form为例举行讲解,以履行为主,理论为辅,
将TP的最中央内容逛四回,至少让我们一起学会怎么样进展最简易的对数码举行查、增、改、删操作并出口到模板。

TP: ThinkPHP框架的简称

出于大家说的是稳中求进,所以我用步骤式来表达,只要一步一步跟着做,相信聪明的你在行使过程中就会知晓TP的运用了。

  1. $this->display();

4 打开Myapp/Tpl/default/Index/index.html文件,代码为

2 拟好你的项目名称,大家这里以 Myapp 为项目名称

 

前几天先到此处,下一步我们继续稳步前进。让我们一并把那些Form最终变成一个有会员效能的留言板。

.htaccess.rar (248 Bytes)

[教程] 一步一步循序渐进学习TP二(新手篇)

开拓Myapp/Lib/Action/IndexAction.class.php文件,我们看看其中的底子代码

============================================

Common文件夹:你的档次中要用到的要好写的函数,可以在这么些文件夹下创设一个名为common.php文件,
在那一个文件中书写函数,这多少个函数可以用在您项目标各连串,同时也可以在模板变量中采取,TP框架会活动加载。

  1. {$array.name} 或 {$array[‘name’]}

3.2 将Myapp/Tpl/default/Index/index.html代码更改如下:

3.1 IndexAction.class.php中代码更改如下

其三节 配置项目,连接数据库。

  1. <?php
  2. class IndexAction extends Action{
  3.     public function index(){
  4.         $array = array();
  5.         $array[‘name’]    =    ‘thinkphp’;
  6.         $array[’email’]   =    ‘liu21st@gmail.com’;
  7.         $array[‘phone’]   =    ‘12335678’;
  8.         $value  =   ‘hello,ThinkPHP’;
  9.         $this->assign(‘array’,$array);
    1.         $this->assign(‘name’,$value);
    1.         $this->display();
    1.     }
    1.     public function test(){
    1.         header(“Content-Type:text/html; charset=utf-8”);
    1.         echo ‘哈,访问正确!!’;
    1.     }
  10. } // 类定义end

  11. ?>

 

前言
TP的手册分外多,其实无须再出如此的贴子,论技术,我也是菜鸟一个,同时也在学习当中。
观望论坛上多了成千上万新情人,不少在抱怨手册看不懂,这我就姑且抛砖引玉,尝试与新情人们更简短地、手把手地进入TP的采纳中去。讲解过程中有错的地点,大家帮忙指正。

—復苏内容开首—

  1.  
  2. <?php
  3. class FormModel extends Model {
  4. }
  5. ?>

第四节简单询问TP的模版输出
上一章节我们提及到,

名词解释:

普通一个应用模块中,会有多少操作(function)需要有与用户交互的页面,这就需要运用模板输出,
TP本身已松手了一套拥有TP特色的,很强大易扩展但运用特别便利兼简单的沙盘引擎。

TP匡助四种URL访问方式,默认是智能形式,所以我们就那种形式举办简单表达。

TP中的每一个xxxAction.class.php文件表示着一个选拔模块,此Action中的每一个艺术(function)代表着一个操作,操作分为有出口到模板的操作和只具执行不需要输出的操作。

// 下边的写法是一模一样的

 

  1. CREATE TABLE `think_form` (
  2.   `id` smallint(4) unsigned NOT NULL auto_increment,
  3.   `title` varchar(255) NOT NULL,
  4.   `content` varchar(255) NOT NULL,
  5.   `create_time` int(11) unsigned NOT NULL,
  6.   `update_time` int(11) unsigned NOT NULL,
  7.   `status` tinyint(1) unsigned NOT NULL,
  8.   `email` varchar(50) NOT NULL,
  9.   PRIMARY KEY  (`id`)

  10. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;

  1. <?php
  2. class IndexAction extends Action{
  3.     public function index(){
  4.         $form = D(‘Form’)->findall();
  5.         dump ( $form );
  6.         exit;
  7.     }
  8. }
  9. ?>

Lang文件夹:项目标语言设置目录,先不要理会。

 

Data文件夹:TP会把品种的数据库表字段生成到此地,此外。。。这么些先不要理会。

 

5 在www根目录下,成立一个PHP文件,起名index.php,那就是进口文件

  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>

进口文件index.php代码:

名词解释:

摸底这个理论后,大家先简单实操一下那一个文化。

第五节起头摸底URL如何访问模块操作

有关1.6的施用可以下载快捷入门教程,是此体系新手篇的完全版,并且附有示例源码。

第六节 CURD知识之一 C 创建(create)

从这一节起始,我们将要涉及到数据库操作,TP对数据库的操作分外便利,以下是部分基础知识讲解。

名词解析:
1  CURD:表示数据库五个基本操作:创造:create,更新:update,读取:read,删除:delete

2  模型对象:即数据对象,你项目里每一个Model类文件都会对应着一个数据表(或者视图),模型与数量表存在一种炫耀关系。TP约定了命名要依照一定的业内,假如不适合,则需要基于气象展开额外的应和设置。例如Model类的tableName属性

在第三节时,曾略为涉及Model类文件命名,现在再记念一下这一部分的情节:
我们在此之前在数据库中,已建立了一个think_form数据库表,并且在部署文件config.php中,大家定义了数据表的前缀是think_,
模型类(Model)文件的命名规则是:

不包括前缀的数据库表表名还要首字母大写+Model.class.php

从而以前我们为think_form数据表在Myapp/Lib/Model目录下树立一个文本FormModel.class.php

模型类的不同通常命名还足以智能识别驼峰式的表命名,倘使我们有个是近乎think_new_table这样的表
能够命名为NewTableModel.class.php。默认配置便可以智能识别自动对应think_new_table表,由此不要修改配置。

支付过程中,只要简单地定义好与数据表对应的模子类(xxxModel.class.php),就能够展开对数码操作了。
何以让这么些模型支撑电动验证,自动填充,自动过滤那么些知识,在底下涉及到时会作相应讲解。

一般的话,在表中添加多少都是由此表单来确立,为了更直观地上学CURD中的C,大家接下去建立个表单来举行添加数据的操作。
事先我们已在Myapp/Lib/Model/下创设好FormModel.class.php类—-模型(M)
并且也在Myapp/Lib/Action/下添加了一个Index应用模块和写下了一个index操作—-控制器(C)
并且在Tpl目录下树立了与之对应的模板目录Index及index.html模板文件 ——-视图(V)
MVC格局的开销已显示了出来。
tdweb曾简要地包括了TP中这三者的关系,

C的效用,就是从M中取得数据到V,

采用TP以表单提交数据到库,流程和你所掌握的表单提交没有怎么区别,只是TP简化了数量操作的处理过程。
咱俩在实际操作中体会一下。
先来探视我们所定义的数额表form的字段:

  1. ‘id’,//自动编号
  2. ‘title’,//标题
  3. ‘content’,//内容
  4. ‘create_time’,//成立时间
  5. ‘update_time’//更新时间
  6. ’email’,//邮箱
  7. ‘status’,//状态

复制代码

其中的create_time字段是为着记录数据插入的时日,我们得以利用TP的多少自动填充来处理。

在Model类定义 $_auto
属性,可以完成数据自动处理效果,用来拍卖默认值和其余系统写入字段。
留意1:该活动填写可能会覆盖表单提交项目。其目的是为了防备表单非法提交字段。
瞩目2:要运用Model类的create方法创制数量对象的时候才会活动举办表单数据处理。

1 打开Myapp/Lib/Model/FormModel.class.php文件,更改代码为

  1. <?php
  2. class FormModel extends Model {
  3. // 自动填写设置
  4. protected $_auto  =  array(
  5.   array(‘status’,’1′,’ADD’),
  6.         array(‘create_time’,’time’,’ADD’,’function’),
  7. );
  8. }
  9. ?>

复制代码

代码知识要点:
Model类的$_auto属性由五个填充因子组成的数组,填充因子定义格式:

array(填充字段,填充内容,填充条件,附加规则)

填充字段:就是急需开展处理的表单字段,这些字段并不一定假若数据库表中的字段,对于表单内的帮手检测字段比如重复密码和验证码也可以处理。
填充条件:ADD | UPDATE | ALL(注意,此是1.5本子表明,1.6已改为1 2
3,后续教程有认证)
当为ADD时,会在增产多少时自动填充,这是默认的处理格局
当为UPDATE时,在革新数据的时候会活动填写
当为ALL时,所有情形下都会展开机动填写

叠加规则:外加规则是本着填充内容而言,表示该内容填充的法门,包括function,callback,field,string
对于field使用其余字段举行填空和string直接标示字符串作为值举办填写很好明白。例如地点

  1. array(‘status’,’1′,’ADD’),

复制代码

哪怕将情状status字段的值直接以1填充.

下边重要说说function与callback这多少个附加规则。

  1. protected $_auto  =  array(
  2. array(‘create_time’,’time’,’ADD’,’function’),
  3. );

复制代码

上面create_time代表了要处理的字段,填充内容是time,附加规则是function使用函数,填充条件是ADD新增时处理,那么整行代码表示对create_time字段在增产的时候使time函数作为该字段的值举办活动填写。
再看一个function作为附加规则的例证

  1. protected $_auto  =  array(
  2. array(‘password’,’md5′,’ADD’,’function’),
  3. );

复制代码

当使用function作为附加规则时,第二个填充内容就意味着了这多少个因子是一个函数名称,该函数的参数就是表示填充字段的值,比如password的值是123456,则上边的代码会先将那多少个值使用函数md5(‘123456’),这样处理后再插入到数据表中去。
对此function(函数)和callback(回调方法)理论是一模一样的,只可是一个是意味填充内容所写的是函数名,另一个是表示填充内容是类中的方法名。函数可以是PHP5内置函数或你自己所写的函数。而callback是现阶段模型类所能调用的一个办法。 关于数据填充方面的详细资料,请参见官方使用手册
《ThinkPHP数据操作指南》

2 打开Myapp/Tpl/default/Index/index.html文件,大家修改代码将form写进去

  1. <!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN”>
  2. <html>
  3. <head>
  4. <title>{$title}</title>
  5. </head>
  6. <body>
  7. <form action=”__URL__/add” method=”post” name=”formname”
    id=”formname”>
  8.     <p>
  9.            <label for=”title”>标题:</label>
    1.            <input name=”title” type=”text” id=”title” />
    1.     </p>
    1.     <p>
    1.            <label for=”email”>邮箱:</label>
    1.           <input name=”email” type=”text” id=”email” />
    1.     </p>
    1.     <p><label
      for=”content”>内容:</label></p>
    1.     <p>
    1.         <textarea name=”content” rows=”5″ cols=”25″
      id=”content” class=”textarea” ></textarea>
    1.     </p>
    1.     <p><input type=”submit” value=”提交”
      /></p>
  10. </form>

  11. </body>

  12. </html>

复制代码

在上头代码中,我们大概地建了一个form表单,并将标题统一使用一个模板变量{$title}。
action提交到的拍卖地点是__URL__/add,其中__URL__是一个常量定义,表示近日模块地址,TP模板引擎会自动将这句解释为/index.php/Index/add,常见的沙盘使用的常量有

__ROOT__    网站根目录地址
__APP__         当前项目(入口文件)地址
__URL__         当前模块地址
__ACTION__   当前操作地址
__SELF__       当前 URL 地址

3 设置模板变量 {$title} ,扩张add操作方法

打开Myapp/Lib/Action/IndexAction.class.php文件,修改代码如下

  1.  
  2. <?php
  3. class IndexAction extends Action{
  4.     public function index() {
  5.        
       $this->assign(‘title’,’添加数据’);//这里设置了模版变量{$title}
  6.            $this->display();
  7.     }
  8.     // 处理表单数据的主意
  9.     function add()  {
    1.           $Form = D(“Form”);
    1.           if($Form->create()) {
    1.                    $Form->add();
    1.                    $this->redirect();
    1.           }else{
    1.                    header(“Content-Type:text/html;
      charset=utf-8”);
    1.                    exit($Form->getError().’ [ <A
      HREF=”javascript:history.back()”>返 回</A> ]’);
    1.          }
    1.     }
  10. }//类定义 end

  11. ?>

复制代码

代码知识要点:
模板变量赋值前边的章节已介绍过。这里就不啰嗦了。

俺们来探视add方法的代码。
$Form = D(“Form”);
此地运用了TP的特性单字母函数D,是操作数据库时最常用的TP函数,表示实例化Form对象,
即$Form = new FormModel();
D函数的现实性代码可以查阅ThinkPHP目录内的common/function.php中的片段,
它会活动引入Model类,并判断在此之前如若实例化过这几个Model,就不再实例化,若然该Model不存在,就会抛出特别错误,此外,D可以跨体系访问Model,暂且忽略。

$Form->create()
应用Model类的Create方法创制一个Form对象,战败会回到false。

$Form->add(); //add方法会将表单数据开展写入
$this->redirect(); //执行跳转
就这样简单几行代码,便完成了对数码插入的处理。
明日我们可以尝尝一下在表单中输入数据开展提交试试了。
请先随便插入几条数据,以便下一节我们后续深造CURD中的R

 

 

 

=============================================

复制代码

复制代码

如此这般说应该很清楚了,不过别让这么多index给混乱咯,对应URL的构造去领会每一个index的函义,同时注意分寸写

借使你的服务器环境协理rewrite,使用http://127.0.0.1/Index/index就可以正常访问到Index模块的index操作了。
    此后我们的读书中用到的URL,都是假若你使用了rewrite的状态。

复制代码

进口文件:你可以清楚为这一个项目标绝无仅有一道门,将来所有的操作都会透过这道门去实践处理。
不用理会什么看头,你甚至可以先把它看作是index.php就是进口文件

1
打开Myapp/Lib/Action/IndexAction.class.php文件,在index这个function下再添加一个操作test

复制代码

首先节  疾速先河一个门类

复制代码

  1. $array = array();
  2. $array[‘name’]    =    ‘thinkphp’;
  3. $array[’email’]   =    ‘liu21st@gmail.com’;
  4. $array[‘phone’]   =    ‘12335678’;
  5. $this->assign($array);

第六节 CURD知识之一 C 成立(create)

复制代码

Lib文件夹:应用类库目录,在那文件夹内还有五个文件夹:Action和Model,Action目录放置命名为xxxAction.class.php的控制器文件,Model目录放置对应数据库表的命名为xxxModel.class.php的类公事。

//
模板变量赋值后就需要调用模板文件来输出相关的变量,模板调用通过display方法来促成


在应当模块中,假设某个操作是需要页面展现的,只要对应在Myapp/Tpl/default/里创建一个文件夹,文件夹以应用模块的称呼来定名,然后在这么些文件夹下,建立一个以那些function名称来命名的html文件,就足以在这个格局中接纳$this->display()方法来直接调用该模板。(当然也可以调用另外模块下的另外模板或显式指定模板文件地点和称号,由于是循序渐进式的求学,就让我们先忽略吧)

在Action类里面使用
assign方法对模板变量赋值,无论何种变量类型都合并使用assign赋值。

复制代码

对此TP的沙盘引擎输出先简单询问到这里。

——————– 基于本学习体系1-4连片到本节的补偿表达

注解1 从这节起始,TP或dev这六个简称指的都是ThinkPHP 1.6版,
可以到svn下载。http://thinkphp.googlecode.com/svn/branches/dev

下载后删除原来的ThinkPHP框架文件,将dev同样命名为ThinkPHP,并仍是停放于网站的根目录下。
其余,为了便于需要时得以对实例截图而不引起读者你误会,基于自身的网站目录结构,现将Myapp的index.php地方变动到Myapp文件夹下(不再是原来的根目录).
步1:将根目录中的原index.php剪切并粘贴到Myapp文件夹下。更改代码为:

  1. <?php
  2.     // 定义ThinkPHP路径
  3.     define(‘THINK_PATH’,’../ThinkPHP’);
  4.     // 定义项目名称
  5.     define(‘APP_NAME’,’Myapp’);
  6.     // 定义项目路线
  7.     define(‘APP_PATH’,’.’);
  8.     // 加载框架入口文件
  9.     require(THINK_PATH.’/ThinkPHP.php’);
    1.     // 实例化这些类型
    1.     $App = new App();
    1.     // 执行初阶化
    1.     $App->run();
  10. ?>

复制代码

代码补充注释:代码中项目名称其实是可以不要定义的,系统会自动依据近期的目录名定义名称。
步2: 将.htaccess文件复制一份粘贴到Myapp目录下。
步3: 将Cache目录,Temp目录,Data目录清空。

证实2 第五节中对于URL访问的默认形式
在dev版默认配置中,dispatch即URL调度功效是倒闭的,所以在默认格局下,要访问Index模块的index操作,地址应是:index.php?m=index&a=index,m指的是模块变量(Model),a指的是操作变量(Action)。
假定要运用类似第五节中的index.php/moduleName/actionName模式,则要在config.php文件里安装DISPATCH_ON为true;
并且,也只有敞开了此效能后,URL_MODEL的设置才会使得。
(在上头的章节大家提及过,可以设置URL_MODEL为2来行使rewrite成效去除呈现index.php)
故此,现在大家的config.php代码是

  1. <?php
  2. if (!defined(‘THINK_PATH’)) exit();
  3. return array(
  4.     ‘DB_TYPE’=>’mysql’, // 使用的数据库是mysql
  5.     ‘DB_HOST’=>’localhost’,
  6.     ‘DB_NAME’=>’myapp’,// 数据库名
  7.     ‘DB_USER’=>’root’,
  8.     ‘DB_PWD’=>’123456’,// 填写您总是数据库的密码
  9.     ‘DB_PORT’=>’3306’,
    1.     ‘DB_PREFIX’=>’think_’, // 数据表表名的前缀
      请参见http://thinkphp.cn/Article/10
    1.     ‘DISPATCH_ON’=> true,
    1.     ‘URL_MODEL’=>2,
    1.     ‘TMPL_VAR_IDENTIFY’=>’array’,// 模板变量识别
      留空自动判断 array 数组 obj 对象
    1.     ‘DEBUG_MODE’=>true,//开启调试格局
  10. );

  11. ?>

复制代码

代码补充注释:此节将来的情节会波及到模板输出及数量操作,所以在这边肯定设置了模版变量为数组,并打开TP的调试模式。

留神3:第六节 CURD知识之一 C(创设)中的自动填写
dev版的电动填写功用已移到AdvModel类中。要选用此效能,大家需要在Myapp/Lib/Model类文件中引入该类.
这就是说再来看看大家所定义的数额表form的字段:

  1. ‘id’,//自动编号
  2. ‘title’,//标题
  3. ‘content’,//内容
  4. ‘create_time’,//创制时间
  5. ‘update_time’//更新时间
  6. ’email’,//邮箱
  7. ‘status’,//状态

复制代码

引用tdweb手记:

设若需要新建数据时自动填写时间戳,只需要安装数据表字段名”create_time”,即使急需修改时自动保存时间戳,那么设置数据表字段名为”update_time”。
只要您的数量表字段名不是默认的,那么需要指定,例如
protected $autoCreateTimestamps = ‘ctime’;
protected $autoUpdateTimestamps = ‘utime’;

为此,让大家开辟Myapp/Lib/Model/FormModel.class.php文件,将代码更改为如下:

  1. <?php
  2. // 导入AdvModel类
  3. alias_import(‘AdvModel’);
  4. class FormModel extends AdvModel {
  5. /* 假如数据表的 成立时间
    字段不是create_time,需要其它设置成如下格局*/
  6.     //protected $autoCreateTimestamps = ‘ctime’;
  7.     // 自动填写设置
  8.   protected $_auto  =  array(
  9.   array(‘status’,’1′),//自动填写的概念规则请参见第六节内容
    填充规则有所不同,见附注

  10. );

  11. }

  12. ?>

复制代码

代码补充注释:
专注:dev版的填写条件改为1 新增 2 更新 3
包含1和2,默认为新增。所以定义更方便了.而采取ADD | UPDATE |
ALL会无效的(TO大运表哥:TP代码还有一个特色就是函数或艺术的命名很合乎语言应用习惯,原来的add,update,all很直观,易记,可惜没了)
array(‘field’,’填充内容’,’填充条件’,’附加规则’,[外加参数])

alias_import($alias,$classfile=”)高速定义和别名导入 

这是新增的函数,我尝试注明一下,不科学请指正。
该函数可以动态设置文件列表导入和平昔导入文本,常会用到的文件别名有

‘Page’                  分页类     Page.class.php’,
‘ViewModel’        视图模型类 ViewModel.class.php’,
‘AdvModel’          高级模型类 AdvModel.class.php’,
‘RelationModel’   关联模型类 RelationModel.class.php’,

当要引入已定义别名的公文,大家只要直接在参数中传送别名就行了。
别名可以自动在ThinkPHP/Common/alias.php中扩充。
而外选择已定义的别名外,也足以行使动态指定。

  1. alias_import(‘zzg’,APP_PATH.’/Lib/ORG/zzg.php’);

复制代码

或一回引入三个公文

  1. $ailias=array(
  2.     ‘Abc’=>   APP_PATH.’/Lib/ORG/abc.php’,
  3.     ‘Efg’ =>  APP_PATH.’/Lib/Other/efg.php’,
  4. );
  5. alias_import($ailias);

复制代码

注:指定文件或别名不存在时会重返false

好像的函数还有
import($class,$baseUrl = ”,$ext=’.class.php’)

天命二哥语:由于性能问题,那一个措施将来不再帮忙

那是ThinkPHP内建的类库和文书导入的一个函数,具有缓存和检测机制,相同的文本不会另行导入,争辩时会指示错误。使用这办法时,系统会自动识别导入类库文件的地点:
Think 代表TP框架基类库 即ThinkPHP/Lib/Think目录
ORG 代表第三方共用类库 即ThinkPHP/Lib/ORG目录
@ 代表当前项目类库,例如Import(“@.Action.xxxAction”)
—-即Myapp/Lib/Action/xxxAction.class.php
@指的是当前项目名称,这和动用Import(“Myapp.Action.xxxAction”)是如出一辙的。
TP的预定是Think、ORG等导入的是以系列(TP)基类库为相对起首目录,否则就觉着是项目(Myapp)应用类库为起先目录。
瞩目1 运用时要留心文件名的轻重缓急写
注意2
Import会自动将.转换为/,就算文件名中含有.,则要将.改为#才能正常导入。
留神3 导入的类公事后缀默认是.class.php

2 第三方框架类库导入:vendor($class,$baseUrl = ”,$ext=’.php’), 开局目录统一是ThinkPHP/Vendor
默认后缀是.php
注:vendor也利用了Import函数。因而…

证实3,原来的模版文件index.html保持不变,因为我们已启用了DISPATCH_ON开关。
仅将Myapp/Lib/Action/IndexAction.class.php代码更改如下

  1. <?php
  2. class IndexAction extends Action{
  3.     public function index()
  4.     {
  5.         $Form = D(“Form”)->select();
    //也可以D(“Form”)->findAll()
  6.         dump ( $Form );// 输出查询结果
  7.         $this->assign(‘title’,’添加数据’);//定义标题的模板变量
  8.         $this->display();// 渲染模板
  9.     }
    1.     // 插入数据
    1.     function add()
    1.     {
    1.         header(“Content-Type:text/html;
      charset=utf-8”);//为了唤起时不乱码
    1.         $Form = D(‘Form’);//实例化Form模型
    1.         $vo  =   $Form->create();//成立数量对象
    1.         if(false === $vo) {
    1.                exit($Form->getError().’ [ <a
      htef=”javascript:history.back()”>返 回</a> ]’);
    1.         }
    1.         $rs =  $Form->add();//插入数据
    1.         if ($rs) {
    1.             redirect(‘/Myapp/’,2,’数据增长成功!’);
    1.         }else{
    1.             exit($Form->getError().’ [ <a
      HREF=”javascript:history.back()”>返 回</a> ]’);
    1.         }
    1.     }
  10. }//类定义 end

  11. ?>

复制代码

代码补充解释:

select($options=array());

为了便于查看数据,index操作中采用到了一个主导查询格局

tdweb语:select()方法代替了在此以前相比较盛行的findAll(),不传任何参数则是取得全部数量。

咱俩仍是渐进,具体有关查询的方法会在使用的时候陆续一起读书。

dump($var, $echo=true,$label=null,
$strict=true)
函数。浏览器友好的变量输出。
当唯有一个$var参数时,会一贯打印那么些$var。
dump($Form);会输出接近

  1. array(1) {
  2.   [0] => array(7) {
  3.     [“id”] => string(1) “1”
  4.     [“title”] => string(18) “这是测试数据”
  5.     [“content”] => string(4) “dfdf”
  6.     [“create_time”] => string(10) “1212724876”
  7.     [“update_time”] => string(1) “0”
  8.     [“status”] => string(1) “1”
  9.     [“email”] => string(12) “dddd@ddd.com”
    1.   }
  10. }

复制代码

也得以安装参数
dump($要出口的变量, 是否直接打印0或1,变量说明 ,
是否以正规数组情势0,1)
例如:

  1. dump($Form,1,’Form数据’,0);

复制代码

出口接近

  1. Form数据 Array
  2. (
  3.     [0] => Array
  4.         (
  5.             [id] => 1
  6.             [title] => 这是测试数据
  7.             [content] => dfdf
  8.             [create_time] => 1212724876
  9.             [update_time] => 0
    1.             [status] => 1
    1.             [email] => dddd@ddd.com
    1.         )
  10. )

复制代码

$vo = $Form->create();

开创数量对象 但不保留到数据库
模型类的create方法,假如没有设值,则默认是由此表单提交的数据$_POST举行创办。
再者Create方法也支撑从任何情势例如数据对象或者数组等来创设,
对那格局与tdweb的传教有些不一致,望指正。

鉴于简洁版并不自动生成多少表data缓存,所以只要您用create()而不给她传递任何值,仅仅凭借$_POST拿到值,那么不论你的表单POST什么,程序都会以为是数据库的字段拼入QL,所以,尽管你POST过来的数额而数据表里没有这一个字段,则会晤世增长退步。

但本身看出代码里似乎已自行过滤不适合的数码,并测试过添加数码表里没有的字段没有出现增长失利。
redirect(‘/Myapp/’,2,’数据增长成功!’); 跳转函数。
函数原型:redirect($url,$time=0,$msg=”)
看参数就已经很明白了。

连接篇就先到这边,提议大家多点动手实际操作和看望源代码。

下一节咱们再持续,请各位务必多多指教。

 

 

  1. <?php
  2. class IndexAction extends Action{
  3.     public function index(){
  4.         $array = array();
  5.         $array[‘name’]    =    ‘thinkphp’;
  6.         $array[’email’]   =    ‘liu21st@gmail.com’;
  7.         $array[‘phone’]   =    ‘12335678’;
  8.         $value  =   ‘hello,ThinkPHP’;
  9.         $this->assign(‘array’,$array);
    1.         $this->assign(‘name’,$value);
    1.         $this->display();
    1.     }
  10. }

  11. ?>

 

复制代码

[教程] 一步一步循序渐进学习TP三(新手篇)

  1. <?php
  2. class IndexAction extends Action{
  3.     public function index(){
  4.         $value  =   ‘hello,ThinkPHP’;
  5.         $this->assign(‘name’,$value);
  6.         $this->display();
  7.     }
  8. }
  9. ?>

2
尝试对应URL结构,来访问这一个test操作,假使能得逞看到echo的文字。则这节大家又学会了多或多或少知识。

叠加知识点:
    去掉URL里面的index.php
    要去掉URL里的进口文件index.php,使URL类似这样的款式 
 http://127.0.0.1/Index/index
    可以按法定手册所提供的法门开展如下操作。
    1 肯定httpd.conf配置文件中加载了mod_rewrite.so模块
    2 AllowOverride None 将None改为 All
    3 打开Myapp/Conf/config.php文件,在配备的数组中添加一行:
    ‘URL_MODEL’=>2,
    在输入文件所在的同级目录下,新建一个.htaccess文书,内容是

二简约认识项目里的逐条文件夹

第四节 简单了然TP的模版输出

品类:你要支付的系统,称之为项目。

开辟浏览器,输入http://127.0.0.1/,看,数据给输出来了。

 

3
在Lib/Model目录下,创设一个文件,命名为FormModel.class.php。命名规则刚才您已看了一次。
此间就不再多说,我们可以看出,数据表名是think_form,由于我们安排了数据表表名的前缀为think_,
由此文件的命名直接使用 “不含前缀的数目表表名+Model.class.php”就行了。
在那些文件中书写代码:

代码知识要点:
模板变量使用{$变量名称}那种标签举行输出。
不同的模板变量类型,使用不同的价签,标签可以自行此外定义,暂且不理会。

打开Myapp文件夹,里面TP已让你很省心地构建了最大旨的目录。其中:

 

解释一下上边文字中所译的URL结构,
为啥appname项目名称我将它译成了入口文件地点:平常意况下,大家的进口文件index.php都是位于根目录中,这时项目名称就会被输入文件index.php所替代。在前几节里,我们已知道,一个Action文件就是一个用到模块,而拔取模块中的每个方法(function)就是一个具体操作。因而,尽管要访问大家实例中的Index模块下的index操作。地址应该是

然后大家开辟Myapp/Lib/Action/IndexAction.class.php文件,将中间的内容删掉。改成下边这样:

2
在Conf文件夹内,建立一个config.php文件。这一个文件,就是Myapp项目标配置文件。系统会自动加载
config.php文件中的配置是以数组再次回到形式展开定义,会覆盖TP框架中的common目录下convention.php的默认配置。没有设置的配备,就以默认为准。配置安装可以采纳C函数动态改变,暂且不必理会。
而我们连接受数据库的安装也是在这一个文件中书写。

复制代码

复制代码

就如此定义一个类名就行了。该类继承了Model类。至于自动验证,自动过滤,自动填写那多少个,暂且不理睬。

  1. $this->name = $value ;

一  高效先导一个类别

[教程] 一步一步循序渐进学习TP四(新手篇)

 

先是节  神速伊始一个门类

其次节 简单认识项目里的各样文件夹

其三节 配置项目,连接数据库。

第四节 简单询问TP的沙盘输出

第五节 起头询问URL怎么着访问模块操作

只顾:看到许多留言说操作不成功或出错,请别忘记,此体系教程出来时,TP1.6还没出来,所以一连串6事先所介绍的演示和操作都依然正式版本1.5的,如若你采纳1.6版,请对应两者差别性。
例如submit无法有name属性,是因为原本1.5有字段缓存举行过滤处理。1.6尚未了字段缓存。
比如说数据自动验证和自行填写都有了自然的区别。

2
在Myapp/Tpl/default/Index/下树立一个html文件,按照操作名称,我们命名该公文为index.html

就如此简单几行,然后打开浏览器,输入http://127.0.0.1/
一个TP项目就如此构建出来了。你会晤到

2
应用模块类的定义要持续框架的Action类。要为那些利用模块添加一个操作,则定义一个这多少个操作为命名的function.例如地点的index操作。

3 打开Myapp/Lib/Action/IndexAction.class.php文件,修改代码为

[教程] 一步一步循序渐进学习TP六(新手篇/1.6版)

在上一节实操中,大家已成功插入了多条测试的数据,不过很明显,大家发现其间的邮箱地址一项不适合格式也可以交给,这当然不是我们所期望见到的,那时我们得以采取TP的数额自动验证功效去决定用户输入。
而往日已提交的数码,也足以经过编制数据将原本错误格式的邮箱地址重新改变为科学的email,这个处理让大家都位于下一节的多寡编辑中一起读书。

此前,先来看看TP最基本的数码查询。

8 节数据查询(CURD之R)
TP的询问很人性化地分为单数据重回或多多少再次来到,视乎自己项目过程中的实际需要,遵照这多重教程的读书习惯,我们仍是在实际操作中去打听,以代码来读书,一起出手吧。

1
先将Myapp/Lib/Action/indexAction.class.php代码稍作修改,以利于更直观地翻看查询结果。

  1.     public function index()
  2.     {
  3.         $Form = D(“Form”);
  4.         $data   =   $Form->order(‘id desc’)->select();
  5.         $this->assign(‘data’,$data);
  6.         $this->assign(‘title’,’添加数据’);
  7.         $this->display();
  8.     }

复制代码

2
在第四节时,我们通晓过模板变量的循环输出,现在选用这知识点将相应的模板文件Myapp/Tpl/default/Index/index.html修改如下

  1. <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
    http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
  2. <html xmlns=”http://www.w3.org/1999/xhtml"&gt;
  3. <head>
  4. <meta http-equiv=”Content-Type” content=”text/html;
    charset=utf-8″ />
  5. <title>{$title}</title>
  6. <style type=”text/css”>
  7. h3{color:green;}
  8. .box{width:600px;margin:10px auto;border:1px dashed
    #e8e8e8;padding:5px;}
  9. .submit{height:2em;padding:0 5px;cursor:pointer;}

  10. </style>

  11. </head>

  12. <body>

  13. <form action=”__URL__/add” method=”post” name=”formname”
    id=”formname” class=”box”>

    1.     <p><label
      for=”title”>标题:</label><input name=”title”
      type=”text” id=”title” /></p>
    1.     <p><label
      for=”email”>邮箱:</label><input name=”email”
      type=”text” id=”email” /></p>
    1.     <p><label
      for=”content”>内容:</label></p>
  14. <p>

    1.         <textarea name=”content” rows=”6″ cols=”50″
      id=”content” class=”textarea” ></textarea>
    1.     </p>
  15. <p><input name=”submit” type=”submit” value=” 提交 ”
    class=”submit” /></p>

  16. </form>

  17. {//Form表数据循环输出}

  18. <iterate name=”data” id=”vo”>

  19. <div class=”box”>

  20. <h3>NO.{$vo.id}:{$vo.title}</h3>

  21. <p>———–由 {$vo.email} 发表于:
    <em>{$vo.create_time|date=’Y-m-d’,###}</em></p>

  22. <p>内容:</p>

  23. <p>{$vo.content}</p>

  24. </div>

  25. </iterate>

  26. </body>

  27. </html>

复制代码

在浏览器中输入http://127.0.0.1/Myapp/,可以看到现在已将数据显示在模板了

 

此刻我们只要每输入一条数据音信,就会遵照id倒序的方法显示在模板上。

—复苏内容停止—

复制代码

Tpl文件夹:模板文件目录,内有一个default文件夹,也就是默认的作风。
品类转移的目录结构就先简单介绍到此地,下一步我们要简明地对项目举行最大旨的配备。

第二节 简单认识项目里的相继文件夹

Model:数据表相对应的Model类,可以知晓为一个Model文件对应着您项目数据库的内部一个表。命名关系请参见这里:http://thinkphp.cn/Article/10

透过前边的学习,我们已大体地精通了动用模块中的操作与模板怎样对应。
而这一节将简单讲解咋样通过URL来拜访操作。由于我们要循序渐进,所以先只介绍下面章节要用到的文化,要想深切学习还请参见官方手册《URL设计和SEO帮助》

理论知识:

  1. ^_^ Hello,欢迎使用ThinkPHP!

代码知识要点:
name=’array’是指要循环的模版变量是array,id=’vo’是指这多少个数目在模板输出时所运用的称呼

复制代码

复制代码

 

  1. $this->assign(‘name’,$value);

PHP开发,无非是对数据库使用了逻辑控制的增删改查和拔取模板输出数据内容。
普普通通数据的插入都是透过表单来开展添加。表单提交涉及到页面显示,
为此这一节我们临时放下对数据库的操作讲解,先来大概学习一下TP的模板引擎的变量输出。

复制代码

3 在www根目录下,将TP框架所有文件全体复制过去,文件夹名称是ThinkPHP

倘使进口文件不是在服务器的根目录,而是在myapp目录下,那么入口文件地点就是
Myapp/index.php,此时下面的URL访问就相应要换成
http://127.0.0.1/Myapp/index.php/Index/index

[教程] 一步一步循序渐进学TP五(从标准版过渡到1.6版)

很对不起!不得不出这一篇过渡作品。
为了让这连串教程不致于日后会误导,从那节起头,让我们转型到1.6版的使用方法上。
不过对于1.6版的拔取,我也是在摸索当中学习,错误和不足之处肯定会相比较多,
故恳请流年三哥和tdweb,东至,yhustc等大大可以即时指正和补充,在此先谢谢了。

Cache文件夹:项目自动生成的模版缓存会油可是生在这里

复制代码

暂时就是这般,前边会再遵照需要更为增长和讲课。

Temp文件夹:数据缓存目录,存放项目中自动生成的门类运作缓存文件等,以及利用文件格局时的缓存文件等

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图