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