Maison >développement back-end >tutoriel php >Yii Framework Official Guide Series 23 - Utilisation de bases de données : objets d'accès aux données (DAO)

Yii Framework Official Guide Series 23 - Utilisation de bases de données : objets d'accès aux données (DAO)

黄舟
黄舟original
2017-02-13 09:22:531303parcourir



Data Access Object (DAO) fournit une API commune pour accéder aux données stockées dans différents systèmes de gestion de bases de données (SGBD). Par conséquent, lors du remplacement du SGBD sous-jacent par un autre, il n'est pas nécessaire de modifier le code qui utilise DAO pour accéder aux données. Yii DAO est construit sur PHP Data Objects (PDO). Il s'agit d'une extension qui fournit un accès unifié aux données pour de nombreux SGBD populaires, notamment MySQL, PostgreSQL, etc. Par conséquent, pour utiliser Yii DAO, l'extension PDO et le pilote de base de données PDO spécifique (tel que PDO_MYSQL) doivent être installés. Yii DAO comprend principalement les quatre catégories suivantes :

  • CDbConnection : représente une connexion à une base de données.

  • CDbCommand : Représente une instruction SQL exécutée via la base de données.

  • CDbDataReader : représente un flux de lignes en avant uniquement à partir d'un ensemble de résultats de requête.

  • CDbTransaction : Représente une transaction de base de données.

Ci-dessous, nous présentons l'application de Yii DAO dans différents scénarios.

1. Établissez une connexion à la base de données

