ThinkPHP内置了抽象数据库访问层,把不同的数据库操作封装起来,我们只需要使用公共的Db类进行操作,而无需针对不同的数据库写不同的代码和底层实现,Db类会自动调用相应的数据库驱动来处理。目前的数据库包括Mysql、SqlServer、PgSQL、Sqlite、Oracle、Ibase、Mongo,也包括对PDO的支持。
如果应用需要使用数据库,必须配置数据库连接信息,数据库的配置文件有多种定义方式。
一、全局配置定义
常用的配置方式是在应用配置文件或者模块配置文件中添加下面的配置参数://数据库配置信息
'DB_TYPE'=>'mysql',// 数据库类型
'DB_HOST'=>'localhost',// 服务器地址
'DB_NAME'=>'thinkphp',// 数据库名
'DB_USER'=>'root',// 用户名
'DB_PWD'=>'123456',// 密码
'DB_PORT'=>3306,// 端口
'DB_PREFIX'=>'think_',// 数据库表前缀
'DB_CHARSET'=>'utf8',// 字符集
'DB_DEBUG'=>TRUE,// 数据库调试模式 开启后可以记录SQL日志 3.2.3新增
数据库的类型由DB_TYPE参数设置。
下面是目前支持的数据库设置:mysql或mysqlimysql
pgsqlpgsql
sqlitesqlite
mssql 或sqlsrvsqlserver
oracleoracle
ibaseibase
mongomongo
PDOPDO支持的所有数据库 3.2.3以上版本取消了PDO设置
如果是3.2.3版本的话,由于全部采用PDO方式,所以DB_TYPE需要配置为实际的数据库类型,不再支持设置为PDO,也不再区分mysql和mysqli。
或者采用如下配置'DB_DSN'=>'mysql://root:123456@localhost:3306/thinkphp#utf8'
使用DB_DSN方式定义可以简化配置参数,DSN参数格式为:
数据库类型://用户名:密码@数据库地址:数据库端口/数据库名#字符集
如果两种配置参数同时存在的话,DB_DSN配置参数优先。
如果采用PDO驱动的话,则必须首先配置DB_TYPE为pdo,然后还需要单独配置其他参数,例如://PDO连接方式
'DB_TYPE'=>'pdo',// 数据库类型
'DB_USER'=>'root',// 用户名
'DB_PWD'=>'',// 密码
'DB_PREFIX'=>'think_',// 数据库表前缀
'DB_DSN'=>'mysql:host=localhost;dbname=thinkphp;charset=utf8'
配置文件定义的数据库连接信息一般是系统默认采用的,因为一般一个应用的数据库访问配置是相同的。该方法系统在连接数据库的时候会自动获取,无需手动连接。
可以对每个模块定义不同的数据库连接信息,如果开启了调试模式的话,还可以在不同的应用状态的配置文件里面定义独立的数据库配置信息。
二、模型类定义
如果在某个模型类里面定义了connection属性的话,则实例化该自定义模型的时候会采用定义的数据库连接信息,而不是配置文件中设置的默认连接信息,通常用于某些数据表位于当前数据库连接之外的其它数据库,例如://在模型里单独设置数据库连接信息
namespaceHome\Model;
useThink\Model;
classUserModelextendsModel{
protected$connection =array(
'db_type'=>'mysql',
'db_user'=>'root',
'db_pwd'=>'1234',
'db_host'=>'localhost',
'db_port'=>'3306',
'db_name'=>'thinkphp',
'db_charset'=>'utf8',
);
}
也可以采用字符串方式定义,例如://在模型里单独设置数据库连接信息
namespaceHome\Model;
useThink\Model;
classUserModelextendsModel{
//或者使用字符串定义
protected$connection ='mysql://root:1234@localhost:3306/thinkphp#utf8';
}
如果我们已经在配置文件中配置了额外的数据库连接信息,例如://数据库配置1
'DB_CONFIG1'=>array(
'db_type'=>'mysql',
'db_user'=>'root',
'db_pwd'=>'1234',
'db_host'=>'localhost',
'db_port'=>'3306',
'db_name'=>'thinkphp',
'db_charset'=>'utf8',
),
//数据库配置2
'DB_CONFIG2'=>'mysql://root:1234@localhost:3306/thinkphp#utf8';
那么,我们可以把模型类的属性定义改为://在模型里单独设置数据库连接信息
namespaceHome\Model;
useThink\Model;
classUserModelextendsModel{
//调用配置文件中的数据库配置1
protected$connection ='DB_CONFIG1';
}//在模型里单独设置数据库连接信息
namespaceHome\Model;
useThink\Model;
classInfoModelextendsModel{
//调用配置文件中的数据库配置1
protected$connection ='DB_CONFIG2';
}
三、实例化定义
除了在模型定义的时候指定数据库连接信息外,我们还可以在实例化的时候指定数据库连接信息,例如: 如果采用的是M方法实例化模型的话,也可以支持传入不同的数据库连接信息,例如:$User =M('User','other_','mysql://root:1234@localhost/demo#utf8');
表示实例化User模型,连接的是demo数据库的other_user表,采用的连接信息是第三个参数配置的。如果我们在项目配置文件中已经配置了DB_CONFIG2的话,也可以采用:$User =M('User','other_','DB_CONFIG2');