-2

我收到以下错误消息:

警告:PDOStatement::execute(): SQLSTATE[42000]: 语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 27 行的 /home/u522148874/public_html/includes/database-objects.php 中的第 1 行附近使用正确的语法

警告:PDOStatement::execute(): SQLSTATE[42000]: 语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 27 行的 /home/u522148874/public_html/includes/database-objects.php 中的第 1 行附近使用正确的语法

样品 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是对当前类的引用,这意味着instantiate实现-方法的类(DatabaseObjects)而不是调用它的类。

因此,您不会创建已定义News的新对象,而是创建未定义的对象。table_nameDatabaseObjectstable_name

您可以通过使用“后期静态绑定”版本创建新实例来解决此问题:

$object = new static;

这样,该方法就会创建新News对象。您可能还希望将DatabaseObjects类标记为abstract,因此不会发生意外实例化。

另外,您可能希望全局缓存该get_dbFields方法 - 否则您会为类的每个实例化访问数据库News(您的用户可能会使用您的应用程序睡着了)。

于 2013-06-26T05:33:26.067 回答