DAO

バージョン3.1以降使用可能です。

Data Access Objects (DAO) separates a data resource's client interface from its data access mechanisms. It adapts a specific data resource's access API to a generic client interface. As a result, data access mechanisms can be changed independently of the code that uses the data. データアクセスオブジェクト(DAO)はそのデータアクセスメカニズムからデータリソースのクライアントインターフェースを切り分けています。それのために、具体的なデータリソースのアクセスAPIは一般的なクライアントインタフェースに適応します。結果として、データアクセスメカニズムは、データを使うコードと無関係に変更することができます。 Since version 3.1, PRADO starts to provide a DAO that is a thin wrap around PHP Data Objects (PDO). Although PDO has a nice feature set and good APIs, we choose to implement the PRADO DAO on top of PDO because the PRADO DAO classes are component classes and are thus configurable in a PRADO application. Users can use these DAO classes in a more PRADO-preferred way. バージョン3.1以降、PRADOはDAOを提供し始めました。それは、PHPデータオブジェクト(PDO)のまわりを薄く包んだようなものです。PDOは良い機能セットとよいAPIを持っているけれども、PRADO DAOクラスがコンポーネントクラスであり、PRADOアプリケーションの中でこれだけコンフィギュレーション可能なので、私達は、PDOの上でPRADO DAOを実装することにしました。ユーザーはPRADOでより親しまれている方法で、これらのDAOクラスを使うことができます。
Note
Since the PRADO DAO is based on PDO, the PDO PHP extension needs to be installed. In addition, you need to install the corresponding PDO driver for the database to be used in your application. See more details in the PHP Manual.
PRADO DAOがPDOに基づくので、PDO PHP拡張機能をインストールする必要があります。 さらに、あなたは、データベースがあなたのアプリケーションの中で使われるように、対応するPDOドライバーを取り付ける必要があります。これ以上の詳細は、PHPマニュアルを見てください。
The PRADO DAO mainly consists of the following four classes (in contrast to PDO which uses only two classes, PDO and PDOStatement): PRADO DAOは主に、以下の4つクラス(PDO、PDOStatement というわずか2つのクラスを使うだけのPDOに対し)からなります。
  • TDbConnection - represents a connection to a database.
  • TDbCommand - represents an SQL statement to execute against a database.
  • TDbDataReader - represents a forward-only stream of rows from a query result set.
  • TDbTransaction - represents a DB transaction.
  • TDbConnection - データベースとの接続を表現します。
  • TDbCommand - データベースを背景として実行するSQLステートメントを表現します。
  • TDbDataReader - クエリー結果セットから後戻りしない文列を表しています。
  • TDbTransaction - DBトランザクションを表しています。
In the following, we introduce the usage of PRADO DAO in different scenarios. 以下では、違うシナリオの中でのPRADO DAOの用法を紹介します。

データベース接続の確立

To establish a database connection, one creates a TDbConnection instance and activate it. A data source name (DSN) is needed to specify the information required to connect to the database. The database username and password may need to be supplied to establish the connection. データベース接続を確立するためには、TDbConnectionインスタンスを作成し、それを作動させます。データソース名(DSN)は、データベースと接続するために必要とされている情報を指定するために必要です。データベースユーザーネームとパスワードは、接続を確立するために設置する必要があります。
$connection=new TDbConnection($dsn,$username,$password);
// call setAttribute() to pass in additional connection parameters
// $connection->Persistent=true;  // use persistent connection
$connection->Active=true;  // connection is established
....
$connection->Active=false;  // connection is closed
Complete specification of DSN may be found in the PDO documentation. Below is a list of commonly used DSN formats: DSNの完全なマニュアルはPDOドキュメントの中を探す必要があるかもしれません。以下は一般的に使われるDSNフォーマットのリストです:
  • MySQL - mysql:host=localhost;dbname=test
  • SQLite - sqlite:/path/to/dbfile
  • ODBC - odbc:SAMPLE
  • PostgreSQL - pgsql:host=localhost;dbname=test
In case any error occurs when establishing the connection (such as bad DSN or username/password), a TDbException will be raised. 正しくないDSN、ユーザーネーム/パスワード等を確立する時に起こるいかなるエラー時に、TDbExceptionは発生します。

SQLステートメントの実行

Once a database connection is established, SQL statements can be executed through TDbCommand. One creates a TDbCommand by calling TDbConnection.createCommand() with the specified SQL statement: データベース接続が確立されたら、SQLステートメントはTDbCommandを通して実行することができます。指定されたSQLステートメントによってTDbConnection.createCommand()を呼び出すことによって、TDbCommandは作成されます。
$command=$connection->createCommand($sqlStatement);
// if needed, the SQL statement may be updated as follows:
$command->Text=$newSqlStatement;
An SQL statement is executed via TDbCommand in one of the following two ways: SQLステートメントは以下の2つの方法のうちの1つにおいてTDbCommand?経由で実行されます。
  • execute() - performs a non-query SQL statement, such as INSERT, UPDATE and DELETE. If successful, it returns the number of rows that are affected by the execution.
  • query() -performs an SQL statement that returns rows of data, such as SELECT. If successful, it returns a TDbDataReader instance from which one can fetch the resulting rows of data.
  • execute() -INSERT、UPDATE、およびDELETEなどの非クエリーSQLステートメントを実行します。成功しているならば、それは、実行によって影響される列の数を戻します。
  • query() - SELECTなどのデータの列を戻すSQLステートメントを実行します。成功した場合は、データの結果として生じている列を取り出すことができるTDbDataReaderインスタンスを返します。
