Возможно мысль сформулирована не очень четко, постараюсь объяснить по подробнее.
Сейчас у меня есть некий класс(описан ниже) и класс базы данных, заточенный под mysqli, функции обернуты посредством ооп и абстрагированы названия. Суть заключается в следующем:
В классе Database_object есть три метода: find_by_sql(), find_by_id, find_all(); Два последующий построены на предыдущем. И в данный момент когда мне нужно инстанцировать экземпляр класса, который отнаследован от Database_object. Я это делаю при помощи этих 3 методов.
Например Products::find_all() - вернет объектами все записи из таблицы products, и как не сложно догадаться, 2 остальных работают подобным образом. Так вот, хочу переписать их с использованием PDO. Но прежде, чем это делать Интересует, нужно ли вообще это делать. Ибо в PDO есть метод fetch, который в купе с константой fetch_obj возвращает экземпляр std класса, а если пошаманить, то и экземпляр вызываемого класса, но он возвращает только один объект, как find_by_id(); Возможно есть вариант, который сможет вернуть все объекты сразу, как это делает find_all();
<?php
namespace core;
abstract class Database_object{
protected static $db_fields;
protected static function table_fields(){
global $db;
$result = $db->query("SHOW COLUMNS FROM ".static::$table_name);
while ($row = $db->fetch_assoc($result)){static::$db_fields[]=$row['Field'];}
}
public static function find_by_sql($sql){
global $db;
static::$db_fields = static::table_fields();
$result = $db->query($sql);
$object_array = [];
while ($row = $db->fetch_assoc($result)){
$object_array[] = static::instantiate($row);
}
return !empty($object_array) ? $object_array : false;
}
public static function count_all(){
global $db;
$result = $db->query("SELECT COUNT(*) FROM ".static::$table_name);
$row = $db->fetch_assoc($result);
return array_shift($row);
}
public static function find_by_sql_shift($sql=""){
$result_array = static::find_by_sql($sql);
return !empty($result_array) ? array_shift($result_array) : false;
}
public static function find_by_id($id=0){
$result_array = static::find_by_sql("SELECT * FROM ".static::$table_name." WHERE ".static::$table_name."_id = {$id} LIMIT 1 ");
return !empty($result_array) ? array_shift($result_array) : false;
}
public static function find_all(){
return static::find_by_sql("SELECT * FROM ".static::$table_name);
}
private static function instantiate($record){
$class_name = get_called_class();
$object = new $class_name;
foreach($record as $attribute=>$value){
if($object->has_attribute($attribute)){
$object->$attribute = $value;}
}
return $object;
}
private function has_attribute($attribute) {
return array_key_exists($attribute, $this->sanitized_attributes());
}
protected function attributes() {
$attributes = [];
foreach(static::$db_fields as $field) {
if(property_exists($this, $field)) {
$attributes[$field] = $this->$field;
}
}
return $attributes;
}
protected function sanitized_attributes() {
global $db;
$clean_attributes = [];
foreach($this->attributes() as $key => $value){
$clean_attributes[$key] = $db->escape($value);
}
return $clean_attributes;
}
public function save() {
return isset($this->id) ? $this->update() : $this->create();
}
public function create() {
global $db;
$attributes = $this->sanitized_attributes();
$sql = "INSERT INTO ".static::$table_name." (";
$sql .= join(", ", array_keys($attributes));
$sql .= ") VALUES ('";
$sql .= join("', '", array_values($attributes));
$sql .= "')";
if($db->query($sql)) {
$this->id = $db->insert_id();
return true;
} else {
return false;
}
}
public function update() {
global $db;
$attributes = $this->sanitized_attributes();
$attribute_pairs = array();
foreach($attributes as $key => $value) {
$attribute_pairs[] = "{$key}='{$value}'";
}
$sql = "UPDATE ".static::$table_name." SET ";
$sql .= join(", ", $attribute_pairs);
$sql .= " WHERE id=". $db->escape_value($this->id);
$db->query($sql);
return ($db->affected_rows() == 1) ? true : false;
}
public function delete() {
global $db;
$sql = "DELETE FROM ".static::$table_name;
$sql .= " WHERE ".static::$table_name."_id=". $db->escape_value($this->id);
$sql .= " LIMIT 1";
$db->query($sql);
return ($db->affected_rows() == 1) ? true : false;
}
}
?>