3

次のようなモデルオブジェクトを作成しています。$object1= new Object1(); データベースにはobject1sという名前のテーブルがあります。Object1クラスは、DataMapperを拡張する空のクラスです。それは問題なく動作します。データを保存し、データベースからデータを取得することができます(別のデータベースクライアントを使用してデータを表示できます)。

別のオブジェクト(および別のテーブル)で同じことを試みました。たとえば、$ object2 = new Object2(); 今回は、次のエラーメッセージが表示されます。

致命的なエラー:6049行目の/Applications/XAMPP/xamppfiles/htdocs/c/application/libraries/Datamapper.phpの非オブジェクトでメンバー関数line()を呼び出す

6049行目は次のようになります。

$ this-> lang-> line($ key);を返します。

Object1をインスタンス化したとき、この時点で$ this-> langはDM_Langのインスタンスに設定されていましたが、2番目のオブジェクトをインスタンス化したときは$this->langは"en"に設定されています。2つの違いは、名前とデータベーステーブルだけです。

これを修正するにはどうすればよいですか?なぜ違うのですか?$ this-> langはどこに設定されていますか(私はすでにデバッガーをステップスルーしていて、それを見つけることができません)?

データベースはMySQLです。私はこれをMacOSXLionでの開発目的で実行しています。WebサーバーはApacheです。DataMapperORMv1.8.2を使用しています。


問題の正確なコードを要求するコメントがありました。これは私がテストした完全な正確なコードです(各ファイルからコピーして貼り付けました)。

Object1はMovie、models/movie.phpと呼ばれます。

<?php

class Movie extends DataMapper {

}

オブジェクト2はImage、models/image.phpと呼ばれます。

<?php

class Image extends DataMapper {

}

コントローラは次のようになります、controllers / test.php:

<?php

class Test extends CI_Controller {

    public function newdata()
    {
        // The following line runs as expected
        $movie = new Movie();
        // The following line fails with the Fatal error mentioned above
        $image = new Image();

    }

}

DataMapperv1.8.2に付属のインストール手順に従いました。私のindex.phpファイルには、CodeIgniterブートストラップファイルをロードする前に次のものが含まれています。

/* --------------------------------------------------------------------
 * LOAD THE DATAMAPPER BOOTSTRAP FILE
 * --------------------------------------------------------------------
 */
        require_once APPPATH.'third_party/datamapper/bootstrap.php';

これは、Movieオブジェクトで非常にスムーズに機能します。別のSQLクエリツールを使用して、データを書き込み、そこにあることを確認できます。

「$movie= ...」の行がコメント化されている場合、「$ image=...」の行はエラーなしで実行されることに気づきました。ただし、アプリが正しく機能するには、両方が必要です。

CI_VERSION=2.1.0を使用しています。

ご協力ありがとうございました。

4

1 に答える 1

2

データベーススキーマは、CodeIgniterに切り替える前に使用されていました。最初のテーブルには名前の競合がありました(フィールド名に「lang」を使用していました)。2番目のテーブルには競合がなく、問題のあるモデルオブジェクトの後に続く次のDataMapperサブクラスのインスタンス化であるという理由だけで失敗していました。私の注意は失敗していたテーブル/モデルにありましたが、実際には成功したものが問題を抱えていました。

修正は、失敗しているものだけでなく、すべてのモデルオブジェクトの競合をチェックすることでした。

于 2012-05-15T22:11:10.327 に答える