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 classes 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 de connexion fermée 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
Puisque CDbConnection hérite de CApplicationComponent, nous pouvons également l'utiliser comme composant d'application. Pour ce faire, veuillez configurer un composant d'application db (ou autre nom) dans la configuration de l'application comme suit :
Cet exemple utilise la base de données MySQL chinook, modifiez protected/config/main.php
'components'=>array( 'db'=>array( 'class'=>'CDbConnection', 'connectionString'=>'mysql:host=localhost;dbname=chinook', '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écuter 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.
Pour plus de simplicité, nous utilisons la table Employee dans la base de données Chinook et modifions le DataModel
class DataModel { public $employeeId; public $firstName; public $lastName; public $title; public $address; public $email; }
Remarque : la création d'un DataModel est facultative.
Modifiez la méthode indexAction de SiteController :
public function actionIndex(){ $model = array();$sql='SELECT * FROM Employee'; // 假设你已经建立了一个 "db" 连接$connection=Yii::app()->db; // 如果没有,你可能需要显式建立一个连接: // $connection=new CDbConnection($dsn,$username,$password); $command=$connection->createCommand($sql); // 如果需要,此 SQL 语句可通过如下方式修改: // $command->text=$newSQL; $dataReader=$command->query(); // each $row is an array representing a row of dataforeach($dataReader as $row){$employee = new DataModel(); $employee->employeeId=$row['EmployeeId']; $employee->firstName=$row['FirstName']; $employee->lastName=$row['LastName']; $employee->title=$row['Title']; $employee->address=$row['Address']; $employee->email=$row['Email']; $model[]=$employee;} $this->render('index', array('model' => $model,)); }
Une instruction SQL sera exécutée via CDbCommand des deux manières suivantes :
execute() : exécute une requête sans requête ( non-requête) des instructions SQL telles 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
Après que CDbCommand::query() ait généré une instance de CDbDataReader, vous pouvez obtenir le résultat en appelant à plusieurs reprises CDbDataReader::read() OK . Vous pouvez également utiliser CDbDataReader dans la construction du langage PHP foreach 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();
4. Afficher les résultats de la requête
Par souci de simplicité, cet exemple utilise l'instruction echo pour afficher l'enregistrement Employee. Plus tard, vous pouvez utiliser GridView ou ListView. pour afficher la table de la base de données.
Modifier protected/views/site/index.php
foreach($model as $employee) { echo 'EmployeeId:' . $employee->employeeId . ' '; echo 'First Name:' . $employee->firstName . ' '; echo 'Last Name:' . $employee->lastName . ' '; echo 'Title:' . $employee->title . ' '; echo 'Address:' . $employee->address . ' '; echo 'Email:' . $employee->email . ' '; echo '---------------------- '; } ?>
5. Utiliser les transactions
Lorsqu'une application doit exécuter plusieurs requêtes, chaque requête doit être récupérée depuis la base de données Lors de la lecture et/ou de l'écriture d'informations dans la base de données, il est très important de s'assurer que la base de données ne laisse pas plusieurs requêtes et n'en exécute que quelques autres. Les transactions, représentées dans Yii comme des instances CDbTransaction, peuvent être démarrées dans les situations suivantes :
Démarrer la transaction une par une. Les mises à jour de la base de données ne sont pas visibles du monde extérieur. Validez la transaction. Si la transaction réussit, la mise à jour devient visible. Si l'une des requêtes échoue, la totalité de la transaction est annulée.
Le workflow ci-dessus peut être implémenté via le code suivant :
$transaction=$connection->beginTransaction(); try { $connection->createCommand($sql1)->execute(); $connection->createCommand($sql2)->execute(); //.... other SQL executions $transaction->commit(); } catch(Exception $e) // 如果有一条查询失败,则会抛出异常 { $transaction->rollBack(); }
6. Lier les paramètres
Pour éviter les attaques par injection SQL et améliorer l'efficacité des instructions SQL exécutées à plusieurs reprises. , Vous pouvez "préparer" une instruction SQL avec des espaces réservés de paramètres facultatifs, qui seront remplacés par les paramètres réels lorsque les paramètres sont liés.
Les espaces réservés aux paramètres peuvent être nommés (apparaître comme un jeton unique) ou sans nom (apparaître comme un point d'interrogation). Appelez CDbCommand::bindParam() ou CDbCommand::bindValue() pour remplacer ces espaces réservés par des paramètres réels. Ces paramètres n'ont pas besoin d'être mis entre guillemets : le pilote de base de données sous-jacent s'en charge pour vous. La liaison des paramètres doit être terminée avant l'exécution de l'instruction 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文档。
7. 绑定列
当获取查询结果时,你也可以使用 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 }
8. 使用表前缀
从版本 1.1.0 起, Yii 提供了集成了对使用表前缀的支持。 表前缀是指在当前连接的数据 库中的数据表的名字前面添加的一个字符串。 它常用于共享的服务器环境,这种环境中多个应用可能会共享同一个数据库,要 使用不同的表前缀以相互区分。 例如,一个应用可以使用 tbl_ 作为表前缀而另一个可以使用 yii_。
要使用表前缀, 配置 CDbConnection::tablePrefix 属性为所希望的表前缀。 然后,在 SQL 语句中使用{{TableName}} 代表表的名字,其中的 TableName 是指不带前缀的表名。 例如,如果数据库含有一个名为tbl_user 的表,而 tbl_ 被配置为表前缀,那我们就可以使 用如下代码执行用户相关的查询:
$sql='SELECT * FROM {{user}}';$users=$connection->createCommand($sql)->queryAll();
以上就是PHP开发框架Yii Framework教程(24) 数据库-DAO示例的内容,更多相关内容请关注PHP中文网(www.php.cn)!