Heim  >  Artikel  >  Backend-Entwicklung  >  Yii Framework Offizieller Leitfaden Serie 23 – Verwendung von Datenbanken: Datenzugriffsobjekte (DAO)

Yii Framework Offizieller Leitfaden Serie 23 – Verwendung von Datenbanken: Datenzugriffsobjekte (DAO)

黄舟
黄舟Original
2017-02-13 09:22:531250Durchsuche



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 Kategorien:

  • 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 sie . 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 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

Wegen CDbConnection Von CApplicationComponent geerbt, wir können es auch als Anwendungskomponente verwenden. Konfigurieren Sie dazu eine Anwendungskomponente db (oder einen anderen Namen) in der Anwendungskonfiguration wie folgt:


array(
    ......
    'components'=>array(
        ......
        'db'=>array(
            'class'=>'CDbConnection',
            'connectionString'=>'mysql:host=localhost;dbname=testdb',
            '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. Führen Sie die SQL-Anweisung aus

Nachdem die Datenbankverbindung hergestellt wurde, kann die SQL-Anweisung mit CDbCommand ausgeführt werden. Sie können eine CDbCommand-Instanz erstellen, indem Sie CDbConnection::createCommand() mit der angegebenen SQL-Anweisung als Argument aufrufen.


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

Eine SQL-Anweisung wird über CDbCommand auf die folgenden zwei Arten ausgeführt:

  • execute(): Führt eine Nicht-Abfrage-SQL-Anweisung aus, z. B. 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

CDbDataReader in CDbCommand::query() generieren. Nach der Instanziierung können Sie die Zeilen im Ergebnis durch wiederholten Aufruf von CDbDataReader::read() abrufen. Sie können CDbDataReader auch in der foreach-Sprachstruktur 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();

Hinweis: unterscheidet sich von query(), alle queryXXX() Die Methode gibt Daten direkt zurück. Beispielsweise gibt queryRow() ein Array zurück, das die erste Zeile der Abfrageergebnisse darstellt.

4. Verwenden Sie Transaktionen

Wenn eine Anwendung mehrere Abfragen ausführen muss und jede Abfrage Informationen in die Datenbank lesen und/oder schreiben muss, stellen Sie sicher, dass die Datenbank sehr gut ist Wichtig ist, dass keine Abfragen mehr vorhanden sind und nur noch wenige andere ausgeführt werden. Transaktionen, die in Yii als CDbTransaction-Instanzen dargestellt werden, können in den folgenden Situationen gestartet werden:

  • Transaktion starten.

  • Abfragen einzeln ausführen. Eventuelle Aktualisierungen der Datenbank sind für die Außenwelt nicht sichtbar.

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

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

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


$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)!



Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn