





Получение массива с помощью mysql_fetch_array() позволяет вам просмотреть результирующий набор с помощью цикла foreach или цикла for. Цикл for не может пройти через mysql_fetch_object().
Не уверен, что это вообще имеет значение, просто подумал, что упомяну об этом.
while ($ row = mysql_fetch_object ($ result)) работает. Его использование точно такое же, как и mysql_fetch_array (), за исключением того, что вы получаете доступ с помощью $ row-> field вместо $ row ['field'].
Оуэн, это именно то, что я сказал.
Мне лично более удобны ассоциативные массивы и foreach, но я попробую метод объекта и посмотрю, смогу ли я заставить его работать.
Бедный Стив просто облажался из-за того, что люди не читали то, что он написал правильно. Ненавижу, когда это происходит, но я понимаю, почему они читают именно так. Вы оставили заявление довольно неоднозначным.
+1, чтобы довести вас до 0. Но серьезно, ваш ответ легко неправильно понять.
Думаю, разница между всеми этими функциями несущественная, особенно по сравнению с читабельностью кода.
Если вас беспокоит такая оптимизация, используйте 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] ;
}
В основном это зависит от ваших предпочтений.
небольшая разница, _row возвращает 0,1 .. и _array возвращает 'userid', 'fullname', '0', '1'.
во втором аргументе mysql_fetch_array вы можете указать, хотите ли вы ассоциативный результат, числовой результат или оба (результат означает значение индекса массива) :)
на основе этой статьи spearheadsoftwares.com/tutorials/php-performance-benchmarkin g /… в БОЛЬШИХ запросах вы должны использовать _assoc () или _array ()
По скорости mysql_fetch_object() идентичен mysql_fetch_array() и почти так же быстр, как mysql_fetch_row().
Кроме того, с mysql_fetch_object() вы сможете получить доступ к данным поля только по соответствующим именам полей.
Я голосую против mysql_fetch_array()
Поскольку вы возвращаете столбцы с числовым индексом и имена столбцов, это создает массив вдвое большего размера. Это нормально, если вам не нужно отлаживать код и просматривать его содержимое. Но для остальных из нас становится труднее отлаживать, так как вам нужно пробираться через вдвое больше данных в странно выглядящем формате.
Иногда я сталкиваюсь с проектом, который использует эту функцию, а затем, когда я отлаживаю, я думаю, что что-то пошло не так, поскольку у меня есть числовые столбцы, смешанные с моими данными.
Так что во имя здравомыслия, пожалуйста, не используйте эту функцию, это затрудняет обслуживание кода.
mysql_fetch_array () возвращает массив как с числовыми, так и с ассоциативными индексами; Веселье для всей семьи.
аааааааааааааааааааа! Я думал о другой функции. Я исправил свой ответ
Следует иметь в виду: массивы можно легко добавить в кеш памяти (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 по причинам, которые вы сказали; Это больше похоже на данные как массив, чем как объект.
@ J.Money Но как насчет того, когда вы действительно переключаетесь на результаты базы данных, представляемые объектами? Как и в случае с активными шаблонами записи, я предпочитаю, если внешний интерфейс уже использует объектный интерфейс. $ user = User :: find (1), то во внешнем интерфейсе, если он уже реализован как $ user-> email, никаких изменений вносить не нужно. Это дает вам больше гибкости, позволяя вызывать методы из внешнего интерфейса по результатам. Хотя по-прежнему довольно тривиально заставить объекты реализовывать интерфейс ArrayAccess, чтобы $ user ['email'] делал с объектом то же самое, что и $ user-> email ..
Методы @Anther Magic упрощают реализацию активной записи с использованием массивов для хранения данных строки. Однако вы правы, поскольку PHP все больше приближается к ООП, реализация mysql_fetch_ * происходит за кулисами и, следовательно, тривиальна, независимо от того, используется ли тот или другой. Фактически, единственная причина, по которой я начал думать об этом, заключалась в том, что я переписываю чей-то процедурный код, чтобы он был более объектно-ориентированным, и он не использует уровень абстракции базы данных. Они используют все функции mysql_fetch_ * без какой-либо заметной закономерности.
@ bažmegakapa Этот ответ имеет для меня большой смысл, и я действительно думал о том, чтобы вернуться к mysql_fetch_assoc с mysql_fetch_object. Я считаю, что mysql_fetch_object может сбивать с толку, когда вы начинаете присоединяться к полям из других таблиц. Один вопрос, если можно. Обычно в моих объектных классах есть небольшие служебные функции. Например, full_name () вернет $ this-> first_name. ''. $ this-> last_name. Я теряю быстрый доступ к этим методам при переходе на массивы. Как вы справились с этой проблемой?
@Jonathan Я не писал этот ответ, просто отредактировал его. Это ответ darkpenguin, который кажется удаленным пользователем. (Я бы сказал, забудьте о старых вещах mysql_ и переключитесь на PDO)
Кроме того, если вы в конечном итоге захотите применить Memcaching к своим результатам MySQL, вы можете выбрать массивы. Кажется, безопаснее хранить типы массивов, а не результаты типов объектов.
свойства объекта могут быть повторены через foreach в php5 +