$affectedRowCount=$command->execute();  // execute the non-query SQL
$dataReader=$command->query();          // execute a query SQL
$row=$command->queryRow();              // execute a query SQL and return the first row of result
$value=$command->queryScalar();         // execute a query SQL and return the first column value
In case an error occurs during the execution of SQL statements, a TDbException will be raised. エラーがSQLステートメントの実行の間に生じるエラーにおいて、TDbExceptionが発生します。

クエリー結果の取り出し

After TDbCommand.query() generates the TDbDataReader instance, one can retrieve rows of resulting data by calling TDbDataReader.read() repeatedly. One can also use TDbDataReader in PHP's foreach language construct to retrieve row by row. TDbCommand.query()が、TDbDataReaderインスタンスを発生させた後に、TDbDataReader.read()を繰り返し呼び出すことによって、結果として生じているデータの通りを取り出すことができます。PHPのforeach構文中で、列毎にTDbDataReaderを使いこともできます。
// calling read() repeatedly until it returns false
while(($row=$dataReader->read())!==false) { ... }
// using foreach to traverse through every row of data
foreach($dataReader as $row) { ... }
// retrieving all rows at once in a single array
$rows=$dataReader->readAll();

トランザクションの使用方法

When an application executes a few queries, each reading and/or writing information in the database, it is important to be sure that the database is not left with only some of the queries carried out. A transaction, represented as a TDbTransaction instance in PRADO, may be initiated in this case; アプリケーションがデータベースにおいて幾つかのクエリー、各々の表示、および/または情報の書き込みを実行する時に、データベースがクエリーのいくつかだけを残されないことを確認することは重要です。PRADOの中のTDbTransactionインスタンスとして見せられたトランザクションはこの場合に開始することができます。
  • Begin the transaction.
  • Execute queries one by one. Any updates to the database are not visible to the outside world.
  • Commit the transaction. Updates become visible if the transaction is successful.
  • If one of the queries fails, the entire transaction is rolled back.
  • トランザクションを開始してください。
  • 1つずつクエリーを実行してください。データベースへのどのようなアップデートも外の世界に見えません。
  • トランザクションを委任してください。 トランザクションが成功しているならば、アップデートは見えます。
  • クエリーの1つが故障するならば、トランザクション全体が巻き戻されます。
    $transaction=$connection->beginTransaction();
    try
    {
       $connection->createCommand($sql1)->execute();
       $connection->createCommand($sql2)->execute();
       //.... other SQL executions
       $transaction->commit();
    }
    catch(Exception $e) // an exception is raised if a query fails will be raised
    {
       $transaction->rollBack();
    }

パラメーターバインド

To avoid SQL injection attacks and to improve performance of executing repeatedly used SQL statements, one can "prepare" an SQL statement with optional parameter placeholders that are to be replaced with the actual parameters during the parameter binding process. SQL注射(インジェクション)攻撃を避けるためと繰り返し使われたSQLステートメントを実行する性能を改善するために、パラメータバインドプロセスの間に実引数と取り替えられることになっているオプションのパラメータプレイスホルダーとSQLステートメントを「準備する」ことができます。
The parameter placeholders can be either named (represented as unique tokens) or unnamed (represented as question marks). Call TDbCommand.bindParameter() or TDbCommand.bindValue() to replace these placeholders with the actual parameters. The parameters do not need to be quoted: the underlying database driver does it for you. Parameter binding must be done before the SQL statement is executed. パラメータプレースホールダーは、名付けられ(ユニークなトークンとして見せられます)ても、名付けられなくても(疑問符として見せられます)よいです。これらのプレースホールダーを実引数と取り替えるために、TDbCommand.bindParameter()またはTDbCommand.bindValue()を呼び出してください。パラメータは、引用される必要がありません:潜在的なデータベースドライバーはあなたのためにそれをします。SQLステートメントが実行される前に、パラメータバインディングはされなければなりません。
// an SQL with two placeholders ":username" and ":email"
$sql="INSERT INTO users(username, email) VALUES(:username,:email)";
$command=$connection->createCommand($sql);
// replace the placeholder ":username" with the actual username value
$command->bindParameter(":username",$username,PDO::PARAM_STR);
// replace the placeholder ":email" with the actual email value
$command->bindParameter(":email",$email,PDO::PARAM_STR);
$command->execute();
// insert another row with a new set of parameters
$command->bindParameter(":username",$username2,PDO::PARAM_STR);
$command->bindParameter(":email",$email2,PDO::PARAM_STR);
$command->execute();
The methods bindParameter() and bindValue() are very similar. The only difference is that the former binds a parameter with a PHP variable reference while the latter with a value. For parameters that represent large block of data memory, the former is preferred for performance consideration. メソッドbindParameter()とbindValue()は非常に類似しています。唯一の違いは、後者が値を持っている一方、前者がPHP変数参照によってパラメータをバインドしていることです。データメモリーの大きなブロックを表しているパラメータのために、パフォーマンスに考慮するなら前者が望ましいでしょう。 For more details about binding parameters, see the relevant PHP documentation. パラメーターバインディングについては、PHPドキュメントをご覧ください。

項目バインド

When fetching query results, one can also bind columns with PHP variables so that they are automatically populated with the latest data each time a row is fetched. クエリーの結果を取り出す際には、PHP変数によって、列が取り出されるたびに最新のデータが自動的に存在するように、項目バインドすることもできます。
$sql="SELECT username, email FROM users";
$dataReader=$connection->createCommand($sql)->query();
// bind the 1st column (username) with the $username variable
$dataReader->bindColumn(1,$username);
// bind the 2nd column (email) with the $email variable
$dataReader->bindColumn(2,$email);
while($dataReader->read()!==false)
{
 // $username and $email contain the username and email in the current row
}