Mysql приводит к PHP - массивы или объекты? - PullRequest
28 голосов
/ 24 сентября 2008

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

Ответы [ 9 ]

40 голосов
/ 24 сентября 2008

Производительность не имеет значения, что вы используете. Разница в том, что 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] ;
}
30 голосов
/ 12 августа 2009

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){...}

Хотя многим поклонникам ООП (а я поклоннику ООП) нравится идея превращения всего в объект, я чувствую, что ассоциативный массив - лучшая модель строки из базы данных, чем объект Так как, на мой взгляд, объект - это набор свойств с методами, которые воздействуют на них, тогда как строка является просто данными и должна рассматриваться как таковая без дальнейших осложнений.

5 голосов
/ 27 февраля 2009

Что следует иметь в виду: массивы можно легко добавить в кэш памяти (eaccelerator, XCache, ..), а объекты - нет (их нужно сериализовать при хранении и не сериализовать при каждом извлечении!).

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

4 голосов
/ 24 сентября 2008

Извлечение массива с помощью mysql_fetch_array() позволяет циклически просматривать набор результатов с помощью цикла foreach или цикла for. mysql_fetch_object() не может быть пройдено циклом for.

Не уверен, что это вообще имеет значение, просто подумал, что упомяну это.

2 голосов
/ 28 января 2012

Кроме того, если вы в конечном итоге захотите применить Memcaching к своим результатам MySQL, вы можете выбрать массивы. Кажется, безопаснее хранить типы массивов, а не результаты типов объектов.

1 голос
/ 24 сентября 2008
while ($Row = mysql_fetch_object($rs)) {
    // ...do stuff...
}

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

0 голосов
/ 24 сентября 2008

Я голосую против mysql_fetch_array()

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

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

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

0 голосов
/ 24 сентября 2008

по скорости, mysql_fetch_object() идентично mysql_fetch_array() и почти так же быстро, как mysql_fetch_row().

Кроме того, с mysql_fetch_object() вы сможете получить доступ к данным поля только по соответствующим именам полей.

0 голосов
/ 24 сентября 2008

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

Если вас беспокоит такая оптимизация, используйте mysql_fetch_row(). Он самый быстрый, потому что не использует ассоциативные массивы (например, $ row [2]), но проще всего разбить ваш код с ним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...