页面载入中...
首页 » Tag ‘ThinkPHP’

ThinkPHP连接数据库

ThinkPHP 内置了抽象数据库访问层,把不同的数据库操作封装起来,我们只需要使用公共的 Db 类进行操作,而无需针对不同的数据库写不同的代码和底层实现, Db 类会自动调用相应的数据库适配器来处理。目前的数据库包括 MySQL PgSQL Sqlite PDO 的支持,如果应用需要使用数据库,必须配置数据库连接信息, 数据库的配置文件有多种定义方式:
第一种 在项目配置文件里面定义

Return array(

‘DB_TYPE’ => ‘mysql’ ,

‘DB_HOST’ => ‘localhost’ ,

‘DB_NAME’ => ‘thinkphp’ ,

‘DB_USER’ => ‘root’ ,

‘DB_PWD’ => ,

‘DB_PORT’ => ‘3306′ ,

‘DB_PREFIX’ => ‘think_’ ,

// 其他项目配置参数 ………

);

系统推荐使用该种方式,因为一般一个项目的数据库访问配置是相同的。该方法系统在连接数据库的时候会自动获取,无需手动连接。

可以对每个项目定义不同的数据库连接信息,还可以在调试配置文件里面定义调试数据库的配置信息,如果在项目配置文件和调试模式配置文件里面同时定义了数据库连接信息,那么在调试模式下面后者生效,部署模式下面前者生效。

第二种 使用 DSN 方式在初始化 Db 类的时候传参数

$db_dsn = “mysql: //username:passwd@localhost:3306/DbName”;

$db = new Db($db_dsn);

该方式主要用于在控制器里面自己手动连接数据库的情况,或者用于创建多个数据库连接。

第三种 使用数组传参数

$DSN = array(

‘dbms’ => ‘mysql’ ,

‘username’ => ‘username’ ,

‘password’ => ‘password’ ,

‘hostname’ => ‘localhost’ ,

‘hostport’ => ‘3306′ ,

‘database’ => ‘dbname’

);

$db = new Db($DSN);

该方式也是用于手动连接数据库的情况,或者用于创建多个数据库连接。

第四种 在模型类里面定义

protected $connection = array(

‘dbms’ => ‘mysql’ ,

‘username’ => ‘username’ ,

‘password’ => ‘password’ ,

‘hostname’ => ‘localhost’ ,

‘hostport’ => ‘3306′ ,

‘database’ => ‘dbname’

);

// 或者使用下面的定义

protected $connection = “mysql://username:passwd@localhost:3306/DbName”;

如果在某个模型类里面定义了 connection 属性,则在实例化模型对象的时候,会使用该数据库连接信息进行数据库连接。通常用于某些数据表位于当前数据库连接之外的其它数据库。

ThinkPHP 并不是在一开始就会连接数据库,而是在有数据查询操作的时候才会去连接数据库。额外的情况是,在系统第一次操作模型的时候,框架会自动连接数据库获取相关模型类的数据字段信息,并缓存下来。

ThinkPHP的数据库操作学习-ActiveRecord

ThinkPHP 实现了 ActiveRecords 模式的 ORM 模型,采用了非标准的 ORM 模型:表映射到类,记录(集)映射到对象,字段属性映射到对象的虚拟属性 。最大的特点就是使用方便,从而达到敏捷开发的目的。
开发过程中,只需要定义好模型类就可以进行方便的数据操作了,例如我们定义了一个 UserModel 类:

class UserModel extends Model {

}

甚至无需增加任何属性和方法,我们就可以进行下面的操作了。

$User = D ( “User” ); // 实例化 User 对象

// 或者 $User = new UserModel();

$User -> find ( 1 ); // 查找 id 1 的记录

$User -> name = ‘ThinkPHP’ ; // 把查找到的记录的名称字段修改为 ThinkPHP

$User -> save (); // 保存修改的数据

ActiveRecord 模式更加高级的是, ThinkPHP 可以把记录集映射到对象,例如

$User -> findAll ();

foreach ( $User as $user ){

echo $user -> name ; // 可以结合配置来使用 $user['name']

}

ThinkPHP 提供了灵活和方便的数据操作方法,不仅实现了对数据库操作的四个基本操作( CURD ):创建、读取、更新和删除的实现,还内置了很多实用的数据操作方法,提供了 ActiveRecords 模式的最佳体验。

