Вопрос

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

Это было полезно?

Решение

С точки зрения производительности не имеет значения, что вы используете.Разница в том, что mysql_fetch_object возвращает 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 имеет некоторые недостатки, особенно если вы основываете на нем уровень базы данных.

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

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

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

  • Если вы не укажете имя класса, вы получите 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()

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top