top / index / prev / next / target / source
日記形式でつづる いがぴょんコラム ウェブページです。
blanco Framework は SQL定義書からPHPソースコードを自動生成するツールである blancoDbPhpの公開ベータ版をリリースしました。
blanco Framework は SQL定義書からPHPソースコードを自動生成するツールである blancoDbPhpの公開ベータ版をリリースしました。
blancoDbPhpは blancoDbのPHP版です。
データベース入出力に PDO (PHP Data Object) を利用するソースコードを自動生成することができます。
SQL定義書およびデータベーススキーマを入力として、PHPデータベース入出力ソースコードを自動生成できます。 ソースコード自動生成アプローチによって、SQLインジェクションなどのセキュリティリスクのほとんどを撲滅することができます。
現在 PostgreSQLでのみ動作確認が実施されています。 PDOベースなので 他のリレーショナルデータベースでも動作する可能性はあります。 →他のリレーショナルデータベースでの動作確認情報をお寄せいただくことを期待します。PostgreSQL上での動作確認情報も歓迎します。
現時点では 正常系のみ実装されています。 blancoDbとしては 一意制約違反などの異常系を blanco特有の例外へと詰め替えるのが流儀なのですが、現時点では PDOが発生させた PDOException例外が そのままスローされるようになっています。
データベース入出力は文字列および数値のみに対応しています。 日付型などは全く試験していません。(そしておそらく 適切には動作しないと思われます)
blancoDbPhpの開発にあたって ご協力いただいた皆様に、大変感謝しています。ありがとうございます。引き続き そしてこれまで以上に みなさまからのフィードバックが blancoDbPhpの発展に必要です。フィードバックを お待ちしております。
blancoDbPhpプラグインインストールに際して
blancoDb系のEclipseプラグインのインストールは、他の blanco Frameworkプロダクト群のインストールに比べて少し手間がかかります。
blancoDbPhpプラグインは 解凍して Eclipseプラグインフォルダに展開します。
JDBCドライバを 解凍後の blancoDbPhpプラグインの libフォルダに格納します。
必要に応じて METAFILE.MFファイルを編集する必要があります。
詳しい情報が載ったチュートリアルを作成する計画はありますが、現時点で PHP版のチュートリアルはありません。PHP版チュートリアルが提供されるまでは、blancoDb チュートリアルなどを参考に 頑張ってインストールしてください。
自動生成されるソースコードの例
blancoDbPhpを使うと 下記のようなソースコードを自動生成することができます。これらは データベーススキーマから自動生成されたものです。(Simpleから始まるものは、SQL定義書の記入を伴わずに自動生成されたソースコードです) 検索型の例
<?php
/*
* This code is generated by blanco Framework.
*/
/*. DOC <@package myapp.db.query;>.*/
require_once('myapp/db/exception/NoRowFoundException.php');
require_once('myapp/db/exception/TooManyRowsFoundException.php');
require_once('myapp/db/row/SimpleAuthorSelectRow.php');
/*. require_module 'pdo'; .*/;
/*. require_module 'standard'; .*/;
/**
* SimpleAuthorSelectIteratorクラス
*
* QueryIteratorに属するクラスです。
* 検索型SQL文をラッピングして各種アクセサを提供します。
* シングル属性: 有効 (期待する処理件数は1件)
*/
class SimpleAuthorSelectIterator {
/**
* このクラスが内部的に利用するデータベース接続オブジェクト。
*
*
* データベース接続オブジェクトはコンストラクタの引数として外部から与えられます。
*/
protected /*.PDO.*/ $fConnection;
/**
* このクラスが内部的に利用するステートメントオブジェクト。
*
*
* このオブジェクトは内部的に利用されます。
*/
protected /*.PDOStatement.*/ $fStatement;
/**
* 現在フェッチしている行の内容。
*/
protected /*.array.*/ $fCurrentRow;
/**
* SimpleAuthorSelectIteratorクラスのコンストラクタです。
*
* ※注意:クラスを利用後、最後に必ずclose()メソッドを呼び出す必要があります。
*
* @param PDO $connection データベース接続
*/
public /*.void.*/ function __construct(/*.PDO.*/ $connection) {
/* パラメータの数、型チェックを行います。 */
if (func_num_args() !== 1) {
throw new Exception('[ArgumentException]: SimpleAuthorSelectIterator.SimpleAuthorSelectIterator のパラメータは[1]個である必要があります。しかし実際には[' . func_num_args() . ']個のパラメータを伴って呼び出されました。');
}
if ($connection instanceof pdo.PDO === FALSE) {
throw new Exception('[ArgumentException]: SimpleAuthorSelectIterator.SimpleAuthorSelectIterator の1番目のパラメータは[pdo.PDO]型でなくてはなりません。しかし実際には[' . get_class($connection) . ']型が与えられました。');
}
$this->fConnection = $connection;
}
/**
* クエリの取得メソッド
*
* 実際に実行するSQL文を戻します。
*
* @return string 実際に実行されるSQL文
*/
public /*.string.*/ function getQuery() {
/* パラメータの数、型チェックを行います。 */
if (func_num_args() !== 0) {
throw new Exception('[ArgumentException]: SimpleAuthorSelectIterator.getQuery のパラメータは[0]個である必要があります。しかし実際には[' . func_num_args() . ']個のパラメータを伴って呼び出されました。');
}
$buf = 'SELECT ';
$buf = $buf . ' author_code ';
$buf = $buf . ' ,author_name ';
$buf = $buf . ' ,author_name_kana ';
$buf = $buf . ' ,date_of_birth ';
$buf = $buf . ' ,gender_code ';
$buf = $buf . ' FROM ';
$buf = $buf . ' author ';
$buf = $buf . ' WHERE ';
$buf = $buf . ' author_code = :inParamAuthorCode';
return $buf;
}
/**
* 利用されていたデータベースリソースを開放します。
*
* クラスの利用が終わった際に必ずこのメソッドを呼び出してください。
*/
public /*.void.*/ function close() {
/* パラメータの数、型チェックを行います。 */
if (func_num_args() !== 0) {
throw new Exception('[ArgumentException]: SimpleAuthorSelectIterator.close のパラメータは[0]個である必要があります。しかし実際には[' . func_num_args() . ']個のパラメータを伴って呼び出されました。');
}
$this->fCurrentRow = NULL;
if ($this->fStatement != NULL) {
$this->fStatement->closeCursor();
$this->fStatement = NULL;
}
}
/**
* クエリのプリコンパイルに相当します。
*
* 動的に内容が変化するようなSQLを実行する必要がある場合にのみ、こちらのメソッドを利用します。
* ※SQL文そのものをパラメータとして与えることができて自由度が高い一方、SQLインジェクションと呼ばれるセキュリティホールが発生する危険がある点に注意した上で利用してください。
* 内部的には SQL文をフィールド変数に記憶します。
*
* @param string $query 利用したいクエリ(SQL文)
*/
public /*.void.*/ function prepareStatementSql(/*.string.*/ $query) {
/* パラメータの数、型チェックを行います。 */
if (func_num_args() !== 1) {
throw new Exception('[ArgumentException]: SimpleAuthorSelectIterator.prepareStatementSql のパラメータは[1]個である必要があります。しかし実際には[' . func_num_args() . ']個のパラメータを伴って呼び出されました。');
}
if (gettype($query) !== 'string' && gettype($query) !== 'NULL') {
throw new Exception('[ArgumentException]: SimpleAuthorSelectIterator.prepareStatementSql の1番目のパラメータは[string]型でなくてはなりません。しかし実際には[' . gettype($query) . ']型が与えられました。');
}
$this->close();
$this->fStatement = $this->fConnection->prepare($query);
}
/**
* クエリのプリコンパイルを実施します。
*
* あらかじめ与えられていたクエリ(SQL文)を利用します。
*/
public /*.void.*/ function prepareStatement() {
/* パラメータの数、型チェックを行います。 */
if (func_num_args() !== 0) {
throw new Exception('[ArgumentException]: SimpleAuthorSelectIterator.prepareStatement のパラメータは[0]個である必要があります。しかし実際には[' . func_num_args() . ']個のパラメータを伴って呼び出されました。');
}
$this->close();
$this->prepareStatementSql($this->getQuery());
}
/**
* クエリに与える入力パラメータをセットします。
*
* @param integer $inParamAuthorCode 'inParamAuthorCode' SQL入力パラメータ。DB上の型は[INTEGER]
*/
public /*.void.*/ function setInputParameter(/*.int.*/ $inParamAuthorCode) {
/* パラメータの数、型チェックを行います。 */
if (func_num_args() !== 1) {
throw new Exception('[ArgumentException]: SimpleAuthorSelectIterator.setInputParameter のパラメータは[1]個である必要があります。しかし実際には[' . func_num_args() . ']個のパラメータを伴って呼び出されました。');
}
if (gettype($inParamAuthorCode) !== 'integer' && gettype($inParamAuthorCode) !== 'NULL') {
throw new Exception('[ArgumentException]: SimpleAuthorSelectIterator.setInputParameter の1番目のパラメータは[integer]型でなくてはなりません。しかし実際には[' . gettype($inParamAuthorCode) . ']型が与えられました。');
}
if ($this->fStatement == NULL) {
$this->prepareStatement();
}
// SQL入力パラメータ[inParamAuthorCode]を設定します。
$this->fStatement->bindParam(':inParamAuthorCode', $inParamAuthorCode, PDO::PARAM_INT);
}
/**
* 検索型クエリを実行します。
*/
public /*.void.*/ function executeQuery() {
/* パラメータの数、型チェックを行います。 */
if (func_num_args() !== 0) {
throw new Exception('[ArgumentException]: SimpleAuthorSelectIterator.executeQuery のパラメータは[0]個である必要があります。しかし実際には[' . func_num_args() . ']個のパラメータを伴って呼び出されました。');
}
if ($this->fStatement == NULL) {
$this->prepareStatement();
}
// TODO 例外処理が実装されていません。
$result = $this->fStatement->execute();
}
/**
* カーソルを現在の位置から1行次へ移動します。
*
*
* シングル属性が有効なのでスコープをprotectedとします。
*
* @return boolean 新しい現在の行が有効な場合はTRUE、それ以上の行がない場合はFALSE。
*/
protected /*.boolean.*/ function next() {
/* パラメータの数、型チェックを行います。 */
if (func_num_args() !== 0) {
throw new Exception('[ArgumentException]: SimpleAuthorSelectIterator.next のパラメータは[0]個である必要があります。しかし実際には[' . func_num_args() . ']個のパラメータを伴って呼び出されました。');
}
if ($this->fCurrentRow == NULL) {
$this->executeQuery();
}
$result = $this->fStatement->fetch();
if (($result !== FALSE)) {
$this->fCurrentRow = $result;
return TRUE;
}
return FALSE;
}
/**
* 現在の行のデータをオブジェクトとして取得します。
*
* シングル属性が有効なのでスコープをprotectedとします。
* このメソッドの代わりに GetSingleRowメソッドを利用してください。
*
* @return SimpleAuthorSelectRow 行オブジェクト
*/
protected /*.SimpleAuthorSelectRow.*/ function getRow() {
/* パラメータの数、型チェックを行います。 */
if (func_num_args() !== 0) {
throw new Exception('[ArgumentException]: SimpleAuthorSelectIterator.getRow のパラメータは[0]個である必要があります。しかし実際には[' . func_num_args() . ']個のパラメータを伴って呼び出されました。');
}
$result = new SimpleAuthorSelectRow();
$result->setAuthorCode($this->fCurrentRow[0]);
$result->setAuthorName($this->fCurrentRow[1]);
$result->setAuthorNameKana($this->fCurrentRow[2]);
$result->setDateOfBirth($this->fCurrentRow[3]);
$result->setGenderCode($this->fCurrentRow[4]);
return $result;
}
/**
* 現在の行のデータをオブジェクトとして取得します。
*
* このメソッドを利用する場合には、next()などのカーソルを操作するメソッドとは併用しないでください。
*
* single属性が有効
* 検索結果が1件以外の場合には、NotSingleRowExceptionクラスを
* 派生したクラスの例外が発生します。
*
* @return SimpleAuthorSelectRow 行オブジェクト
*/
public /*.SimpleAuthorSelectRow.*/ function getSingleRow() {
/* パラメータの数、型チェックを行います。 */
if (func_num_args() !== 0) {
throw new Exception('[ArgumentException]: SimpleAuthorSelectIterator.getSingleRow のパラメータは[0]個である必要があります。しかし実際には[' . func_num_args() . ']個のパラメータを伴って呼び出されました。');
}
if ($this->next() == FALSE) {
throw new NoRowFoundException("行が検索できませんでした。");
}
$result = $this->getRow();
if ($this->next()) {
throw new TooManyRowsFoundException("1件以上の行が検索されました。");
}
return $result;
}
/**
* ステートメント (PDOStatement) を取得します。
*
* このメソッドを呼び出すことは推奨されません。一般的に Statementを直接利用する必要はありません。
*
* @return PDOStatement Statementオブジェクト
*/
public /*.PDOStatement.*/ function getStatement() {
/* パラメータの数、型チェックを行います。 */
if (func_num_args() !== 0) {
throw new Exception('[ArgumentException]: SimpleAuthorSelectIterator.getStatement のパラメータは[0]個である必要があります。しかし実際には[' . func_num_args() . ']個のパラメータを伴って呼び出されました。');
}
return $this->fStatement;
}
}
?>
実行型の例
<?php
/*
* This code is generated by blanco Framework.
*/
/*. DOC <@package myapp.db.query;>.*/
require_once('myapp/db/exception/IntegrityConstraintException.php');
require_once('myapp/db/exception/NoRowModifiedException.php');
require_once('myapp/db/exception/TooManyRowsModifiedException.php');
/*. require_module 'pdo'; .*/;
/*. require_module 'standard'; .*/;
/**
* SimpleAuthorInsertInvokerクラス
*
* QueryInvokerに属するクラスです。
* 実行型SQL文をラッピングして各種アクセサを提供します。
* シングル属性: 有効 (期待する処理件数は1件)
*/
class SimpleAuthorInsertInvoker {
/**
* このクラスが内部的に利用するデータベース接続オブジェクト。
*
*
* データベース接続オブジェクトはコンストラクタの引数として外部から与えられます。
*/
protected /*.PDO.*/ $fConnection;
/**
* このクラスが内部的に利用するステートメントオブジェクト。
*
*
* このオブジェクトは内部的に利用されます。
*/
protected /*.PDOStatement.*/ $fStatement;
/**
* SimpleAuthorInsertInvokerクラスのコンストラクタです。
*
* ※注意:クラスを利用後、最後に必ずclose()メソッドを呼び出す必要があります。
*
* @param PDO $connection データベース接続
*/
public /*.void.*/ function __construct(/*.PDO.*/ $connection) {
/* パラメータの数、型チェックを行います。 */
if (func_num_args() !== 1) {
throw new Exception('[ArgumentException]: SimpleAuthorInsertInvoker.SimpleAuthorInsertInvoker のパラメータは[1]個である必要があります。しかし実際には[' . func_num_args() . ']個のパラメータを伴って呼び出されました。');
}
if ($connection instanceof pdo.PDO === FALSE) {
throw new Exception('[ArgumentException]: SimpleAuthorInsertInvoker.SimpleAuthorInsertInvoker の1番目のパラメータは[pdo.PDO]型でなくてはなりません。しかし実際には[' . get_class($connection) . ']型が与えられました。');
}
$this->fConnection = $connection;
}
/**
* クエリの取得メソッド
*
* 実際に実行するSQL文を戻します。
*
* @return string 実際に実行されるSQL文
*/
public /*.string.*/ function getQuery() {
/* パラメータの数、型チェックを行います。 */
if (func_num_args() !== 0) {
throw new Exception('[ArgumentException]: SimpleAuthorInsertInvoker.getQuery のパラメータは[0]個である必要があります。しかし実際には[' . func_num_args() . ']個のパラメータを伴って呼び出されました。');
}
$buf = 'INSERT ';
$buf = $buf . ' INTO ';
$buf = $buf . ' author ( ';
$buf = $buf . ' author_code ';
$buf = $buf . ' ,author_name ';
$buf = $buf . ' ,author_name_kana ';
$buf = $buf . ' ,date_of_birth ';
$buf = $buf . ' ,gender_code ';
$buf = $buf . ' ) ';
$buf = $buf . ' VALUES ( ';
$buf = $buf . ' :inParamAuthorCode ';
$buf = $buf . ' ,:inParamAuthorName ';
$buf = $buf . ' ,:inParamAuthorNameKana ';
$buf = $buf . ' ,:inParamDateOfBirth ';
$buf = $buf . ' ,:inParamGenderCode ';
$buf = $buf . ' )';
return $buf;
}
/**
* 利用されていたデータベースリソースを開放します。
*
* クラスの利用が終わった際に必ずこのメソッドを呼び出してください。
*/
public /*.void.*/ function close() {
/* パラメータの数、型チェックを行います。 */
if (func_num_args() !== 0) {
throw new Exception('[ArgumentException]: SimpleAuthorInsertInvoker.close のパラメータは[0]個である必要があります。しかし実際には[' . func_num_args() . ']個のパラメータを伴って呼び出されました。');
}
if ($this->fStatement != NULL) {
$this->fStatement->closeCursor();
$this->fStatement = NULL;
}
}
/**
* クエリのプリコンパイルに相当します。
*
* 動的に内容が変化するようなSQLを実行する必要がある場合にのみ、こちらのメソッドを利用します。
* ※SQL文そのものをパラメータとして与えることができて自由度が高い一方、SQLインジェクションと呼ばれるセキュリティホールが発生する危険がある点に注意した上で利用してください。
* 内部的には SQL文をフィールド変数に記憶します。
*
* @param string $query 利用したいクエリ(SQL文)
*/
public /*.void.*/ function prepareStatementSql(/*.string.*/ $query) {
/* パラメータの数、型チェックを行います。 */
if (func_num_args() !== 1) {
throw new Exception('[ArgumentException]: SimpleAuthorInsertInvoker.prepareStatementSql のパラメータは[1]個である必要があります。しかし実際には[' . func_num_args() . ']個のパラメータを伴って呼び出されました。');
}
if (gettype($query) !== 'string' && gettype($query) !== 'NULL') {
throw new Exception('[ArgumentException]: SimpleAuthorInsertInvoker.prepareStatementSql の1番目のパラメータは[string]型でなくてはなりません。しかし実際には[' . gettype($query) . ']型が与えられました。');
}
$this->close();
$this->fStatement = $this->fConnection->prepare($query);
}
/**
* クエリのプリコンパイルを実施します。
*
* あらかじめ与えられていたクエリ(SQL文)を利用します。
*/
public /*.void.*/ function prepareStatement() {
/* パラメータの数、型チェックを行います。 */
if (func_num_args() !== 0) {
throw new Exception('[ArgumentException]: SimpleAuthorInsertInvoker.prepareStatement のパラメータは[0]個である必要があります。しかし実際には[' . func_num_args() . ']個のパラメータを伴って呼び出されました。');
}
$this->close();
$this->prepareStatementSql($this->getQuery());
}
/**
* クエリに与える入力パラメータをセットします。
*
* @param integer $inParamAuthorCode 'inParamAuthorCode' SQL入力パラメータ。DB上の型は[INTEGER]
* @param string $inParamAuthorName 'inParamAuthorName' SQL入力パラメータ。DB上の型は[VARCHAR]
* @param string $inParamAuthorNameKana 'inParamAuthorNameKana' SQL入力パラメータ。DB上の型は[VARCHAR]
* @param string $inParamDateOfBirth 'inParamDateOfBirth' SQL入力パラメータ。DB上の型は[DATE]
* @param integer $inParamGenderCode 'inParamGenderCode' SQL入力パラメータ。DB上の型は[INTEGER]
*/
public /*.void.*/ function setInputParameter(/*.int.*/ $inParamAuthorCode, /*.string.*/ $inParamAuthorName, /*.string.*/ $inParamAuthorNameKana, /*.string.*/ $inParamDateOfBirth, /*.int.*/ $inParamGenderCode) {
/* パラメータの数、型チェックを行います。 */
if (func_num_args() !== 5) {
throw new Exception('[ArgumentException]: SimpleAuthorInsertInvoker.setInputParameter のパラメータは[5]個である必要があります。しかし実際には[' . func_num_args() . ']個のパラメータを伴って呼び出されました。');
}
if (gettype($inParamAuthorCode) !== 'integer' && gettype($inParamAuthorCode) !== 'NULL') {
throw new Exception('[ArgumentException]: SimpleAuthorInsertInvoker.setInputParameter の1番目のパラメータは[integer]型でなくてはなりません。しかし実際には[' . gettype($inParamAuthorCode) . ']型が与えられました。');
}
if (gettype($inParamAuthorName) !== 'string' && gettype($inParamAuthorName) !== 'NULL') {
throw new Exception('[ArgumentException]: SimpleAuthorInsertInvoker.setInputParameter の2番目のパラメータは[string]型でなくてはなりません。しかし実際には[' . gettype($inParamAuthorName) . ']型が与えられました。');
}
if (gettype($inParamAuthorNameKana) !== 'string' && gettype($inParamAuthorNameKana) !== 'NULL') {
throw new Exception('[ArgumentException]: SimpleAuthorInsertInvoker.setInputParameter の3番目のパラメータは[string]型でなくてはなりません。しかし実際には[' . gettype($inParamAuthorNameKana) . ']型が与えられました。');
}
if (gettype($inParamDateOfBirth) !== 'string' && gettype($inParamDateOfBirth) !== 'NULL') {
throw new Exception('[ArgumentException]: SimpleAuthorInsertInvoker.setInputParameter の4番目のパラメータは[string]型でなくてはなりません。しかし実際には[' . gettype($inParamDateOfBirth) . ']型が与えられました。');
}
if (gettype($inParamGenderCode) !== 'integer' && gettype($inParamGenderCode) !== 'NULL') {
throw new Exception('[ArgumentException]: SimpleAuthorInsertInvoker.setInputParameter の5番目のパラメータは[integer]型でなくてはなりません。しかし実際には[' . gettype($inParamGenderCode) . ']型が与えられました。');
}
if ($this->fStatement == NULL) {
$this->prepareStatement();
}
// SQL入力パラメータ[inParamAuthorCode]を設定します。
$this->fStatement->bindParam(':inParamAuthorCode', $inParamAuthorCode, PDO::PARAM_INT);
// SQL入力パラメータ[inParamAuthorName]を設定します。
$this->fStatement->bindParam(':inParamAuthorName', $inParamAuthorName, PDO::PARAM_STR);
// SQL入力パラメータ[inParamAuthorNameKana]を設定します。
$this->fStatement->bindParam(':inParamAuthorNameKana', $inParamAuthorNameKana, PDO::PARAM_STR);
// SQL入力パラメータ[inParamDateOfBirth]を設定します。
$this->fStatement->bindParam(':inParamDateOfBirth', $inParamDateOfBirth, PDO::PARAM_STR);
// SQL入力パラメータ[inParamGenderCode]を設定します。
$this->fStatement->bindParam(':inParamGenderCode', $inParamGenderCode, PDO::PARAM_INT);
}
/**
* 実行型クエリを実行します。
*
* データベースの制約違反が発生した場合には IntegrityConstraintException 例外が発生します。
*
* シングル属性が有効なのでスコープをprotectedとします。
* このメソッドの代わりに ExecuteSingleUpdateメソッドを利用してください。
*
* @return integer 処理された行数
*/
protected /*.int.*/ function executeUpdate() {
/* パラメータの数、型チェックを行います。 */
if (func_num_args() !== 0) {
throw new Exception('[ArgumentException]: SimpleAuthorInsertInvoker.executeUpdate のパラメータは[0]個である必要があります。しかし実際には[' . func_num_args() . ']個のパラメータを伴って呼び出されました。');
}
if ($this->fStatement == NULL) {
// PreparedStatementが未取得の状態なので、ExecuteNonQuery()実行に先立ちPrepareStatement()メソッドを呼び出して取得します。
$this->prepareStatement();
}
// TODO 例外処理が入っていません。
$result = $this->fStatement->execute();
return $this->fStatement->rowCount();
}
/**
* 実行型クエリを実行します。
*
* データベースの制約違反が発生した場合には IntegrityConstraintException 例外が発生します。
*
* single属性が有効
* 実行結果が1件以外の場合には、NotSingleRowExceptionクラスを
* 派生したクラスの例外が発生します。
*/
public /*.void.*/ function executeSingleUpdate() {
/* パラメータの数、型チェックを行います。 */
if (func_num_args() !== 0) {
throw new Exception('[ArgumentException]: SimpleAuthorInsertInvoker.executeSingleUpdate のパラメータは[0]個である必要があります。しかし実際には[' . func_num_args() . ']個のパラメータを伴って呼び出されました。');
}
$result = $this->executeUpdate();
if ($result == 0) {
throw new NoRowModifiedException("行が一件も変更されませんでした。");
} else if ($result > 1) {
$message = "一件を超える行が変更されてしまいました。影響のあった件数:" . $result;
throw new TooManyRowsModifiedException($message);
}
}
/**
* ステートメント (PDOStatement) を取得します。
*
* このメソッドを呼び出すことは推奨されません。一般的に Statementを直接利用する必要はありません。
*
* @return PDOStatement Statementオブジェクト
*/
public /*.PDOStatement.*/ function getStatement() {
/* パラメータの数、型チェックを行います。 */
if (func_num_args() !== 0) {
throw new Exception('[ArgumentException]: SimpleAuthorInsertInvoker.getStatement のパラメータは[0]個である必要があります。しかし実際には[' . func_num_args() . ']個のパラメータを伴って呼び出されました。');
}
return $this->fStatement;
}
}
?>