Результаты Mysql в PHP - массивах или объектах?
Вопрос
Пользовался 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()
Поскольку вы возвращаете как численно проиндексированные столбцы, так и имена столбцов, это создает массив, который в два раза больше.Это нормально, если вам не нужно отлаживать свой код и просматривать его содержимое.Но для остальных из нас отладка становится сложнее, поскольку вам приходится просматривать в два раза больше данных в странном формате.
Иногда я сталкиваюсь с проектом, который использует эту функцию, и тогда, когда я отлаживаю, я думаю, что что-то пошло не так, поскольку у меня числовые столбцы смешаны с моими данными.
Поэтому во имя здравомыслия, пожалуйста, не используйте эту функцию, это усложняет обслуживание кода