15个最新的JavaScript库来增强您的Web体验,ThinkPHP快速入门实例教程之数据分页
分类:面向对象

数据分页可能是web编程里最常用到的功能之一。ThinkPHP实现分页功能十分简洁。只需要定义几个参数就可以实现。并且扩展也十分方便。

ThinkPHP框架学习整理2:

---恢复内容开始---

下面让我们从零开始实现ThinkPHP的分页程序吧。

Thinkphp是单一入口模式,也就是说所有流程都是从index.php开始的。项目目录下的index.php我们称之为入口文件。你所编写的Action,使用

前言
TP的手册相当多,其实不必再出这样的贴子,论技术,我也是菜鸟一个,同时也在学习当中。
看到论坛上多了不少新朋友,不少在抱怨手册看不懂,那我就姑且抛砖引玉,尝试与新朋友们更简单地、手把手地进入TP的应用中去。讲解过程中有错的地方,大家帮忙指正。

1.首先,我们得创建一个用于分页测试的数据库 test.sql代码如下。

一)构建项目:

这个系列,初步定下的目标为,从零开始,以TP示例中心中的Form为例进行讲解,以实践为主,理论为辅,
将TP的最基本内容逛一遍,至少让我们一起学会如何进行最简单的对数据进行查、增、改、删操作并输出到模板。

CREATE TABLE `test` (
`id` int(10) unsigned NOT NULL auto_increment,
`name` char(100) NOT NULL,
`content` varchar(300) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=27 ;
INSERT INTO `test` (`id`, `name`, `content`) VALUES
(19, '123', '123'),
(20, '1231', '123123123'),
(21, '123123', '123123123'),
(26, '24', '123123'),
(25, '321123', '321123'),
(24, 'age', 'age'),
(23, '123123', '123123'),
(22, '213', '123');

  ThinkPHP 具有项目目录自动创建功能,因此构建项目应用程序非常简单,您只需要定义好项目的入口文件,在第一次访问入口文件的时候,系统就会自动根据您在入口文件中所定义的目录路径,迅速为您创建好项目的相关目录结构。

由于我们说的是循序渐进,所以我用步骤式来说明,只要一步一步跟着做,相信聪明的你在使用过程中就会明白TP的应用了。

2.接着,我们得新建一个ThinkPHP项目。新版tp已经内置了项目自动生成目录功能。
在htdocs(也就是你的网站根目录)下新建一个test文件夹,把THINKPHP核心文件夹放进test根目录,并在test根目录新建文件index.php,加入如下代码:

这里以 Myapp 为项目名称进行示例,先创建好目录结构后,再逐一为您介绍各目录功能用途。

注意:以下的步骤,仅仅是TP灵活的布署方式其中一种,实际开发中可以根据自己的情况去另行设定。
至于为什么那样做,我们会在最后再作总结,我觉得先实操然后再进行说明比较容易明白。以下不再重复解释。

// 定义ThinkPHP框架路径
define('THINK_PATH', './Thinkphp');
//定义项目名称和路径。这2句是重点。
define('APP_NAME', 'test');
define('APP_PATH', './test');
// 加载框架入口文件
require(THINK_PATH."/ThinkPHP.php");
//实例化一个网站应用实例
$App = new App();
//应用程序初始化
$App->run();

具体操作步骤:

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

运行“
打开/test/test/conf/目录,新建“config.php” ,配置好你的数据库连接。

1>. 在 www 根目录下新建一个文件夹,起名为 Myapp。

一  快速开始一个项目

'mysql',
'DB_HOST'=>'localhost',
'DB_NAME'=>'test', //新建的数据库名test
'DB_USER'=>'root', //数据库用户名
'DB_PWD'=>'', //数据库密码
'DB_PORT'=>'3306',
);
?>

2>. 下载 ThinkPHP 核心文件,将其复制到 Myapp 目录下。

名词解释:

如果你想打开调试模式,请在数组中加入

3>. 在 Myapp 目录下,新建一个入口文件,起名为 index.php,代码如下:

项目:你要开发的系统,称之为项目。

"debug_mode"=>true

<?php

入口文件:你可以理解为这个项目的唯一一道门,以后所有的操作都会通过这道门去执行处理。
不必理会什么意思,你甚至可以先把它看成是index.php就是入口文件

3.基本页面输入与输出的实现。
(1)打开/test/test/lib/action/IndexAction.class.php,会发现以下代码

// 定义项目名称

TP: ThinkPHP框架的简称

由系统自动生成的indexaction类中的index()函数是默认的首页调用函数。你可以使用http://localhost/test/index.php或者http://localhost/test/index.php/index来访问他



(2)我们暂时不管他。首先我们需要一个表单提交的页面。打开“/test/test/tpl/default/index/”,新建一个文件add.html.

define ('APP_NAME','Myapp');

1 下载TP1.5正式版

姓名:

//定义项目路径

2 拟好你的项目名称,我们这里以 Myapp 为项目名称

内容:

define('APP_PATH','./ Myapp /');

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

提交:

// 加载入口文件

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

保存后,输入 .
这里简单说一下模板和action之间的关系。每一个action,对应的模板是与之名字相同的html文件。例如index类下的index(),对应default/index/index.html,而add.html,则显然对应的是index类下的add()。
我们甚至可以在只有add.html而没有相应的add()动作情况下,用访问add()的形式(

require ('./ThinkPHP/ThinkPHP.php');

5 在www根目录下,创建一个PHP文件,起名index.php,这就是入口文件

(3)从form的“action=apizl_url/insert”中可以看出,进行表单处理的动作是/test/index.php/index/insert,所以我们得新增insert动作来处理表单提交数据。在此之前,我们还有一件重要的事情要做,那就是新增model文件。通过model文件的建立,我们将能在insert动作中使用便捷的方法来操作数据库了
打开/test/test/lib/model/文件夹,新建文件TestModel.class.php.打开他,输入并保存以下代码

?>

入口文件index.php代码:

简单的说,这是ActiveRecord实现的基本文件。命名规则是你数据库中的表后面加Model.例如我们将要使用到的表是test,我的文件命名必须是TestModel.class.php,而文件下的类命名必须是TestModel.

4>. 打开浏览器,访问该项目的入口文件:这时可以看到项目构建成功后的提示画面,并且在 Myapp目录下,已为您构建好了项目目录。

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

接着,我们回到indexaction.class.php文件,删除原来的代码,加入如下代码。

注意:如果是 Linux 环境下面部署,需要给项目入口文件里面指定的路径设置可写权限。这些目录仅仅针对项目目录,系统目录无需设置任何可写权限,因为每个项目的模版缓存和数据缓存,以及日志文件都是独立的。

复制代码

class IndexAction extends Action{
//表单数据添加到数据库
public function insert() {
//实例化我们刚才新建的testmodel.
$test = D('Test');
if ($test->create()) {
//保存表单数据就这一步。thinkphp已经全部做完了。
$test->add();
$this->redirect();
}else{
exit($test->getError()。'[ 返 回 ]');
}
}
}

 

就这么简单几行,然后打开浏览器,输入
一个TP项目就这样构建出来了。你会看到

(4)接下来,我们需要在IndexAction类中增加一个首页默认显示动作index()来调用表单数据。

二)ThinkPHP 框架目录结构:

  1. ^_^ Hello,欢迎使用ThinkPHP!
public function index() {
//依旧是实例化我们新建的对应相应表名的model.这是我们进行快捷表操作的重要关键。
$test = D('Test');
//熟悉这段代码么?计算所有的行数
$count = $test->count('','id');
//每页显示的行数
$listRows = '3';
//需要查询哪些字段
$fields = 'id,name,content';
//导入分页类 /ThinkPHP/lib/ORG/Util/Page.class.php
import("ORG.Util.Page");
//通过类的构造函数来改变page的参数。$count为总数,$listrows为每一页的显示条目。
$p = new Page($count,$listRows);
//设置查询参数。具体见“ThinkPHP/Lib/Think/Core/Model.class.php”1731行。
$list = $test->findall('',$fields,'id desc',$p->firstRow.','.$p->listRows);
//分页类做好了。
$page = $p->show();
//模板输出
$this->assign('list',$list);
$this->assign('page',$page);
$this->display();
}

ThinkPHP.php : ThinkPHP 公共文件。

复制代码

我们该设置一个模板了。在/test/test/tpl/default/index/下新建index.html(因为默认对应了index()。所以程序中可以直接assign.而不用去指定模板文件。当然,这是可以配置的。)

Common 目录 : 系统公共文件目录

这行字。并自动为你创建好项目的目录。接下来,我们这个项目添砖加瓦。

填写
//分页显示,这一行
{$page}
//数据显示。下面的参数很快会再进行详解。它很好理解。

姓名:{$vo.name}
内容:{$vo.content}

Lang 目录 : 系统语言包目录

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

保存他。接着输入
恭喜你。你已经学会了如何利用thinkphp制作分页了!

Lib 目录 : 系统基类库目录

二简单认识项目里的各个文件夹

Tpl 目录 : 框架系统模版目录

名词解释:

Vendor 目录 : 第三方类库目录

Action:模块控制器类,你暂时可以理解为一个Action文件代表着一个应用模块,Action文件中的每一个方法(function)代表着一个操作,操作分为有输出到模板的操作和只具执行不需要输出的操作。对于有输出的操作,则代表了你的项目中一个展示给用户应用的web页面。(注意:这不是正统的术语解释)

另外系统基类库目录 Lib 文件夹下,还有相关的子目录:

