Возможно ли инстанцирование множества объектов через 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();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;
}
}
?>

21 Авг 2019 в 07:06
267 +1
0
Ответы
1

Да, возможно инстанцирование множества объектов через PDO::fetch_obj. Однако, для этого нужно немного модифицировать ваш класс Database_object и методы для работы с PDO.

Вместо использования методов find_by_sql(), find_by_id() и find_all(), вы можете создать новый метод, который будет использовать PDO и fetch_obj для получения списка объектов:

public static function find_all_pdo(){
global $pdo;
$stmt = $pdo->prepare("SELECT * FROM ".static::$table_name);
$stmt->execute();
$object_array = [];
while ($row = $stmt->fetch(PDO::FETCH_OBJ)) {
$object_array[] = static::instantiate((array) $row);
}
return !empty($object_array) ? $object_array : false;
}

Теперь вы можете использовать этот метод для получения всех объектов из таблицы с помощью PDO:

$products = Products::find_all_pdo();

Этот подход позволит вам использовать PDO и fetch_obj для инстанцирования множества объектов вашего класса. Не забудьте настроить подключение к базе данных через PDO в вашем классе Database_object.

20 Апр в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 548 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир