[s2container-php5:84] 【質問】s2dao.php5に関して2点(PRADO連携・update)

Yoshinari Ueyama [E-MAIL ADDRESS DELETED]
2007年 3月 12日 (月) 23:08:08 JST


植山です。
週末にPHPでのプログラミングを楽しんだのですが、その際に発生したことに
関して2点ほど質問があります。いろいろとご意見をお聞かせください。

1.Mysqlでのupdate処理

今までSQLITEのみで作業をしていたのは片手落ち、MysqlでのDB操作も試さねば・・・と思い、
MYSQLを用いたS2Daoプログラミングを行っていくと、下記のようなエラーが発生しました。

S2Dao_NotSingleRowUpdatedRuntimeException
Description
Target for update must be single row(actual:0).(ProductEntity)

データの編集画面において、データを変更せずにdaoのupdate($entity)メソッドを実行した際に
発生することがわかり、 おそらく下記の挙動が原因だと推測しています。

-------------------------------------------------------------------------------------------------------------------------------
http://dev.mysql.com/doc/refman/4.1/ja/update.html
カラムの値がそのカラムの現在の値に設定される場合、MySQL はそれが現在の値であることを認識し、
更新処理を行いません。
-------------------------------------------------------------------------------------------------------------------------------

これは、本来どのように対処すべきなのでしょうか?
1)画面入力値チェックの一環としてデータが変更されていないことを確認し、
変更されていなければupdate処理を実行しない。
2)エラーが発生しないようにS2Daoの修正を行う。

2)S2Dao_MySQLDBMetaDataクラスについて

S2Base.PHP5のPRADO pluginとS2Dao.PHP5を用いたプログラムを実行したところ、
下記のようなエラーが発生しました。

S2Dao_SQLRuntimeException

Description
SQLException occured, because [Warning]
PradoBase::include_once(S2Dao_MySQLDBMetaData.php)
[<a href='function.PradoBase-include-once'>function.PradoBase-include-once
</a>]:
failed to open stream: No such file or directory
(@line 98 in file
/private/var/www/public_html/prado/framework/PradoBase.php).

これは、S2Dao_DBMetaDataFactoryの下記の処理実行時に
class S2Dao_DBMetaDataFactory {

    const DBMetaData_Suffix = 'DBMetaData';

    public static function create(PDO $db, S2Dao_Dbms $dbms){
        $dbmd = get_class($dbms) . self::DBMetaData_Suffix;
        if(class_exists($dbmd)){
            return new $dbmd($db, $dbms);
        }
        return new S2Dao_StandardDBMetaData($db, $dbms);
    }
}

S2Dao_MySQLDBMetaDataクラスをロードする必要が出てきて、

PradoBaseクラスの下記メソッドが実行された際に
    public static function autoload($className)
    {
        include_once($className.self::CLASS_FILE_EXT);
        if(!class_exists($className,false) &&
!interface_exists($className,false))
            self::fatalError("Class file for '$className' cannot be
found.");
    }

S2Dao_MySQLDBMetaData.phpが存在していないために発生したと推測しています。
(あまり深くソースを追ってませんが・・)

今は、S2Dao_MySQLDBMetaDataを継承しただけのS2Dao_MySQLDBMetaDataクラスが定義された
S2Dao_MySQLDBMetaData.class.phpを作成し、エラーが発生しないようにしましたが、本来はどのように
対処すべきでしょうか?

以上です。


-- 
------------------------------------------------------------------
  植山 能成@福岡
mailto: [E-MAIL ADDRESS DELETED]
------------------------------------------------------------------
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: http://ml.seasar.org/archives/s2container-php5/attachments/20070312/8cb22efa/attachment.html 


S2Container-PHP5 メーリングリストの案内