Model:数据表相对应的Model类,可以理解为一个Model文件对应着你项目数据库的其中一个表。命名关系请参看这里:

Think 文件夹:系统运行库目录(必须)

在添砖加瓦之前,我们有必要认识一下各个文件夹的用途。

ORG 文件夹:扩展类库目录( 非必须) 

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

具体内容可以打开目录查看结构和文件组成。

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

 

Common文件夹:你的项目中要用到的自己写的函数,可以在这个文件夹下创建一个名为common.php文件,
在这个文件中书写函数,这些函数可以用在你项目的各个类,同时也可以在模板变量中使用,TP框架会自动加载。

=》再来看看系统自动生成的Myapp项目目录结构

Conf文件夹:项目的运行配置文件config.php将放在这个文件夹里,(还有路由配置,调试配置等,请先忽略)

Cache 目录:项目自动生成的模版缓存

Data文件夹:TP会把项目的数据库表字段生成到这里,另外。。。那些先不必理会。

Common 目录:项目中应用的公共文件,通常包含 common.php 公共函数文件。

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

Conf 目录: 项目各项配置文件。

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

Data 目录:项目的数据缓存目录。

Logs文件夹:项目中自动产生的日志文件会存放在这里。暂不必理会。

Lang 目录:项目的语言包文件。

Temp文件夹:数据缓存目录,存放项目中自动生成的项目运行缓存文件等,以及使用文件方式时的缓存文件等

Lib 目录:应用类库目录,在这文件夹内通常包含两个子目录:Action 和 Model,Action 目录放置命名控制器文件,Model 目录放置模块类文件。除此之外,还可以放置其他的项目类库。

Tpl文件夹:模板文件目录,内有一个default文件夹,也就是默认的风格。
项目生成的目录结构就先简单介绍到这里,下一步我们要简单地对项目进行最基本的配置。

Logs 目录:项目的日志文件。

三创建数据表,并对项目进行配置,以便连接到数据库。

Temp 目录:数据缓存目录,存放项目缓存文件。

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

Tpl 目录:项目模板文件,按风格创建对应的子目录。

  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 ;

注意:在 Linux 环境下,项目目录的 Cache(模版缓存目录)、Data(数据缓存目录)、Temp(编译缓存目录)、Logs(日志文件目录)必须设置为可写。

复制代码

 

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

三)创建数据表和项目配置:

config.php代码如下:

1) 创建数据库

  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_', // 数据表表名的前缀 请参看

  11. );

  12. ?>

2) 在 config.php 配置文件中设置数据库访问的连接信息

复制代码

3) 在 项目/Lib/Model 目录下,建立模型文件,就可以直接对数据表进行增删改查等操作了。

暂时就是这样,后面会再根据需要进一步添加和讲解。

具体操作步骤:(以 MySQL 为例,如果是其他数据库请修改后再执行)

3 在Lib/Model目录下,创建一个文件,命名为FormModel.class.php。命名规则刚才你已看了两次。
这里就不再多说,我们可以看到,数据表名是think_form,由于我们配置了数据表表名的前缀为think_,
所以文件的命名直接使用 "不含前缀的数据表表名+Model.class.php"就行了。
在这个文件中书写代码:

1) 创建一个数据库,名为 myapp

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

2) 运行下面的 sql 增加一个 think_message 表。

复制代码

3) 在 Myapp/Conf 目录下面创建一个 config.php 项目配置文件,代码如下:

就这样定义一个类名就行了。该类继承了Model类。至于自动验证,自动过滤,自动填充这些,暂且不理会。

<?php

4 提前先爽一下吧。再次利用PhpMyAdmin,在该表中插入一些数据
sql如下:

return array(

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

// 定义数据库连接信息

复制代码

‘DB_TYPE’=> ‘mysql’, // 指定数据库是 mysql

然后我们打开Myapp/Lib/Action/IndexAction.class.php文件,将里面的内容删掉。改成下面这样:

‘DB_HOST’=> ‘localhost’,//服务器地址

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

'DB_NAME'=>'myapp',  // 数据库名

复制代码

‘DB_USER’=>‘root’,  //用户名

打开浏览器,输入

'DB_PWD'=>'123456',  //您的数据库连接密码

今天先到这里,下一步我们继续循序渐进。让我们一起把这个Form最后变成一个有会员功能的留言板。

‘DB_PORT’=>‘3306’,  //端口

 

'DB_PREFIX'=>'think_',//数据表前缀(与数据库 myapp 中的表 think_message 对应)

 

 

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

 //'配置项'=>'配置值'
 'APP_GROUP_LIST' => 'Index,Admin',
 'DEFAULT_GROUP' => 'Index',

 

 'APP_GROUP_MODE' => 1,
 
 //独立分组,此文件夹名称可以修改为其他
 'APP_GROUP_PATH' => 'Modules',
   
 'TMPL_VAR_IDENTIFY' => 'array',
 'TMPL_FILE_DEPR' => '_',

由于时间关系,此系列共同学习教程更新的速度会比较慢些,请多见谅,上一章节的内容请看这里。

);


?>

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

注意:请确保配置文件里面的设置和你本地的数据库连接信息一致。

第四节简单了解TP的模板输出
上一章节我们提及到,

4) 在 Myapp/Lib/Model/目录下,新建一个文件 MessageModel.class.php,代码如下:

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

class MessageModel extends Model{ }    

打开Myapp/Lib/Action/IndexAction.class.php文件,我们看看里面的基础代码

 

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

四)ThinkPHP 的表和模型的命名规则:

复制代码

ThinkPHP 要求数据库的表名和模型类(model)的命名要遵循一定的规范,首先数据库的表名采用小写形式,模型类文件名的命名规则是:

理论知识:

不含前缀的数据表表名(采用驼峰命名法)+Model

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

在创建 message 表时,我们使用的名称是 think_message,think_就是数据表前缀。在配置文件中我们已使用'DB_PREFIX'=>'think_' 作出了指定。

2 应用模块类的定义要继承框架的Action类。要为这个应用模块添加一个操作,则定义一个以此操作为命名的function.例如上面的index操作。

例如:MessageAction.class.php

通常一个应用模块中,会有若干操作(function)需要有与用户交互的页面,这就需要用到模板输出,
TP本身已内置了一套具有TP特色的,很强大易扩展但应用非常方便兼简单的模板引擎。

 

在应有模块中,如果某个操作是需要页面显示的,只要对应在Myapp/Tpl/default/里建立一个文件夹,文件夹以应用模块的名称来命名,然后在这个文件夹下,建立一个以这个function名称来命名的html文件,就可以在这个方法中使用$this->display()方法来直接调用该模板。(当然也可以调用其它模块下的其它模板或显式指定模板文件位置和名称,由于是循序渐进式的学习,就让我们先忽略吧)

五)控制器和 URL 访问:

了解这些理论后,我们先简单实操一下这些知识。

如何定义一个应用模块?

1 在Myapp/Tpl/default/下建立一个文件夹,根据应用模块的名称,我们将这个文件夹命名为Index

在项目目录/Lib/Action 文件夹下,建立一个“模块名+Action.class.php”文件,并继承 Action 类则可。 

2 在Myapp/Tpl/default/Index/下建立一个html文件,根据操作名称,我们命名该文件为index.html

如何定义一个操作?

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

在应用模块类的代码中,添加一个 function 方法则可

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

如何访问具体操作?

复制代码

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

如何通过 URL 传递变量?

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

1/变量值 1/变量名 2/变量值 2/ 

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

 

复制代码

六)ThinkPHP的数据操作:

// 下面的写法是等效的

  • 使用 ThinkPHP 开发时,项 目中每一个继承了 Model 的模型类,都 会对应着一个数据表(或者视图),模型与数据表存在一种映射关系。( 例如之前我们所定义的 MessageModel 类, 对应的就是think_message 表)。
  • 开发过程中,只要简单地定义好与数据表对应的模型类(xxxModel.class.php),甚至无需增加任何属性和方法就可以进行对数据操作了。
  • ThinkPHP 提供了灵活和方便的数据操作方法,不仅实现了对数据库操作的四个基本操作(CURD):创建、更新、读取和删除的实现,还内置了很多实用的数据操作方法。
  1. $this->name = $value ;

如何添加记录到数据库表?

复制代码

1) 获取(设置)要添加的数据内容。

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

2) 实例化数据模型,调用 Model 类的 add( )方法即可添加。

  1. $this->display();

具体操作实践一 添加数据 :数据对象赋值

复制代码

1.1> 在 Index 模块中新添一个方法 add1,代码如下:

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

public function add1(){

  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>

// 使用 D 函数实例化消息模型类

复制代码

$Message = D('Message');

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

// 然后给数据对象赋值

5 打开浏览器输入地址:
附加补充知识:
1 如果要同时输出多个模板变量,可以使用下面的方式:

$Message->title = 'ThinkPHP';

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

$Message->email = 'ThinkPHP@gmail.com';

复制代码

// 使用 add 方法保存内容

这样,就可以在模板文件中同时输出name、email和phone三个变量。
2 我们使用上面的变量定义,将整个数组定义为一个模板变量来输出

$Message->add();

  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();

// 使用 select 方法进行数据查询

复制代码

$rs = $Message->select();

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

// 使用 dump 函数 输出查询数据查看

  1. {$array.name} 或 {$array['name']}

dump ( $rs );

复制代码

}

3 将这个数组循环输出

 

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

1.2> 在浏览器中访问

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