Pour établir une connexion à la base de données, créez une instance CDbConnection et activez-la . La connexion à une base de données nécessite un nom de source de données (DSN) pour spécifier les informations de connexion. Le nom d'utilisateur et le mot de passe peuvent également être utilisés. Lorsqu'une erreur se produit lors de la connexion à la base de données (par exemple, un DSN incorrect ou un nom d'utilisateur/mot de passe invalide), une exception sera levée.


$connection=new CDbConnection($dsn,$username,$password);
// 建立连接。你可以使用  try...catch 捕获可能抛出的异常
$connection->active=true;
......
$connection->active=false;  // 关闭连接

Le format du DSN dépend du pilote de base de données PDO utilisé. En général, le DSN contient le nom du pilote PDO, suivi de deux points, suivi de la syntaxe de connexion spécifique au pilote. Consultez la documentation PDO pour plus d'informations. Vous trouverez ci-dessous une liste des formats DSN couramment utilisés.

  • SQLite : sqlite:/path/to/dbfile

  • MySQL : mysql:host=localhost;dbname=testdb

  • PostgreSQL : pgsql:host=localhost;port=5432;dbname=testdb

  • SQL Server : mssql:host=localhost;dbname=testdb

  • Oracle : oci:dbname=//localhost:1521/testdb

En raison de CDbConnection Hérité de CApplicationComponent, nous pouvons également l'utiliser comme composant applicatif. Pour ce faire, configurez un composant d'application db (ou autre nom) dans la configuration de l'application comme suit :


array(
    ......
    'components'=>array(
        ......
        'db'=>array(
            'class'=>'CDbConnection',
            'connectionString'=>'mysql:host=localhost;dbname=testdb',
            'username'=>'root',
            'password'=>'password',
            'emulatePrepare'=>true,  // needed by some MySQL installations
        ),
    ),
)

Ensuite, nous pouvons accéder à la connexion à la base de données via Yii::app()->db. Il est automatiquement activé sauf si nous configurons spécifiquement CDbConnection::autoConnect sur false. De cette façon, cette connexion unique à la base de données peut être partagée à de nombreux endroits de notre code.

2. Exécutez l'instruction SQL

Une fois la connexion à la base de données établie, l'instruction SQL peut être exécutée à l'aide de CDbCommand. Vous pouvez créer une instance CDbCommand en appelant CDbConnection::createCommand() avec l'instruction SQL spécifiée comme argument.


$connection=Yii::app()->db;   // 假设你已经建立了一个 "db" 连接
// 如果没有,你可能需要显式建立一个连接:
// $connection=new CDbConnection($dsn,$username,$password);
$command=$connection->createCommand($sql);
// 如果需要,此 SQL 语句可通过如下方式修改:
// $command->text=$newSQL;

Une instruction SQL sera exécutée via CDbCommand des deux manières suivantes :

  • execute() : exécute une instruction SQL sans requête, telle que INSERT, UPDATE et DELETE. En cas de succès, il renvoie le nombre de lignes affectées par cette exécution.

  • query() : exécute une instruction SQL qui renvoie plusieurs lignes de données, telles que SELECT. En cas de succès, il renvoie une instance CDbDataReader à travers laquelle les lignes de données résultantes peuvent être itérées. Pour plus de simplicité, (Yii) implémente également une série de méthodes queryXXX() pour renvoyer directement les résultats de la requête.

Si une erreur se produit lors de l'exécution de l'instruction SQL, une exception sera levée.


$rowCount=$command->execute();   // 执行无查询 SQL
$dataReader=$command->query();   // 执行一个 SQL 查询
$rows=$command->queryAll();      // 查询并返回结果中的所有行
$row=$command->queryRow();       // 查询并返回结果中的第一行
$column=$command->queryColumn(); // 查询并返回结果中的第一列
$value=$command->queryScalar();  // 查询并返回结果中第一行的第一个字段

3. Obtenir les résultats de la requête

générer CDbDataReader dans CDbCommand::query() Après l'instanciation, vous pouvez obtenir les lignes du résultat en appelant à plusieurs reprises CDbDataReader::read(). Vous pouvez également utiliser CDbDataReader dans la structure du langage foreach de PHP pour récupérer des données ligne par ligne.


$dataReader=$command->query();
// 重复调用 read() 直到它返回 false
while(($row=$dataReader->read())!==false) { ... }
// 使用 foreach 遍历数据中的每一行
foreach($dataReader as $row) { ... }
// 一次性提取所有行到一个数组
$rows=$dataReader->readAll();

Remarque : est différent de query(), tous queryXXX() La méthode renverra directement les données. Par exemple, queryRow() renvoie un tableau représentant la première ligne des résultats de la requête.

4. Utiliser des transactions

Lorsqu'une application doit exécuter plusieurs requêtes et que chaque requête doit lire et/ou écrire des informations dans la base de données, assurez-vous que la base de données est très Il est important qu'il ne reste plus quelques requêtes et que seules quelques autres soient exécutées. Les transactions, représentées par des instances CDbTransaction dans Yii, peuvent être démarrées dans les situations suivantes :

  • Démarrer la transaction.

  • Exécuter les requêtes une par une. Les mises à jour de la base de données ne sont pas visibles du monde extérieur.

  • 提交事务。如果事务成功,更新变为可见。

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

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


$transaction=$connection->beginTransaction();
try
{
    $connection->createCommand($sql1)->execute();
    $connection->createCommand($sql2)->execute();
    //.... other SQL executions
    $transaction->commit();
}
catch(Exception $e) // 如果有一条查询失败,则会抛出异常
{
    $transaction->rollBack();
}

5. 绑定参数

要避免 SQL 注入攻击 并提高重复执行的 SQL 语句的效率, 你可以 "准备(prepare)"一条含有可选参数占位符的 SQL 语句,在参数绑定时,这些占位符将被替换为实际的参数。 参数占位符可以是命名的 (表现为一个唯一的标记) 或未命名的 (表现为一个问号)。调用 CDbCommand::bindParam()或 CDbCommand::bindValue() 以使用实际参数替换这些占位符。 这些参数不需要使用引号引起来:底层的数据库驱动会为你搞定这个。 参数绑定必须在 SQL 语句执行之前完成。


// 一条带有两个占位符 ":username" 和 ":email"的 SQL
$sql="INSERT INTO tbl_user (username, email) VALUES(:username,:email)";
$command=$connection->createCommand($sql);
// 用实际的用户名替换占位符 ":username" 
$command->bindParam(":username",$username,PDO::PARAM_STR);
// 用实际的 Email 替换占位符 ":email" 
$command->bindParam(":email",$email,PDO::PARAM_STR);
$command->execute();
// 使用新的参数集插入另一行
$command->bindParam(":username",$username2,PDO::PARAM_STR);
$command->bindParam(":email",$email2,PDO::PARAM_STR);
$command->execute();

方法 bindParam() 和 bindValue() 非常相似。唯一的区别就是前者使用一个 PHP 变量绑定参数, 而后者使用一个值。对于那些内存中的大数据块参数,处于性能的考虑,应优先使用前者。 关于绑定参数的更多信息,请参考 相关的PHP文档。

6. 绑定列

当获取查询结果时,你也可以使用 PHP 变量绑定列。 这样在每次获取查询结果中的一行时就会自动使用最新的值填充。


$sql="SELECT username, email FROM tbl_user";
$dataReader=$connection->createCommand($sql)->query();
// 使用 $username 变量绑定第一列 (username) 
$dataReader->bindColumn(1,$username);
// 使用 $email 变量绑定第二列 (email) 
$dataReader->bindColumn(2,$email);
while($dataReader->read()!==false)
{
    // $username 和 $email 含有当前行中的 username 和 email 
}

7. 使用表前缀

从版本 1.1.0 起, Yii 提供了集成了对使用表前缀的支持。 表前缀是指在当前连接的数据库中的数据表的名字前面添加的一个字符串。 它常用于共享的服务器环境,这种环境中多个应用可能会共享同一个数据库,要使用不同的表前缀以相互区分。 例如,一个应用可以使用 tbl_ 作为表前缀而另一个可以使用 yii_。 要使用表前缀,配置 CDbConnection::tablePrefix 属性为所希望的表前缀。 然后,在 SQL 语句中使用{{TableName}} 代表表的名字,其中的 TableName 是指不带前缀的表名。 例如,如果数据库含有一个名为tbl_user 的表,而 tbl_ 被配置为表前缀,那我们就可以使用如下代码执行用户相关的查询:

$sql='SELECT * FROM {{user}}';
$users=$connection->createCommand($sql)->queryAll();


以上就是Yii框架官方指南系列23——使用数据库:数据访问对象(DAO)的内容,更多相关内容请关注PHP中文网(www.php.cn)!



Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn