Используется PHP/MySQL в течение некоторого времени, и мне интересно, есть ли какие-либо конкретные преимущества (производительность или нет) для использования mysql_fetch_object()
vs mysql_fetch_assoc()
/mysql_fetch_array()
.
Mysql приводит к PHP-массивам или объектам?
Ответ 1
Эффективность - это не имеет значения, что вы используете. Разница в том, что 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] ;
}
Ответ 2
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){...}
Хотя многие поклонники ООП (и я - вентилятор ООП), как идея превратить все в объект, я чувствую, что ассоциативный массив является лучшей моделью строки из базы данных, чем объект, поскольку, на мой взгляд, object - это набор свойств с методами, которые действуют на них, тогда как строка является просто данными и должна рассматриваться как таковая без дальнейшего усложнения.
Ответ 3
Что-то, о чем нужно помнить: массивы могут быть легко добавлены в кеш памяти (eaccelerator, XCache,..), в то время как объекты не могут (они должны быть сериализованы при хранении и неэтериализации при каждом извлечении!).
Вы можете переключиться на использование массивов вместо объектов, если хотите добавить поддержку кеша памяти, но к тому времени вам, возможно, придется изменить много кода уже, в котором используются ранее используемые значения возвращаемого типа объекта.
Ответ 4
Получение массива с помощью mysql_fetch_array()
позволяет выполнить цикл через набор результатов через цикл foreach или цикл for. mysql_fetch_object()
не может быть пройден циклом for.
Не уверен, что это даже имеет значение, просто подумал, что я упоминаю об этом.
Ответ 5
Кроме того, если вы в конечном итоге захотите применить Memcaching к вашим результатам MySQL, вы можете захотеть выбрать массивы. Кажется более безопасным хранить типы массивов, а не результаты типа объекта.
Ответ 6
while ($Row = mysql_fetch_object($rs)) {
// ...do stuff...
}
... как я всегда это делал. Я предпочитаю использовать объекты для коллекций данных вместо массивов, поскольку он немного упорядочивает данные, и я знаю, что я гораздо менее склонна пытаться добавить произвольные свойства к объекту, чем пытаться добавить индекс к массиву (в течение первых нескольких лет я использовал PHP, я думал, что вы не можете просто назначать произвольные свойства объекту, поэтому он не должен этого делать).
Ответ 7
Я думаю, что разница между всеми этими функциями незначительна, особенно по сравнению с читабельностью кода.
Если вас беспокоит такая оптимизация, используйте mysql_fetch_row()
. Это самый быстрый, поскольку он не использует ассоциативные массивы (например, $row [2]), но проще всего сломать его код.
Ответ 8
Скоростной, mysql_fetch_object()
идентичен mysql_fetch_array()
и почти так же быстро, как mysql_fetch_row()
.
Кроме того, при mysql_fetch_object()
вы сможете получить доступ к данным поля только с соответствующими именами полей.
Ответ 9
Я проголосовал против mysql_fetch_array()
Поскольку вы возвращаете как числовые индексированные столбцы, так и имена столбцов, это создает массив, который в два раза больше. Это нормально, если вам не нужно отлаживать код и просматривать его содержимое. Но для остальных из нас становится сложнее отлаживать, так как вам приходится пробираться в два раза больше данных в странном формате.
Я иногда запускаю проект, который использует эту функцию, а затем, когда я отлаживаю, я думаю, что что-то пошло ужасно неправильно, поскольку у меня есть числовые столбцы, смешанные с моими данными.
Итак, во имя здравомыслия, пожалуйста, не используйте эту функцию, это затрудняет обслуживание кода