array(1) {

复制代码

[0] => array(6) {

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

["id"] => string(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. <iterate name="array" id="vo">
  8. {$vo}<br />
  9. </iterate>

  10. </body>

  11. </html>

["title"] => string(8) "ThinkPHP"

复制代码

["content"] => string(0) ""

代码知识要点:
name='array'是指要循环的模板变量是array,id='vo'是指这个数据在模板输出时所使用的名称

["create_time"] => string(1) "0"

对于TP的模板引擎输出先简单了解到这里。

["email"] => string(18) ThinkPHP@gmail.com

 

["status"] => string(1) "1"

 

}

 

}

 

D( ) 函数 通常要实例化一个类,都是导入这个类文件,然后使用 new 关键字进行实例化    相当于 new Model(‘message’);

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

dump( ) 函数是 ThinkPHP 内置的对浏览器友好的变量输出函数。

 

 

第一节  快速开始一个项目

操作实践二 添加数据 :数组赋值

第二节 简单认识项目里的各个文件夹

1> 在 Index 模块中再添加一个方法 add2,代码如下:

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

public function add2(){

第四节 简单了解TP的模板输出

// 使用 D 函数实例化一个模型类

第五节初步了解URL如何访问模块操作

$dao = D('Message');// 然后给数据对象赋值

通过前面的学习,我们已大概地明白了应用模块中的操作与模板如何对应。
而这一节将简单讲解如何通过URL来访问操作。由于我们要循序渐进,所以先只介绍下面章节要用到的知识,要想深入学习还请参看官方手册《URL设计和SEO支持》

$data['title'] = '敏捷式开发框架 ThinkPHP!';

TP支持四种URL访问方式,默认是智能模式,所以我们就这种模式进行简要说明。

$data['email'] = [email=]'TP@thinkphp.cn';[/email]

智能模式下的URL基本结构是这样的

$data['create_time'] = time();

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

$data['content'] = '使用 ThinkPHP 进行数据操作';

解释一下上面文字中所译的URL结构,
为什么appname项目名称我将它译成了入口文件位置:通常情况下,我们的入口文件index.php都是放在根目录中,这时项目名称就会被入口文件index.php所替代。在前几节里,我们已知道,一个Action文件就是一个应用模块,而应用模块中的每个方法(function)就是一个具体操作。因此,假如要访问我们实例中的Index模块下的index操作。地址应该是

// 使用 add 方法保存内容

// 不需要传入主键的值就可以新建数据

如果入口文件不是在服务器的根目录,而是在myapp目录下,那么入口文件位置就是 Myapp/index.php,此时上面的URL访问就相应要换成

$dao->add($data);

这样说理应很清楚了,不过别让这么多index给混乱咯,对应URL的结构去明白每一个index的函义,同时注意大小写

// 使用 select 方法进行数据查询

简单实操:

$rs = $dao->select();

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

header("ContentType:text/html;charset=utf8");

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

dump ( $rs );

复制代码

}

2 尝试对应URL结构,来访问这个test操作,如果能成功看到echo的文字。则这节我们又学会了多一点知识。

 

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

2> 在浏览器中访问

  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>

add( ) 方法

复制代码

添加数据可以通过 add( )方法进行实现,如果表的主键是自动增长类型,不需要传入主键的值就可以新建数据,并且如果插入数据成功的话,add 方法的返回值就是最新插入的主键值,可以直接获取。

如果你的服务器环境支持rewrite,使用
    此后我们的学习中用到的URL,都是假定你使用了rewrite的情况。

例如:$insertId = $dao->add($data);

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

select( ) 方法

 

对数据进行查询使用 select( )方法,当该方法没有传入任何参数时,会获取全部数据。

.htaccess.rar (248 Bytes)

具体操作实践三    添加数据 :利用表单创建数据并添加记录

 

一般来说,在表中添加数据都是通过表单来建立,下面我们使用 Message 模块进行实践体验。

 

1> 打开 Myapp/Lib/Action/MessageAction.class.php 文件,将原来的操作方法代码删去,并新添一个方法 add(),代码很简单,只要渲染模板进行输出则可,如下所示:

 

public function add() {

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

 

第一节  快速开始一个项目

第二节 简单认识项目里的各个文件夹

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

第四节 简单了解TP的模板输出

第五节 初步了解URL如何访问模块操作

注意:看到不少留言说操作不成功或出错,请别忘记,此系列教程出来时,TP1.6还没出来,所以系列6之前所介绍的示例和操作都还是标准版本1.5的,如果你使用1.6版,请对应两者差异性。
例如submit不能有name属性,是因为原来1.5有字段缓存进行过滤处理。1.6没有了字段缓存。
例如数据自动验证和自动填充都有了一定的区别。

$this->assign('title','添加数据');

关于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

 

 

 

$this->display( );

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

很抱歉!不得不出这一篇过渡文章。
为了让这系列教程不致于日后会误导,从这节开始,让我们转型到1.6版的使用方式上。
但是对于1.6版的使用,我也是在摸索当中学习,错误和不足之处肯定会比较多,
故恳请流年大哥和tdweb,东至,yhustc等大大可以及时指正和补充,在此先谢谢了。

}

-------------------- 基于本学习系列1-4过渡到本节的补充说明

说明1 从这节开始,TP或dev这两个简称指的都是ThinkPHP 1.6版,
可以到svn下载。

下载后删除原来的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_', // 数据表表名的前缀 请参看
    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='')
看参数就已经很清楚了。

过渡篇就先到这里,建议大家多点动手实际操作和看看源代码。

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

 

 

 

[教程] 一步一步循序渐进学习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" ";
  2. <html xmlns=";
  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>

复制代码

在浏览器中输入

 

这时我们只要每输入一条数据信息,就会按照id倒序的方式显示在模板上。

---恢复内容结束---

2> 对应 Message 应用模块,我 们在 Myapp/Tpl/目录下新建一个文件夹,起 名为 Message,

并在 Myapp/Tpl/Message 目录下新添一个模板文件 add.html,关键代码如下:

<form action="__URL__/insert" method="post" >

标题:<input name="title" type="text" />

邮箱:<input name="email" type="text" />

内容:<textarea name="content" rows="6" cols="50" ></textarea>

<input type="submit" value="提交" />

</form>

3> 在 MessageAction.class.php 中添加一个表单处理的方法 insert,代码如下:

// 处理表单数据的方法

public function insert() {

$dao = D('Message');

// 调用 Model 类的 create 方法创建通过表单提交的数据对象

$vo = $dao->create();

// 创建失败提示

if(false === $vo) {

exit($dao->getError().' [ <a >返 回</a> ]');

}

// 当主键是自动增长类型时,方法的返回值就是最新插入的主键值,可以直接获取

$rs = $dao->add();

// 添加数据失败提示

if (!$rs) {

exit($dao->getError().' [ <a >返 回</a> ]');

}

// 成功提示并返回,使用了函数 redirect($url,$time=0,$msg='')

redirect('add',2,'数据添加成功!');  }

4> 接着,通过访问 进行表单数据提交测试。

上面示例中的action 提交到的处理地址是__URL__/insert  模板引擎会自动将这句替换为/index.php/Message/insert

常见模板使用的特殊变量还有:

__ROOT__ 网站根目录地址

__APP__ 当前项目(入口文件)地址

__URL__ 当前模块地址

__ACTION__ 当前操作地址

__SELF__ 当前 URL 地址

__PUBLIC__ 公共文件夹 Public 地址

create( ) 方法

create 方法用来创建数据对象,当参数为空时,默认是通过表单提交的数据。调用该方法后,就可以直接使用 add()方法进行添加数据,而不用再设置插入数据的内容。

getError( ) 方法

用来捕获数据库操作过程中的出错提示。

1> 页面 Trace

页面 Trace 功能提供了很好的 SQL 调试方法,而且可以很直观的在当前页面查看到 SQL 语句信息,我们只需要设置参数:'SHOW_PAGE_TRACE' => TRUE,这样,我们可以在页面看到类似下面的信息:

SQL 记录 : 1 条 SQL

[ 09040805:38:13 ] RunTime:0.000238s SQL = SELECT * FROM think_message

2> 开启 SQL 日志

页面 Trace 信息虽然直观,但是只能显示当前页面的 SQL 执行信息,如果你使用了 Ajax 操作,那么后台的执行 SQL 可能就不会显示,我们只能通过查看 SQL 日志了。可以在配置参数里面开启SQL 日志记录。

'SQL_DEBUG_LOG' => TRUE,

我们可以在 Logs 目录下面的 sql 日志文件里面看到:

[ 09040805:50:12 ]

RunTime:0.000238s SQL = SELECT * FROM think_message WHERE id in (1,2,5)

这样的记录信息,可以分析具体执行的 SQL 语句是否有问题,以及执行时间,便于优化。

3> 使用 getLastSql 方法

如果你没有开启 SQL 日志,也没有使用页面 Trace 信息显示功能,那么依然可以调试可能出现错误的 SQL 语句,我 们可以在查询方法的后面使用 getLastSql 方法来查看最后一次执行的 SQL 语句。

便于分析错误可能的原因。

$dao->find(8);

echo $dao->getLastSql();

 

4> 使用调试配置文件

单独定义调试配置文件,可以给你的项目设置最合理的参数。而且你还可以给调试模式增加单独的数据库连接。

我们可以在项目的 Conf 目录下面增加调试配置,内容如下:

'SHOW_RUN_TIME' => TRUE, // 开启运行时间显示

