Heim >Backend-Entwicklung >PHP-Tutorial >PHP-Entwicklungsframework Yii Framework-Tutorial (24) Datenbank-DAO-Beispiel
Data Access Object (DAO) bietet eine gemeinsame API für den Zugriff auf Daten, die in verschiedenen Datenbankverwaltungssystemen (DBMS) gespeichert sind. Daher besteht beim Wechsel des zugrunde liegenden DBMS zu einem anderen keine Notwendigkeit, den Code zu ändern, der DAO für den Datenzugriff verwendet.
Yii DAO basiert auf PHP Data Objects (PDO). Es handelt sich um eine Erweiterung, die einen einheitlichen Datenzugriff für viele gängige DBMS bietet, darunter MySQL, PostgreSQL usw. Um Yii DAO verwenden zu können, müssen daher die PDO-Erweiterung und ein spezifischer PDO-Datenbanktreiber (z. B. PDO_MYSQL) installiert sein.
Yii DAO umfasst hauptsächlich die folgenden vier Klassen:
CDbConnection: stellt eine Datenbankverbindung dar.
CDbCommand: Stellt eine SQL-Anweisung dar, die über die Datenbank ausgeführt wird.
CDbDataReader: Stellt einen Nur-Vorwärts-Stream von Zeilen aus einem Abfrageergebnissatz dar.
CDbTransaction: Stellt eine Datenbanktransaktion dar.
Im Folgenden stellen wir die Anwendung von Yii DAO in verschiedenen Szenarien vor.
1. Stellen Sie eine Datenbankverbindung her
Um eine Datenbankverbindung herzustellen, erstellen Sie eine CDbConnection-Instanz und aktivieren Sie diese. Für die Verbindung mit einer Datenbank ist ein Datenquellenname (DSN) erforderlich, um Verbindungsinformationen anzugeben. Benutzername und Passwort können ebenfalls verwendet werden. Wenn beim Herstellen der Verbindung zur Datenbank ein Fehler auftritt (z. B. falscher DSN oder ungültiger Benutzername/Passwort), wird eine Ausnahme ausgelöst.
$connection=new CDbConnection($dsn,$username,$password); // 建立连接。你可以使用 try...catch 捕获可能抛出的异常 $connection->active=true; ......
$connection->active=false; // Das Format des geschlossenen Verbindungs-DSN hängt vom verwendeten PDO-Datenbanktreiber ab. Im Allgemeinen enthält der DSN den Namen des PDO-Treibers, gefolgt von einem Doppelpunkt, gefolgt von der treiberspezifischen Verbindungssyntax. Weitere Informationen finden Sie in der PDO-Dokumentation. Nachfolgend finden Sie eine Liste häufig verwendeter DSN-Formate.
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
Da CDbConnection von CApplicationComponent erbt, können wir es auch als Anwendungskomponente verwenden. Konfigurieren Sie dazu bitte eine DB-Anwendungskomponente (oder einen anderen Namen) in der Anwendungskonfiguration wie folgt:
Dieses Beispiel verwendet die MySQL-Chinook-Datenbank, ändern Sie 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 ), ),
Dann können wir über Yii::app()->db auf die Datenbankverbindung zugreifen. Es wird automatisch aktiviert, es sei denn, wir konfigurieren CDbConnection::autoConnect ausdrücklich auf „false“. Auf diese Weise kann diese einzelne DB-Verbindung an vielen Stellen in unserem Code gemeinsam genutzt werden.
2. SQL-Anweisung ausführen
Nachdem die Datenbankverbindung hergestellt wurde, kann die SQL-Anweisung mithilfe von CDbCommand ausgeführt werden. Sie können eine CDbCommand-Instanz erstellen, indem Sie CDbConnection::createCommand() mit der angegebenen SQL-Anweisung als Argument aufrufen.
Der Einfachheit halber verwenden wir die Employee-Tabelle in der Chinook-Datenbank und ändern das DataModel
class DataModel { public $employeeId; public $firstName; public $lastName; public $title; public $address; public $email; }
Hinweis: Das Erstellen eines DataModel ist optional.
Ändern Sie die indexAction-Methode von 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,)); }
Eine SQL-Anweisung wird über CDbCommand auf die folgenden zwei Arten ausgeführt:
execute(): führt eine abfragelose ( Nicht-Abfrage-SQL-Anweisungen wie INSERT, UPDATE und DELETE. Bei Erfolg wird die Anzahl der von dieser Ausführung betroffenen Zeilen zurückgegeben. query(): Führen Sie eine SQL-Anweisung aus, die mehrere Datenzeilen zurückgibt, z. B. SELECT. Bei Erfolg wird eine CDbDataReader-Instanz zurückgegeben, über die die resultierenden Datenzeilen iteriert werden können. Der Einfachheit halber implementiert (Yii) auch eine Reihe von queryXXX()-Methoden, um Abfrageergebnisse direkt zurückzugeben.
Wenn beim Ausführen der SQL-Anweisung ein Fehler auftritt, wird eine Ausnahme ausgelöst.
$rowCount=$command->execute(); // 执行无查询 SQL $dataReader=$command->query(); // 执行一个 SQL 查询 $rows=$command->queryAll(); // 查询并返回结果中的所有行 $row=$command->queryRow(); // 查询并返回结果中的第一行 $column=$command->queryColumn(); // 查询并返回结果中的第一列 $value=$command->queryScalar(); // 查询并返回结果中第一行的第一个字段
3. Abfrageergebnisse abrufen
Nachdem CDbCommand::query() eine CDbDataReader-Instanz generiert hat, können Sie das Ergebnis durch wiederholten Aufruf von CDbDataReader::read() abrufen . Sie können CDbDataReader auch im foreach-Sprachkonstrukt von PHP verwenden, um Daten Zeile für Zeile abzurufen.
$dataReader=$command->query(); // 重复调用 read() 直到它返回 false while(($row=$dataReader->read())!==false) { ... } // 使用 foreach 遍历数据中的每一行 foreach($dataReader as $row) { ... } // 一次性提取所有行到一个数组 $rows=$dataReader->readAll();
4. Abfrageergebnisse anzeigen
Der Einfachheit halber wird in diesem Beispiel die Echo-Anweisung zum Anzeigen von Mitarbeiterdatensätzen verwendet Tische.
Ändern Sie 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. Verwenden Sie Transaktionen
Wenn eine Anwendung mehrere Abfragen ausführen muss, muss jede Abfrage abgerufen werden aus der Datenbank Beim Lesen und/oder Schreiben von Informationen in die Datenbank ist es sehr wichtig sicherzustellen, dass die Datenbank nicht mehrere Abfragen hinterlässt und nur wenige andere ausführt. Transaktionen, die in Yii als CDbTransaction-Instanzen dargestellt werden, können in den folgenden Situationen gestartet werden:
Transaktion nacheinander ausführen. Eventuelle Aktualisierungen der Datenbank sind für die Außenwelt nicht sichtbar. Bestätigen Sie die Transaktion. Wenn die Transaktion erfolgreich ist, wird die Aktualisierung sichtbar. Wenn eine der Abfragen fehlschlägt, wird die gesamte Transaktion zurückgesetzt.
Der obige Workflow kann durch den folgenden Code implementiert werden:
$transaction=$connection->beginTransaction(); try { $connection->createCommand($sql1)->execute(); $connection->createCommand($sql2)->execute(); //.... other SQL executions $transaction->commit(); } catch(Exception $e) // 如果有一条查询失败,则会抛出异常 { $transaction->rollBack(); }
6. Bindungsparameter
Um SQL-Injection-Angriffe zu vermeiden und die Effizienz wiederholt ausgeführter SQL-Anweisungen zu verbessern , Sie können eine SQL-Anweisung mit optionalen Parameterplatzhaltern „vorbereiten“, die beim Binden der Parameter durch die tatsächlichen Parameter ersetzt werden.
Parameterplatzhalter können benannt (als eindeutiges Token angezeigt) oder unbenannt (als Fragezeichen angezeigt) sein. Rufen Sie CDbCommand::bindParam() oder CDbCommand::bindValue() auf, um diese Platzhalter durch tatsächliche Parameter zu ersetzen. Diese Parameter müssen nicht in Anführungszeichen gesetzt werden: Der zugrunde liegende Datenbanktreiber erledigt dies für Sie. Die Parameterbindung muss abgeschlossen sein, bevor die SQL-Anweisung ausgeführt wird.
// 一条带有两个占位符 ":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)!