我收到以下错误消息:
警告: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
答案 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
类的每个实例化中点击数据库(您的用户可能会使用您的应用程序入睡)。