'SHOW_ADV_TIME' => TRUE, // 显示详细运行时间信息

'SHOW_DB_TIMES' => TRUE, // 显示数据库查询和写入次数

'SHOW_RUN_TIME' => TRUE, // 开启运行时间显示

5> 开启调试模式

只要在配置中设置'DEBUG_MODE'=>true,就可以开启调试模式。

系统默认是调用 ThinkPHP/Common/debug.php 的配置设置。要自行定义时,只要在项目Myapp/Conf/目录下,添加 debug.php 文件,然后根据需要进行设置。

 

七)Thinkphp 的数据查询:

如何查询记录?

1> 设置查询条件 (如果是查找所有记录,这一步可省略)

2> 使用最直观易懂的操作方式:要进行数据操作的模型->对查询设定(连贯操作)->进行查询

例如:$User->where(‘name=thinkphp’)->find();

基础知识连贯操作

所谓连贯操作,是 ThinkPHP 使用了魔术方法来实现的一些特殊的 Model 类方法,可以对数据对象连续调用数个方法(参数)来设定特定的条件,然后执行最终所指定的操作,这类特定方法的命名都很直观易记,主要方法有:

field //要查询的字段名

table //数据表名称 不指定时,默认为当前数据对象所对应的表

where //查询条件

order // 排序

limit //结果限制

having //having 支持

group //group 支持

distinct //distinct 筛选支持

连贯操作应用代码示例:

$User->where('status=1')

->table('`other_db`.`think_user`')

->order('create_time')

->limit(10)

->select();

数据查询具体操作实践

我们新建立一个应用模块 Search 专门用来体验 ThinkPHP 的各种查询方式。先在 Myapp/Lib/Action 目录下,新建一个 PHP 文件,命名为:SearchAction.class.php。并定义类:

<?php

// 数据查询体验

class SearchAction extends Action{

function _initialize( ) {

// 为了方便使用 dump 函数查看结果输出,先在初始化方法里统一编码

header("ContentType:text/html; charset=utf8");

}

}//类定义 end

?>

 

1> 查询单条记录

当数据表的主键为 id 并且是自动增长时,可以直接使用 find(id 编号)进行查询。

1.1> 在 Search 应用模块中新添一个方法,代码如下:

// 使用 find 方法查询 1

public function find1(){

// 实例化模型

$dao = D('Message');

// 查询 id 为 5 的记录

$rs = $dao->find(5);

// 输出结果

dump ($rs);

// 输出 sql 语句进行对比

dump($dao->getLastSql());

}

2> 查询符合特定条件的单条数据

2.1> 新添一个方法 find2,代码如下:

// 使用 find 方法查询 2

public function find2(){

// 实例化模型

$dao = D('Message');

// 设置查询条件

$where['status'] = 1;

$where['email'] = 'TP@thinkphp.cn';

// 需要查询的字段

$field = 'email,title';

// 进行查询

$rs = $dao->where($where)->field($field)->find();

// 输出结果

dump($rs);

// 输出 sql 语句

dump($dao->getLastSql());

}

2.2> 访问 find2 操作

可以看到这样进行查询的 sql 就是:

"SELECT `email`,`title` FROM `think_message` WHERE ( `status` = 1 ) AND ( `email` = 'TP@thinkphp.cn' ) LIMIT 1 "

注意:使用 find( )方法进行查询,无论符合条件的结果有多少个,都只会返回单条记录。

在连贯操作中的参数(where,field,order 等)顺序是不分先后的,如本例,如果使用

$rs = $dao‐>field($field)‐>where($where)‐>find();

所得的操作结果完全一样,所以不必去记住顺序。

3> 获取所有记录

3.1> 添加一个方法 select1,代码如下:

// 获取所有记录集

public function select1(){

// 实例化模型

$dao = D('Message');

// 设置查询条件

$where['status'] = 1;

// 需要查询的字段

$field = 'email,title';

// 进行查询

$rs = $dao->where($where)->field($field)->select();

// 输出结果

dump($rs);

// 输出 sql 语句进行

dump($dao->getLastSql());

}

3.2> 访问 select1 操作:

同 find 方法一样,连贯操作中,除了 select 方法必须放到最后,参数条件顺序不限。

使用 select 方法进行查询,返回的是一个数据记录集。

select 方法也支持 join,like 等更复杂的查询,具体应用可以参看相关手册。

select 方法还有一个别名 findall,使用方式是一样的。

$rs = $dao->where($where)->field($field)->findall();

 

八)ThinkPHP 的数据更新:

更新记录使用 save 方法:

$User->find(1); // 查找主键为 1 的数据

$User->email = 'TOPThink@thinkphp.cn'; // 修改数据对象

$User->save(); // 保存当前数据对象

// 还可以使用下面的方式更新

$User->score = array('exp','(score+1)'); // 对用户的积分加 1

