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

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

Ответ 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()

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

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

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