执行 SQL 语句
数据库连接建立后,SQL 语句就可以通过使用 [CDbCommand] 执行了。你可以通过使用指定的SQL语句作为参数调用 [CDbConnection::createCommand()] 创建一个 [CDbCommand] 实例。
// 假设你已经建立了一个 "db" 连接,可以在 protected/config/main.php 中设置 $connection=Yii::app()->db; // 如果没有,你可能需要显式建立一个连接: // $connection=new CDbConnection($dsn,$username,$password); $command=$connection->createCommand($sql); // 如果需要,此 SQL 语句可通过如下方式修改: // $command->text=$newSQL;
一条 SQL 语句会通过 [CDbCommand] 以如下两种方式被执行:
[execute()|CDbCommand::execute]: 执行一个无查询 (non-query)SQL语句, 例如 INSERT, UPDATE 和 DELETE 。如果成功,它将返回此执行所影响的行数。
[query()|CDbCommand::query]: 执行一条会返回若干行数据的 SQL 语句,例如 SELECT。 如果成功,它将返回一个 CDbDataReader实例,通过此实例可以遍历数据的结果行。为简便起见, (Yii)还实现了一系列 queryXXX() 方法以直接返回查询结果。
可选方法:queryAll(), queryOne(), queryColumn(), queryScalar(), query()
query()
执行一条 sql 指令并返回结果
public yii\db\DataReader query ( ) | ||
return | yii\db\DataReader | DataReader类型的查询结果 |
---|---|---|
throws | yii\db\Exception | 如果遇到错误就抛出异常 |
queryAll()
执行一条 sql 指令并一次性返回所有的执行结果
public array queryAll ( $fetchMode = null ) | ||
$fetchMode | integer | 查询结果读取方式,可参考PHP手册填写适合的模式,如果如果不填写就默认为空。 |
return | array | 查询结果的所有数据。每个 array 元素对应查询结果的一行。如果查询不到任何数据就会返回一个空数组。 |
---|---|---|
throws | yii\db\Exception | 执行错误 |
queryOne()
执行一条 sql 指令并返回查询结果第一行数据
这个方法最好用于一次只需要返回一行查询结果的场景。
public array|false queryOne ( $fetchMode = null ) | ||
$fetchMode | integer | 查询结果读取方式,可参考PHP手册填写适合的模式,如果如果不填写就默认为空。 |
return | array|false | 查询结果如果不为空则返回一个 array, array 元素对应查询结果的一行。如果查询不到任何数据就会返回 false。 |
---|---|---|
throws | yii\db\Exception | 执行错误 |
queryScalar()
执行一条 sql 指令并返回查询结果第一行数据的第一列内容。
这个方法最好用于一次只需要返回一个返回值的场景。
public string|null|false queryScalar ( ) | ||
return | string|null|false | 返回查询结果第一行数据的第一列内容。如果查询不到任何数据就会返回 false。 |
---|---|---|
throws | yii\db\Exception | 执行错误 |
queryColumn()
执行一条 sql 指令并返回查询结果第一列内容。
这个方法最好用于一次只需要第一列返回值的场景。
public array queryColumn ( ) | ||
return | array | 返回查询结果数据的第一列内容。如果查询不到任何数据就会返回一个空 array。 |
---|---|---|
throws | yii\db\Exception | 执行错误 |
执行 SQL 语句时如果发生错误,将会抛出一个异常。
$rowCount=$command->execute(); // 执行无查询 SQL,增、删、改 $dataReader=$command->query(); // 执行一个 SQL 查询,但是不返回数据 $rows=$command->queryAll(); // 查询并返回结果中的所有行 $row=$command->queryRow(); // 查询并返回结果中的第一行 $column=$command->queryColumn(); // 查询并返回结果中的第一列 $value=$command->queryScalar(); // 查询并返回结果中第一行的第一个字段
获取查询结果(query方法和read方法)
在 [CDbCommand::query()] 生成 CDbDataReader 实例之后,你可以通过重复调用 [CDbDataReader::read()] 获取结果中的行。你也可以在 PHP 的 foreach 语言结构中使用 CDbDataReader 一行行检索数据。
$dataReader=$command->query(); // 1、重复调用 read() 直到它返回 false while(($row=$dataReader->read())!==false) { ... } // 2、使用 foreach 遍历数据中的每一行 foreach($dataReader as $row) { ... } // 3、一次性提取所有行到一个数组 $rows=$dataReader->readAll();
Note|注意: 不同于 [query()|CDbCommand::query],所有的 queryXXX() 方法会直接返回数据。 例如, [queryRow()|CDbCommand::queryRow] 会返回代表查询结果第一行的一个数组。