$User-> save();

如果不是使用数据对象的方式来保存,可以传入要保存的数据和条件

$data['id'] = 1;

$data['name'] = 'TopThink';

$User->save($data);

除了 save 方法外,你还可以使用 setField 方法来更新特定字段的值,例如:

$User->where('id=1')->setField('name','TopThink');

使用原生 sql

通过 execute 方法执行 sql 语句,

$User->execute("UPDATE __TABLE__ SET name='thinkPHP' WHERE status=1");

 

九)ThinkPHP 的数据删除:

删除记录使用 delete 方法

删除单条记录

$User->find(2);

$User->delete(); // 删除查找到的记录

删除多条记录

$where[‘id’] = array(‘in’,’1,2,3,4,6,8’);

$User->where($where)->delete();

使用原生 sql

$User->execute("DELETE FROM __TABLE__ WHERE name='thinkPHP'");

 

十)ThinkPHP 的模板使用:

通常一个应用模块中,会有若干操作(function)需要有与用户交互的页面,这就需要用到模板输出,ThinkPHP 本身已内置了一套具有 ThinkPHP 特色的,很强大易扩展且应用非常方便的模板引擎。

如何使用模板?

仅需一步,在项目/Tpl/风格目录/下,建立一个 html 文件与操作名称相对应就可以了。

具体操作实践

1 在 Myapp/Tpl/下建立一个目录,根据应用模块的名称,我们将这个文件夹命名为 Index。

2 在 Myapp/Tpl/Index/目录下建立一个 html 文件,根据操作名称,我们命名该文件为index.html。

3 打开 Myapp/Lib/Action/IndexAction.class.php 文件,将 index 操作的代码修改为。

<?php

class IndexAction extends Action{

public function index(){

$value = 'hello,ThinkPHP';

$this->assign('title',$value);

$this->display( );

}

}

?>

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

<!DOCTYPE html PUBLIC "//W3C//DTD XHTML 1.0 Transitional//EN"

";

<html xmlns=";

<head>

<meta httpequiv="ContentType" content="text/html; charset=utf8" />

<title>{$title}</title>

</head>

<body>

测试输出: {$title}

</body>

</html>

5 在浏览器中输入 ,我们可以看到,在浏览器的标题栏和页面中,index方法所定义的模板变量$title 已成功地输出。

如果要同时输出多个模板变量,可以使用下面的方式:

$array = array();

$array['name'] = 'thinkphp';

$array['email'] = 'liu21st@gmail.com';

$array['phone'] = '12335678';

$this->assign($array);

这样,就可以在模板文件中同时输出 name、email 和 phone 三个变量。

模板调用

1 直接调用 index 操作模板

$this->display();

// 对应 Myapp/Tpl/Index/index.html

2 调用 Index 模块的 test1 操作模板

$this->display('test1');

//对应 Myapp/Tpl/Index/test1.html

2 调用 Message 模块的 test2 操作模板()

$this->display('Message:test2');

//对应 Myapp/Tpl/Message/test2.html

3 调用 XP 主题的 Message 模块的 test2 操作模板

$this->display('Xp@Message:test2');

//对应 Myapp/Tpl/Xp/Message/test2.html

4 直接指定模板文件的全名

$this->display('../Message/test3.html');

//对应 Myapp/Tpl/Message/test3.html

模板变量循环输出

在模板中对数据进行循环输出使用 iterate 标签。

模版变量赋值

$Message = D('Message');

$list = $Message->select();

$this->assign('list',$list);

模版定义

<iterate name="list" id="vo">

{$vo.name}

</iterate>

注意 name 和 id 表示的含义,name 是已赋值的模板变量,id 是在这个循环中所使用的变量。

id=’vo’中的 vo 即 foreach($list as $val)中的$val。

// 输出 list 的第 5~15 条记录

<iterate name="list" id="vo" offset="5" length='10'>

{$vo.name}

</iterate>

// 输出偶数记录

<iterate name="list" id="vo" mod="2" >

<eq name="mod" value="1">

{$vo.name}

</eq>

</iterate>

// 输出 key

<iterate name="list" id="vo" key="k" >

{$k}.{$vo.name}

</iterate>

iterate 还有其它别名是 volist,sublist

子循环输出

<volist name="list" id="vo">

<sublist name="vo['sub']" id="sub">

{$sub.name}

</sublist>

</volist>

 

 

 


本文由10bet手机官网发布于面向对象,转载请注明出处:15个最新的JavaScript库来增强您的Web体验,ThinkPHP快速入门实例教程之数据分页

上一篇:模板文件中输出session值的三种方法,ThinkPHP的模版中调用session数据的方法 下一篇:新浪云经常遇到的错误,by错误的解决方法详解_php技巧_脚本之家
猜你喜欢
热门排行
精彩图文