新建记录

// 实例化一个 User 模型对象

$User = new UserModel ();

// 然后给数据对象赋值

$User -> name = ‘ThinkPHP’ ;

$User -> email = ‘ThinkPHP@gmail.com’ ;

// 然后就可以保存新建的 User 对象了

$User -> add ();

// 如果需要锁实例化模型对象的时候传入数据,可以使用

$data [ 'name' ] = ‘ThinkPHP’ ;

$data [ 'email' ] = ‘ThinkPHP@gmail.com’ ;

$User = new UserModel ( $data );

$User -> add ();

// 或者直接在 add 方法传入要新建的数据

$data [ 'name' ] = ‘ThinkPHP’ ;

$data [ 'email' ] = ‘ThinkPHP@gmail.com’ ;

$User = new UserModel ();

$User -> add ( $data );

如果你的主键是自动增长类型,不需要传入主键的值就可以新建数据,并且如果插入数据成功的话, Add 方法的返回值就是最新插入的主键值,可以直接获取。

$insertId = $User -> add ( $data );

一般情况下,应用中的数据对象不太可能通过手动赋值的方式写入,而是有个数据对象的创建过程。 ThinkPHP 提供了一个 create 方法来创建数据对象,然后进行其它的新增或者编辑操作。

$User = D ( “User” );

$User -> create (); // 创建 User 数据对象,默认通过表单提交的数据进行创建

$User -> add (); // 新增表单提交的数据

Create 方法支持从其它方式创建数据对象,例如,从其它的数据对象,或者数组等

$data [ 'name' ] = ‘ThinkPHP’ ;

$data [ 'email' ] = ‘ThinkPHP@gmail.com’ ;

$User -> create ( $data );

// User 数据对象创建新的 Member 数据对象

$Member = D ( “Member” );

$Member -> create ( $User );

支持新增多条记录

$User = new UserModel ();

$data [ 0 ][ 'name' ] = ‘ThinkPHP’ ;

$data [ 0 ][ 'email' ] = ‘ThinkPHP@gmail.com’ ;

$data [ 1 ][ 'name' ] = 流年 ;

$data [ 1 ][ 'email' ] = ‘liu21st@gmail.com’ ;

$User -> addAll ( $data );

MySql 数据库下面,会自动使用一条 SQL 语句实现多数据的插入

查询记录
读取数据库的记录我觉得是数据库操作中的最有意思的一件事情了,写过文本数据库的人都知道,保存和删除数据不难(无非是规范和效率问题),难在可以通过各种方式来查找需要的数据。 ThinkPHP 通过各种努力,让数据库的查询操作变得轻而易举,也让 ThinkPHP 变得富有内涵。
ThinkPHP
有一个非常明确的约定,就是单个数据查询和多个数据查询的方法是分开的,或者你会认为有时候自己也不知道要查询的数据是单个还是多个,但是有一点是明确的,你需要的是返回一个数据还是希望返回的是一个数据集。因为对两种类型的返回数据的操作方式是截然不同的,无论何种方式的返回,我们都可以直接在模型对象里面操作,当然也一样可以作为数据传递给你需要的变量。
先举个最简单的例子,假如我们要查询主键为 8 的某个用户记录,我们可以使用下面的一些方法:

$User -> find ( 8 );

这个作为查询语言来说是最为直观的,如果查询成功,查询的结果直接保存在当前的数据对象中,在进行下一次查询操作之前,我们都可以提取,例如获取查询的结果数据:

$name = $User -> name ;

$email = $User -> email ;

遍历查询到的数据对象属性

foreach ( $User as $key => $val ){

echo( $key . ‘:’ . $val );

}

// 或者进行相关的数据更改和保存操作
也可以用变量保存下来以便随时使用。

$user = $User -> find ( 8 );

对于上面的查询条件,我们还可以使用 getById 来完成相同的查询

$User -> getById ( 8 );

需要注意的是,对于 find 方法来说,即使查询结果有多条记录,也只会返回符合条件的第一条记录,如果要返回符合要求的所有记录,请使用 findAll 方法。
//
查询主键为 1 3 8 的记录集

$User -> findAll ( ‘1,3,8′ );

// 遍历数据列表

foreach ( $User as $vo ){

dump ( $vo -> name );

}

更多的查询操作请参考后面章节的内容。

