-2

次のエラー メッセージが表示されます。

警告: PDOStatement::execute(): SQLSTATE[42000]: 構文エラーまたはアクセス違反: 1064 SQL 構文にエラーがあります。/home/u522148874/public_html/includes/database-objects.php の 27 行目の 1 行目の近くで使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

警告: PDOStatement::execute(): SQLSTATE[42000]: 構文エラーまたはアクセス違反: 1064 SQL 構文にエラーがあります。/home/u522148874/public_html/includes/database-objects.php の 27 行目の 1 行目の近くで使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

サンプル1

サンプル 2

次のコードを使用する場合:

public function __construct(){
            global $MySQLDatabase;
            global $news;
           
            $this->dbh = $MySQLDatabase->open_connection();
           
            // Convert Table Fields in to Attributes
            static::$db_fields = $this->get_dbFields(static::$table_name);
            foreach(static::$db_fields as $field){
                    $this->$field = "";
            }
    }
   
    // Get Table Fields from the Database
    public function get_dbFields($table_name){
            $sql = 'DESCRIBE ' . $table_name ;
            $query = $this->dbh->prepare($sql);
            $query->execute();
            $result = $query->fetchAll(PDO::FETCH_OBJ);

            // Get the quantity of the Table Columns
            $count = count($result);
            $field = array();
           
            // Loop through each column to get the 'Field'
            // ($count - 1) -> $count is minus 1 because array count starts with zero
                    // Example : Table Have 8 Columns
                    //                       $count will read it as 1 - 8 while array ($result[i]) reads it as 0 - 7
            for($i = 0; $i <= ($count - 1); $i++){
                    $field[] = $result[$i]->Field;
            }
            return $field;
    }

上記のエラーが発生しているのに、上記の出力 (サンプル 1 とサンプル 2) を取得できる理由を誰かに説明してもらえますか?

ここに私の完全なコードがあります: http://pastebin.com/xypkzs30

4

1 に答える 1

0

問題はメソッドにありDatabaseObjects::instantiateます。最初の行は言う

$object = new self;

現在、は現在のクラスselfへの参照です。つまり、 -method が実装されているクラス ( ) であり、メソッドが呼び出されているクラスではありません。instantiateDatabaseObjects

したがって、が定義されている新しいNewsオブジェクトを作成するのではなく、定義されていないオブジェクトを作成します。table_nameDatabaseObjectstable_name

これは、「late static binding」バージョンを使用して新しいインスタンスを作成することで解決できます。

$object = new static;

このようにして、メソッドは新しいNewsオブジェクトを作成します。偶発的なインスタンス化が発生しないように、DatabaseObjectsクラスを としてマークすることもできます。abstract

さらに、メソッドをグローバルにキャッシュしたい場合があります。get_dbFieldsそうしないと、クラスのインスタンス化ごとに DB にヒットしNewsます (ユーザーがアプリを使用して眠りにつく可能性があります)。

于 2013-06-26T05:33:26.067 に答える