Yii 学習概要データ アクセス オブジェクト (DAO)、yiidao
Yii は強力なデータベース プログラミング サポートを提供します。 Yii データ アクセス オブジェクト (DAO) は、PHP データ オブジェクト (PDO) 拡張機能に基づいて構築されており、単一の統一インターフェイスを介してさまざまなデータベース管理システム (DBMS) にアクセスできます。 Yii の DAO を使用して開発されたアプリケーションは、データ アクセス コードを変更することなく、別のデータベース管理システムの使用に簡単に切り替えることができます。
データ アクセス オブジェクト (DAO) は、さまざまなデータベース管理システム (DBMS) に保存されているデータにアクセスするための共通 API を提供します。 したがって、基盤となる DBMS を別の DBMS に変更する場合、DAO を使用してデータにアクセスするコードを変更する必要はありません。
Yii DAO は PHP データ オブジェクト (PDO) に基づいて構築されています。これは、MySQL、PostgreSQL など、多くの一般的な DBMS に統合されたデータ アクセスを提供する拡張機能です。したがって、Yii DAO を使用するには、PDO 拡張機能と特定の PDO データベースドライバー (PDO_MYSQL など) をインストールする必要があります。
Yii DAO には主に次の 4 つのカテゴリが含まれます:
CDbConnection: データベース接続を表します。
CDbCommand: データベースを通じて実行される SQL ステートメントを表します。
CDbDataReader: クエリ結果セットからの行の前方専用ストリームを表します。
CDbTransaction: データベース トランザクションを表します。
以下では、さまざまなシナリオでの Yii DAO のアプリケーションを紹介します。
1.データベース接続を確立します
データベース接続を確立するには、CDbConnection インスタンスを作成し、アクティブ化します。 データベースに接続するには、接続情報を指定するデータ ソース名 (DSN) が必要です。ユーザー名とパスワードも使用できます。 データベースへの接続中にエラーが発生した場合 (たとえば、DSN が間違っている、ユーザー名/パスワードが無効であるなど)、例外がスローされます。
コードをコピーします コードは次のとおりです:
$connection=新しい CDbConnection($dsn,$ユーザー名,$パスワード);
// 接続を確立します。 try...catch を使用すると、スローされる可能性のある例外をキャッチできます
$connection->active=true;
...
$connection->active=false; // 接続を閉じます
DSN の形式は、使用される PDO データベース ドライバーによって異なります。通常、DSN には PDO ドライバーの名前、コロン、ドライバー固有の接続構文が含まれます。詳細については、PDO ドキュメントを参照してください。 以下は、一般的に使用される DSN 形式のリストです。
コードをコピーします コードは次のとおりです:
SQLite: sqlite:/path/to/dbfile
MySQL: mysql:host=localhost;dbname=testdb
PostgreSQL: pgsql:host=localhost;port=5432;dbname=testdb
SQL サーバー: mssql:host=localhost;dbname=testdb
Oracle: oci:dbname=//localhost:1521/testdb
CDbConnectionはCApplicationComponentを継承しているので、アプリケーションコンポーネントとしても利用できます。これを行うには、アプリケーション構成で db (または他の名前) アプリケーション コンポーネントを次のように構成します。
コードをコピーします コードは次のとおりです:
配列(
…
'コンポーネント'=>配列(
…
'db'=>配列(
'class'=>'CDbConnection',
'connectionString'=>'mysql:host=localhost;dbname=testdb',
'ユーザー名'=>'root',
'パスワード'=>'パスワード',
'emulatePrepare'=>true, // 一部の MySQL インストールで必要です
)、
)、
)
これで、Yii::app()->db を通じてデータベース接続にアクセスできるようになります。 CDbConnection::autoConnect を false に特別に設定しない限り、これは自動的にアクティブ化されます。こうすることで、この単一の DB 接続をコード内の多くの場所で共有できます。
2. SQL ステートメントを実行します
データベース接続が確立されたら、CDbCommand を使用して SQL ステートメントを実行できます。 CDbCommand インスタンスを作成するには、指定した SQL ステートメントを引数として CDbConnection::createCommand() を呼び出します。
コードをコピーします コードは次のとおりです:
$connection=Yii::app()->db; // 「db」接続が確立されていると仮定します
// そうでない場合は、明示的に接続を確立する必要がある場合があります:
// $connection=new CDbConnection($dsn,$username,$password);
$command=$connection->createCommand($sql);
// 必要に応じて、この SQL ステートメントを次のように変更できます:
// $command->text=$newSQL;
SQL ステートメントは、次の 2 つの方法で CDbCommand を通じて実行されます。
execute(): INSERT、UPDATE、DELETE などの非クエリ SQL ステートメントを実行します。成功すると、この実行によって影響を受けた行数が返されます。
query(): SELECT など、複数行のデータを返す SQL ステートメントを実行します。 成功すると、結果のデータ行を反復処理できる CDbDataReader インスタンスが返されます。簡単にするために、(Yii) はクエリ結果を直接返す一連の queryXXX() メソッドも実装します。
SQL ステートメントの実行時にエラーが発生した場合、例外がスローされます。
コードをコピーします コードは次のとおりです:
$rowCount=$command->execute(); // クエリ SQL を実行しません
$dataReader=$command->query(); // SQLクエリを実行します
$rows=$command->queryAll(); // クエリを実行し、結果のすべての行を返します
$row=$command->queryRow(); // クエリを実行し、結果の最初の行を返します
$column=$command->queryColumn(); // クエリを実行し、結果の最初の列を返します
$value=$command->queryScalar(); // クエリを実行し、結果の最初の行の最初のフィールドを返します
3. クエリ結果を取得する
CDbCommand::query() が CDbDataReader インスタンスを生成した後、CDbDataReader::read() を繰り返し呼び出すことで結果の行を取得できます。 PHP の foreach 言語構造で CDbDataReader を使用して、データを行ごとに取得することもできます。
コードをコピーします コードは次のとおりです:
$dataReader=$command->query();
// false が返されるまで read() を繰り返し呼び出します
while(($row=$dataReader->read())!==false) { ... }
// foreach を使用してデータの各行を反復処理します
foreach($dataReader as $row) { ... }
// すべての行を一度に配列に抽出します
$rows=$dataReader->readAll();
注: query() とは異なり、すべての queryXXX() メソッドはデータを直接返します。 たとえば、queryRow() は、クエリ結果の最初の行を表す配列を返します。
4. トランザクションを使用する
アプリケーションが複数のクエリを実行し、それぞれがデータベースから情報を読み取ったり、データベースに情報を書き込んだりする場合、データベースがいくつかのクエリを残して他のクエリだけを実行しないようにすることが重要です。 Yii では CDbTransaction インスタンスとして表されるトランザクションは、次の状況で開始される可能性があります:
ビジネスを始める
クエリを 1 つずつ実行します。データベースへの更新は外部からは見えません。
トランザクションをコミットします。トランザクションが成功すると、更新が表示されます。
クエリの 1 つが失敗すると、トランザクション全体がロールバックされます。
上記のワークフローは、次のコードを通じて実現できます:
コードをコピーします コードは次のとおりです:
$transaction=$connection->beginTransaction();
試してみてください
{
$connection->createCommand($sql1)->execute();
$connection->createCommand($sql2)->execute();
//....その他の SQL 実行
$transaction->commit();
}
catch(Exception $e) // クエリが失敗した場合、例外がスローされます
{
$transaction->rollBack();
}
5. バインドパラメータ
SQL インジェクション攻撃を回避し、SQL ステートメントを繰り返し実行する効率を向上させるために、オプションのパラメーター プレースホルダーを使用して SQL ステートメントを「準備」できます。パラメーターがバインドされると、これらのプレースホルダーは実際のパラメーターに置き換えられます。
パラメータ プレースホルダには、名前を付けることも (一意のトークンとして表示する)、名前を付けないこともできます (疑問符として表示)。 CDbCommand::bindParam() または CDbCommand::bindValue() を呼び出して、これらのプレースホルダーを実際のパラメーターに置き換えます。 これらのパラメータを引用符で囲む必要はありません。基礎となるデータベース ドライバがこれを処理します。 パラメータのバインドは、SQL ステートメントが実行される前に完了する必要があります。
コードをコピーします コードは次のとおりです:
// 2 つのプレースホルダー「:username」と「:email」を含む SQL
$sql="INSERT INTO tbl_user (ユーザー名, メールアドレス) VALUES(:ユーザー名,:メールアドレス)";
$command=$connection->createCommand($sql);
// プレースホルダー「:username」を実際のユーザー名に置き換えます
$command->bindParam(":ユーザー名",$ユーザー名,PDO::PARAM_STR);
// プレースホルダー「: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="ユーザー名、メールアドレスを tbl_user から選択";
$dataReader=$connection->createCommand($sql)->query();
// $username 変数を使用して最初の列 (ユーザー名) をバインドします
$dataReader->bindColumn(1,$username);
// $email 変数を使用して 2 番目の列 (電子メール) をバインドします
$dataReader->bindColumn(2,$email);
while($dataReader->read()!==false)
{
// $username と $email には、現在の行のユーザー名とメールアドレスが含まれます
}
7. テーブル接頭語を使用する
バージョン 1.1.0 以降、Yii はテーブル接頭辞の使用に対する統合サポートを提供します。 テーブル接頭辞は、現在接続されているデータベース内のデータ テーブルの名前の前に追加される文字列を指します。 これは、複数のアプリケーションが同じデータベースを共有し、それらを区別するために異なるテーブル プレフィックスを使用する共有サーバー環境でよく使用されます。 たとえば、あるアプリケーションではテーブル プレフィックスとして tbl_ を使用し、別のアプリケーションでは yii_ を使用できます。
テーブル プレフィックスを使用するには、CDbConnection::tablePrefix プロパティを目的のテーブル プレフィックスに設定します。 次に、{{TableName}} を使用して SQL ステートメント内のテーブルの名前を表します。ここで、TableName は接頭辞のないテーブル名を指します。 たとえば、データベースに tbl_user という名前のテーブルが含まれており、 tbl_ がテーブル プレフィックスとして構成されている場合、次のコードを使用してユーザー関連のクエリを実行できます。
コードをコピーします コードは次のとおりです:
$sql='SELECT * FROM {{user}}';
$users=$connection->createCommand($sql)->queryAll();
http://www.bkjia.com/PHPjc/959100.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/959100.html技術記事 Yii 学習の要約: データ アクセス オブジェクト (DAO)、yiidao Yii は強力なデータベース プログラミング サポートを提供します。 Yii データ アクセス オブジェクト (DAO) は PHP データ オブジェクト (PDO) 拡張機能に基づいて構築されており、...