更新记录
了解了查询记录后,更新操作就显得非常简单了。

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

$User -> name = ‘TOPThink’ ; // 修改数据对象

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

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

$User -> score = ‘(score+1)’ ; // 对用户的积分加 1

$User -> save ();

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

$data [ 'id' ] = 1 ;

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

$User -> save ( $data );

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

$User -> setField ( ‘name’ , ‘TopThink’ , ‘id=1′ );

同样可以支持对字段的操作

$User -> setField ( ’score’ , ‘(score+1)’ , ‘id=1′ );

// 或者改成下面的

$User -> setInc ( ’score’ , ‘id=1′ );

删除记录

$User -> find ( 2 );

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

$User -> delete ( ‘5,6′ ); // 删除主键为 5 6 的数据

$User -> deleteAll (); // 删除查询出来的所有数据

注意事项
ThinkPHP 里面 AR 模式和普通模式结合起来使用,根据实际的项目需要。因此有时候,也不要拘泥于 AR 模式的操作 ~

ThinkPHP框架学习点滴

1 # Linux 环境下面需要对 RUNTIME_PATH 目录设置可写权限。

2 # 注意在调试模式下面不会生成项目编译缓存,但是依然会生成核心缓存。 如果不希望生成核心缓存文件的话,可以在项目入口文件里面设置 NO_CACHE_RUNTIME ,例如:

define( ‘NO_CACHE_RUNTIME’ ,True);

以及设置对编译缓存的内容是否进行去空白和注释,例如:

define( ‘STRIP_RUNTIME_SPACE’ ,false);

则生成的编译缓存文件是没有经过去注释和空白的,仅仅是把文件合并到一起,这样的好处是便于调试的错误定位,建议 部署模式的时候把上面的设置为 True 或者删除该定义。

3 # ThinkPHP 支持的 URL 模式包括普通模式、 PATHINFO 模式、 REWRITE 模式和兼容模式,并且都提供路由支持。默认为 PATHINFO 模式,提供最好的用户体验和搜索引擎友好支持。

例如普通模式下面的 URL 为:

http://localhost/appName/index.php?m=moduleName&a=actionName&id=1

如果使用 PATHINFO 模式的话, URL 成为:

http://localhost/appName/index.php/moduleName/actionName/id/1/

PATHINFO 模式对以往的编程方式没有影响, GET POST 方式传值依然有效,因为系统会对 PATHINFO 方式自动处理,例如上面 URL 地址中的 id 的值可以通过 $_GET[ 'id' ] 的方式正常获取到。

如果使用 REWRITE 模式,通过配置 URL 可以成为:

http://localhost/appName/moduleName/actionName/id/1/

例如上面生成的 myApp 项目如果我们通过下面的 URL 访问:

http://localhost/myApp/

其实是定位到 myApp 项目的 Index 模块的 index 操作,因为系统在没有指定模块和操作的时候,会执行默认的模块和操作,这个在 ThinkPHP 的惯例配置里面是 Index 模块和 index 操作。因此下面的 URL 和上面的结果是相同的:

http://localhost/myApp/index.php/Index/index/

通过项目配置参数,我们可以改变这个默认配置。

系统还支持分组模式和 URL 路由的功能

4 # ThinkPHP 框架的所有文件都是采用 UTF-8 编码保存,但是这不影响你的项目中使用其他编码开发和浏览。请注意确保文件保存的时候去掉 UTF-8 BOM 头信息,防止因产生隐藏的输出而导致程序运行不正常。

5 # 如果你是在 Linux 环境下,要确保项目目录的自动生成,请设置 目录的权限为可写,否则请自行创建相关目录。然后设置 Runtime 目录为可写权限(通常都是设置目录属性为 777 )。

6 # action=”__URL__/insert” 表示提交表单到当前模块的 insert 操作。

ThinkPHP入口文件

ThinkPHP 采用单一入口模式进行项目部署和访问,无论完成什么功能,一个项目只有一个统一(但不一定是唯一)的入口。并且所有的项目的入口文件是类似的,入口文件主要完成的作用是:

² 路径定义 项目名称定义(可选)

² 额外参数定义(可选)

