Mysql приводит к PHP - массивам или объектам?

Некоторое время я использую PHP / MySQL, и мне интересно, есть ли какие-либо особые преимущества (производительность или другие) у использования mysql_fetch_object() по сравнению с mysql_fetch_assoc() / mysql_fetch_array().

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
28
0
38 646
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Получение массива с помощью mysql_fetch_array() позволяет вам просмотреть результирующий набор с помощью цикла foreach или цикла for. Цикл for не может пройти через mysql_fetch_object().

Не уверен, что это вообще имеет значение, просто подумал, что упомяну об этом.

свойства объекта могут быть повторены через foreach в php5 +

Owen 24.09.2008 02:17

while ($ row = mysql_fetch_object ($ result)) работает. Его использование точно такое же, как и mysql_fetch_array (), за исключением того, что вы получаете доступ с помощью $ row-> field вместо $ row ['field'].

cubex 24.09.2008 02:19

Оуэн, это именно то, что я сказал.

Steve Paulo 24.09.2008 02:42

Мне лично более удобны ассоциативные массивы и foreach, но я попробую метод объекта и посмотрю, смогу ли я заставить его работать.

Nicholas Flynt 02.11.2008 00:16

Бедный Стив просто облажался из-за того, что люди не читали то, что он написал правильно. Ненавижу, когда это происходит, но я понимаю, почему они читают именно так. Вы оставили заявление довольно неоднозначным.

Mark Tomlin 06.04.2010 06:08

+1, чтобы довести вас до 0. Но серьезно, ваш ответ легко неправильно понять.

The Disintegrator 21.05.2010 09:45

Думаю, разница между всеми этими функциями несущественная, особенно по сравнению с читабельностью кода.

Если вас беспокоит такая оптимизация, используйте mysql_fetch_row(). Он самый быстрый, потому что не использует ассоциативные массивы (например, $ row [2]), но с его помощью проще всего сломать ваш код.

while ($Row = mysql_fetch_object($rs)) {
    // ...do stuff...
}

... как я всегда это делал. Я предпочитаю использовать объекты для коллекций данных вместо массивов, поскольку он немного лучше организует данные, и я знаю, что у меня гораздо меньше шансов попытаться добавить произвольные свойства к объекту, чем попытаться добавить индекс в массив (первые несколько лет я использовал PHP, я думал, что нельзя просто присвоить объекту произвольные свойства, поэтому он укоренился не делать этого).

Ответ принят как подходящий

С точки зрения производительности не имеет значения, что вы используете. Разница в том, что mysql_fetch_object возвращает объект:

while ($row = mysql_fetch_object($result)) {
    echo $row->user_id;
    echo $row->fullname;
}

mysql_fetch_assoc () возвращает ассоциативный массив:

while ($row = mysql_fetch_assoc($result)) {
    echo $row["userid"];
    echo $row["fullname"];
}

а mysql_fetch_array () возвращает массив:

while ($row = mysql_fetch_array($result)) {
    echo $row[0];
    echo $row[1] ;
}

В основном это зависит от ваших предпочтений.

davethegr8 24.09.2008 02:53

небольшая разница, _row возвращает 0,1 .. и _array возвращает 'userid', 'fullname', '0', '1'.

Shinhan 24.09.2008 12:49

во втором аргументе mysql_fetch_array вы можете указать, хотите ли вы ассоциативный результат, числовой результат или оба (результат означает значение индекса массива) :)

user798596 03.03.2012 03:13

на основе этой статьи spearheadsoftwares.com/tutorials/php-performance-benchmarkin‌ g /… в БОЛЬШИХ запросах вы должны использовать _assoc () или _array ()

Alex Angelico 18.07.2013 21:44

По скорости mysql_fetch_object() идентичен mysql_fetch_array() и почти так же быстр, как mysql_fetch_row().

Кроме того, с mysql_fetch_object() вы сможете получить доступ к данным поля только по соответствующим именам полей.

Я голосую против mysql_fetch_array()

Поскольку вы возвращаете столбцы с числовым индексом и имена столбцов, это создает массив вдвое большего размера. Это нормально, если вам не нужно отлаживать код и просматривать его содержимое. Но для остальных из нас становится труднее отлаживать, так как вам нужно пробираться через вдвое больше данных в странно выглядящем формате.

Иногда я сталкиваюсь с проектом, который использует эту функцию, а затем, когда я отлаживаю, я думаю, что что-то пошло не так, поскольку у меня есть числовые столбцы, смешанные с моими данными.

Так что во имя здравомыслия, пожалуйста, не используйте эту функцию, это затрудняет обслуживание кода.

mysql_fetch_array () возвращает массив как с числовыми, так и с ассоциативными индексами; Веселье для всей семьи.

hlpiii 11.10.2009 03:41

