alestro
@alestro

Возможно ли инстанцирование множества объектов через PDO::fetch_obj?

Возможно мысль сформулирована не очень четко, постараюсь объяснить по подробнее.
Сейчас у меня есть некий класс(описан ниже) и класс базы данных, заточенный под 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;
	}

}

?>
  • Вопрос задан
  • 231 просмотр
Пригласить эксперта
Ответы на вопрос 1
mahoho
@mahoho
Full stack certified PHP developer.
У объект класса PDO можно с помощью методаsetAttribute() установить тип фетча по умолчанию:
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);

и после получать весь результат выборки следующим образом:
$stmt->fetchAll();
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы