Yii提供了强大的数据库编程的支持。Yii数据访问对象(DAO)是建立在PHP数据对象(PDO)延伸,使不同的数据库管理系统(DBMS)是在一个统一的接口访问。应用开发Yii的刀可以很容易地切换到不同的数据库管理系统,而不需要修改数据访问代码。

数据访问对象(DAO)提供了一个通用的API,用于对存储在不同数据库管理系统(DBMS)中的数据进行访问。因此,当将底层DBMS更改为另一个DBMS时,不需要修改使用DAO访问数据的代码。

一道是基于PHP数据对象(PDO)建造的。它是一个扩展,提供了统一的许多流行的数据库管理系统,数据访问,包括MySQL,PostgreSQL,等等。因此,使用Yii DAO,PDO扩展和具体的PDO数据库驱动程序,如pdo_mysql,必须安装。

一道主要包含以下四类:

cdbconnection:代表一个数据库连接。

CDbCommand:代表一个SQL语句,通过数据库执行。

CDbDataReader:是一个流,向前移动,从行集的查询结果。

cdbtransaction:代表一个数据库事务。

接下来,我们介绍了在不同情况下的一道中的应用。

1。建立数据库连接

创建数据库连接,创建一个cdbconnection实例和激活它。到数据库的连接需要一个数据源名称(DSN)指定的连接信息,用户名和密码也可能被使用。与数据库的连接过程中出现错误时(例如,错误的DSN或无效的用户名 /密码),将抛出一个异常。

复制代码代码如下所示:

连接=新cdbconnection(美元美元美元美元的DSN,用户名,密码);

连接。您可以尝试使用…捕获捕获可能抛出的异常。

$连接>活动=真;

......

连接>活动= false;关闭连接



该DSN格式取决于PDO的数据库驱动的应用。一般来说,DSN包含PDO驱动程序的名称,紧跟冒号,并保持与特定驱动程序的连接语法。更多的信息可以从PDO文档获得。以下是常见的DSN格式。

复制代码代码如下所示:

SQLite:SQLite: / / / DBFile路径

MySQL:MySQL:主机= localhost;北京库

PostgreSQL:PGSQL:主机= localhost;端口= 5432;北京库

SQL服务器:MSSQL:主机= localhost;北京库

Oracle OCI:北京: / / /库本地:1521



因为cdbconnection继承capplicationcomponent,我们也可以使用它作为一个应用程序的组成部分。为此,配置数据库(或其他名字)在应用程序配置应用程序组件如下:

复制代码代码如下所示:

(阵列

......

组件=数组(

......

db=数组(

类= > 'cdbconnection,

'ConnectionString' = > 'mysql:主机为localhost;北京库,

用户名= > 'root,

密码= > 'password,

emulateprepare= >真的,由一些MySQL安装 / /需要

),

),

)



然后,我们可以通过一连接access数据库::APP()-> db.it已自动激活,除非我们特别配置cdbconnection::自动连接是错误的。这样,这个单一的数据库连接可以共享代码中的许多地方。

2。执行SQL语句

在建立了数据库连接、SQL语句可以使用cdbcommand执行。你可以通过使用指定的SQL语句作为参数来调用cdbconnection创建一个cdbcommand实例::createCommand()。

复制代码代码如下所示:

连接= Yii应用::美元(->分贝); / /如果你已经建立了一个分贝链接

如果没有,您可能需要显式地建立连接:

连接=新/ cdbconnection美元(美元美元美元的DSN,用户名,密码);

$命令=连接-> createcommand美元($ SQL);

如果需要,SQL语句可以按照以下方式进行修改:

/ / $命令->文本= $ NewSQL;



SQL语句是在通过以下两种方式执行cdbcommand:

执行():执行一个非查询(非查询)SQL语句,如插入、更新和删除。如果成功,它返回受此执行影响的行数。

查询():执行SQL语句返回的行数的数据,如选择。如果成功,它返回一个cdbdatareader实例,通过数据的结果排可以走过。为了简单起见,(一)也实施了一系列queryxxx()方法返回结果的直接查询。

如果在执行SQL语句时发生错误,则会引发异常。

复制代码代码如下所示:

美元美元->执行命令行数=(SQL); / /不执行查询

($美元DataReader =命令>查询); / /执行一个SQL查询

($行=美元命令-> queryall); / /所有行的查询并返回结果

($行=美元命令-> queryrow); / /查询并返回结果的第一行

($美元列=命令> querycolumn); / /查询并返回结果的第一栏

(美元价值= $命令-> queryscalar); / /查询并返回第一行第一列的



三.获取查询结果

在cdbcommand::查询()产生一个cdbdatareader实例,你可以通过重复cdbdatareader得到结果中的行数::读()。你也可以使用cdbdatareader线在PHP的foreach语言结构检索数据。

复制代码代码如下所示:

美元美元的DataReader =命令>查询();

(读取)重复调用,直到返回false。

而((($行= $ DataReader ->阅读())!= false){…}

使用foreach /导线在每一行的数据

foreach($ DataReader达行){…}

将要提取到数组中的所有行

行=美元美元DataReader ->所有();



注:不同的查询(),所有的queryxxx()方法返回的数据直接。例如,queryrow()返回表示查询结果的第一行数组。

4。使用事务

当一个应用程序执行多个查询,每个查询需要读/写信息到数据库,它是确保数据库不留几个查询只执行一些其他的查询非常重要。交易,在一cdbtransaction实例表示,可能在以下情况下开始:

创业。

一个接一个地执行查询。对数据库的任何更新对外部世界都是不可见的。

提交事务。如果事务成功,则更新可见。

如果其中一个查询失败,整个事务将回滚。

上述工作流可以通过以下代码实现:

复制代码代码如下所示:

美元交易= $连接->开始();

尝试

{

连接-> createcommand美元(约合SQL1)->执行();

连接-> createcommand美元(约合SQL2)->执行();

SQL执行…其他。

$事务>提交();

}

catch(异常E)如果查询失败,则引发异常。

{

$事务>回滚();

}



5。结合参数

为了避免SQL注入攻击和提高SQL语句重复执行的效率,你可以准备(准备)包含可选参数占位符的SQL语句,这些占位符将被实际参数时,参数绑定。

参数占位符可以命名(一个独特的标签表示)或没有(一个问号表示)。Call CDbCommand::::bindparam()或cdbcommand bindValue()与实际参数替换这些占位符。这些参数不需要引用名言:底层的数据库驱动程序会为你做这个参数绑定必须在SQL语句执行完成。

复制代码代码如下所示:

带有两个占位符用户名和电子邮件的SQL

为SQL =插入tbl_user(用户名、电子邮件)值(:用户名、电子邮件);

$命令=连接-> createcommand美元($ SQL);

使用实际用户名替换占位符:

$命令-> bindparam(:用户名

用实际的电子邮件替换占位符:

$命令-> bindparam(:电子邮件

$命令>执行();

将新的参数设置为另一行

$命令-> bindparam(:用户名

$命令-> bindparam(:电子邮件

$命令>执行();



方法bindparam()和bindValue()非常相似,唯一的区别是,前者使用PHP变量绑定参数,后者使用价值。在存储大数据块参数,前者应首先使用性能的考虑。

有关绑定参数的更多信息,请参阅相关PHP文档。

6。绑定列

当您获得查询结果时,还可以使用PHP变量来绑定列。每次查询结果中有一行时,都会自动填充最新的值。

复制代码代码如下所示:

为SQL =选择用户名,从tbl_user 电子邮件;

DataReader连接->美元=美元createcommand($ SQL)->查询();

使用第一列(用户名)的用户名绑定

DataReader -> bindcolumn美元(1美元的用户名);

第二个电子邮件绑定变量(email)的使用

DataReader -> bindcolumn美元(2美元的电子邮件);

而($ DataReader ->阅读()!= false)

{

用户名和电子邮件中包含的用户名和电子邮件

}



7。使用表前缀

从版本1.1.0,Yii提供使用表前缀支持集成。表前缀是一个字符串,在数据库中当前连接的数据表的名称添加。通常用于共享服务器环境中,多个应用程序可以共享同一数据库,使用不同的表前缀区分对方。例如,一个应用程序可以使用tbl_作为表前缀和另一个可以使用yii_。

使用表前缀,配置cdbconnection::的tableprefix属性所需的表前缀。然后,在SQL语句中,{ {是} }用于表示名称的表,在表名是表名没有前缀。例如,如果数据库包含一个表称为tbl_user,和tbl_为表前缀,我们可以执行用户查询相关用下面的代码。

复制代码代码如下所示:

为SQL = 'select * { { } }的用户;

为用户连接-> createcommand美元($ SQL)-> queryall();