аааааааааааааааааааа! Я думал о другой функции. Я исправил свой ответ

SeanDowney 25.07.2012 21:20

Следует иметь в виду: массивы можно легко добавить в кеш памяти (eaccelerator, XCache, ..), а объекты - нет (они должны сериализоваться при сохранении и десериализоваться при каждом извлечении!).

Вы можете переключиться на использование массивов вместо объектов, если хотите добавить поддержку кеширования памяти, но к тому времени вам, возможно, придется уже изменить много кода, который использует ранее использованные возвращаемые значения типа объекта.

mysql_fetch_array делает ваш код трудным для чтения = кошмар обслуживания. Вы не можете сразу увидеть, с какими данными имеет дело ваш объект. Это немного быстрее, но если это важно для вас, вы обрабатываете так много данных, что PHP, вероятно, не лучший вариант.

mysql_fetch_object имеет некоторые недостатки, особенно если вы основываете на нем слой db.

  • Имена столбцов могут быть недопустимыми идентификаторами PHP, например tax-allowance или user.id, если драйвер базы данных дает вам имя столбца, указанное в запросе. Тогда вам нужно начать использовать {} повсюду.

  • Если вы хотите получить столбец на основе его имени, введенного в какую-либо переменную, вам также необходимо начать использовать свойства переменных $row->{$column_name}, а синтаксис массива $row[$column_name]

  • Конструкторы не вызываются, если вы могли бы ожидать, если вы укажете имя класса.

  • Если вы не укажете имя класса, вы получите stdClass, который в любом случае вряд ли лучше массива.

mysql_fetch_assoc - самый простой из трех для работы, и мне нравится различие, которое он дает в коде между объектами и строками результатов базы данных ...

$object->property=$row['column1'];
$object->property=$row[$column_name];
foreach($row as $column_name=>$column_value){...}

Хотя многим фанатам ООП (а я являюсь поклонником ООП) нравится идея превратить все в объект, я считаю, что ассоциативный массив - лучшая модель строки из базы данных, чем объект, поскольку, на мой взгляд, объект - это набор свойств с методами воздействия на них, тогда как строка - это просто данные, и ее следует рассматривать как таковую без каких-либо дополнительных сложностей.

+1 за лучший ответ по теме. Раньше я использовал assoc, затем я переключился на объекты (в попытке сделать все объекты), но снова переключился на assoc по причинам, которые вы сказали; Это больше похоже на данные как массив, чем как объект.

None 21.08.2012 22:35

@ J.Money Но как насчет того, когда вы действительно переключаетесь на результаты базы данных, представляемые объектами? Как и в случае с активными шаблонами записи, я предпочитаю, если внешний интерфейс уже использует объектный интерфейс. $ user = User :: find (1), то во внешнем интерфейсе, если он уже реализован как $ user-> email, никаких изменений вносить не нужно. Это дает вам больше гибкости, позволяя вызывать методы из внешнего интерфейса по результатам. Хотя по-прежнему довольно тривиально заставить объекты реализовывать интерфейс ArrayAccess, чтобы $ user ['email'] делал с объектом то же самое, что и $ user-> email ..

Anther 22.08.2012 21:53

Методы @Anther Magic упрощают реализацию активной записи с использованием массивов для хранения данных строки. Однако вы правы, поскольку PHP все больше приближается к ООП, реализация mysql_fetch_ * происходит за кулисами и, следовательно, тривиальна, независимо от того, используется ли тот или другой. Фактически, единственная причина, по которой я начал думать об этом, заключалась в том, что я переписываю чей-то процедурный код, чтобы он был более объектно-ориентированным, и он не использует уровень абстракции базы данных. Они используют все функции mysql_fetch_ * без какой-либо заметной закономерности.

None 22.08.2012 22:24

@ bažmegakapa Этот ответ имеет для меня большой смысл, и я действительно думал о том, чтобы вернуться к mysql_fetch_assoc с mysql_fetch_object. Я считаю, что mysql_fetch_object может сбивать с толку, когда вы начинаете присоединяться к полям из других таблиц. Один вопрос, если можно. Обычно в моих объектных классах есть небольшие служебные функции. Например, full_name () вернет $ this-> first_name. ''. $ this-> last_name. Я теряю быстрый доступ к этим методам при переходе на массивы. Как вы справились с этой проблемой?

Jonathan 03.01.2013 02:50

@Jonathan Я не писал этот ответ, просто отредактировал его. Это ответ darkpenguin, который кажется удаленным пользователем. (Я бы сказал, забудьте о старых вещах mysql_ и переключитесь на PDO)

kapa 03.01.2013 06:34

Кроме того, если вы в конечном итоге захотите применить Memcaching к своим результатам MySQL, вы можете выбрать массивы. Кажется, безопаснее хранить типы массивов, а не результаты типов объектов.

Другие вопросы по теме