循环后无法读取static :: $ table_name

时间:2013-06-26 04:46:18

标签: php mysql pdo

我收到以下错误消息:

  

警告: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

1 个答案:

答案 0 :(得分:0)

问题出在方法DatabaseObjects::instantiate中。第一行说

$object = new self;

现在,self是对当前类的引用,这意味着实现instantiate - 方法的类(DatabaseObjects)而不是被称为它的类。

因此,您不会创建定义News的新table_name个对象,但定义DatabaseObjects的{​​{1}}个对象。

您可以使用“late static binding”-version:

创建新实例来解决此问题
table_name

这样,该方法可以创建新的$object = new static; 个对象。您可能还希望将News类标记为DatabaseObjects,因此不会发生意外实例化。

另外,您可能希望全局缓存abstract方法 - 否则您会在get_dbFields类的每个实例化中点击数据库(您的用户可能会使用您的应用程序入睡)。