² 载入框架入口文件( 必须

² 实例化一个 App 应用( 必须

下面是一个标准的入口文件的写法:

<? php

// 定义 ThinkPHP 框架路径 ( 相对于入口文件 )

define( ‘THINK_PATH’ , ‘../ThinkPHP’ );

// 定义项目名称和路径

define( ‘APP_NAME’ , ‘Myapp’ );

define( ‘APP_PATH’ , ‘.’ );

// 加载框架入口文件

require(THINK_PATH.“/ThinkPHP.php”);

// 实例化一个网站应用实例

App::run();

?>

ThinkPHP命名规范

框架必然有其自身的一定规范,在 ThinkPHP 中亦然。下面是使用 ThinkPHP 应该尽量遵循的命名规范:

² 类文件都是以 .class.php 为后缀(这里是指的 ThinkPHP 内部使用的类库文件,不代表外部加载的类库文件),使用驼峰法命名,并且首字母大写,例如 DbMysql.class.php

² 函数、配置文件等其他类库文件之外的一般是以 .php 为后缀(第三方引入的不做要求)。

² 确保文件的命名和调用大小写一致,是由于在类 Unix 系统上面,对大小写是敏感的(而 ThinkPHP 在调试模式下面,即使在 Windows 平台也会严格检查大小写)。

² 类名和文件名一致 (包括上面说的大小写一致),例如 UserAction 类的文件命名是 UserAction.class.php InfoModel 类的文件名是 InfoModel.class.php

² 函数的命名 使用小写字母和下划线的方式,例如 get_client_ip

² Action 控制器类以 Action 为后缀 ,例如 UserAction InfoAction

² 模型类以 Model 为后缀 ,例如 UserModel InfoModel

² 方法 的命名使用驼峰法,并且首字母小写,例如 getUserName

² 属性 的命名使用驼峰法,并且首字母小写,例如 tableName

² 以双下划线” __ “打头的函数或方法作为魔法方法,例如 __call __autoload

² 常量 以大写字母和下划线命名,例如 HAS_ONE MANY_TO_MANY

² 配置参数 以大写字母和下划线命名,例如 HTML_CACHE_ON

² 语言变量以大写字母和下划线命名,例如 MY_LANG ,以下划线打头的语言变量通常用于系统语言变量,例如 _CLASS_NOT_EXIST_

² 数据表和字段采用小写加下划线方式命名 ,例如 think_user user_name

特例:

ThinkPHP 里面,有一个函数命名的特例,就是单字母大写函数,这类函数通常是某些操作的快捷定义,或者有特殊的作用。例如, ADSL 方法等等,他们有着特殊的含义,后面会有所了解。

另外一点, ThinkPHP 默认使用 UTF-8编码 ,所以请确保你的程序文件采用 UTF-8 编码格式保存,并且去掉 BOM 信息头(去掉 BOM 头信息有很多方式,不同的编辑器都有设置方法,也可以用工具进行统一检测和处理)。

MVC设计模式简介

MVC

MVC 是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。使用 MVC 应用程序被分成三个核心部件:模型( M )、视图( V )、控制器( C ,它们各自处理自己的任务。

视图 :视图是用户看到并与之交互的界面。对老式的 Web 应用程序来说,视图就是由 HTML 元素组成的界面,在新式的 Web 应用程序中, HTML 依旧在视图中扮演着重要的角色,但一些新的技术已层出不穷,它们包括 Adobe Flash 和象 XHTML XML/XSL WML 等一些标识语言和 Web services 。如何处理应用程序的界面变得越来越有挑战性。 MVC 一个大的好处是它能为你的应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,不管这些数据是联机存储的还是一个雇员列表,作为视图来讲,它只是作为一种输出数据并允许用户操纵的方式。

模型 :模型表示企业数据和业务规则。在 MVC 的三个部件中,模型拥有最多的处理任务。例如它可能用象 EJBs ColdFusion Components 这样的构件对象来处理数据库。被模型返回的数据是中立的,就是说模型与数据格式无关,这样一个模型能为多个视图提供数据。由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。

控制器 :控制器接受用户的输入并调用模型和视图去完成用户的需求。所以当单击 Web 页面中的超链接和发送 HTML 表单时,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后确定用哪个视图来显示模型处理返回的数据。

现在我们总结 MVC 的处理过程,首先控制器接收用户的请求,并决定应该调用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请求并返回数据,最后控制器用相应的视图格式化模型返回的数据,并通过表示层呈现给用户。