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


24

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

35

Оценка производительности: не имеет значения, что вы используете. Разница заключается в том, что 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] ; 
} 
  0

В принципе, это зависит от ваших предпочтений. 23 сен. 082008-09-23 22:53:43

+7

маленькая разница, _row возвращает 0,1 .. и _array возвращает 'userid', 'fullname', '0', '1'. 24 сен. 082008-09-24 08:49:24

  0

в следующем аргументе mysql_fetch_array вы можете указать погоду, которую хотите получить ассоциативный результат, числовой результат или оба (результат означает значение индекса массива) :) 02 мар. 122012-03-02 23:13:23

+1

на основе этой статьи http: //www.spearheadsoftwares.com/tutorials/php-performance-benchmarking/50-mysql-fetch-assoc-vs-mysql-fetch-array-vs-mysql-fetch-object в LARGE-запросах вы должны использовать _assoc() или _array() 18 июл. 132013-07-18 17:44:41


4

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

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

+7

Свойства объекта можно повторить через foreach в php5 + 23 сен. 082008-09-23 22:17:14

+3

while ($ row = mysql_fetch_object ($ result)). Его использование точно так же, как и mysql_fetch_array(), за исключением того, что вы используете поле $ row-> вместо $ row ['field']. 23 сен. 082008-09-23 22:19:39

  0

Оуэн, это именно то, что я сказал. 23 сен. 082008-09-23 22:42:02

  0

Я лично более комфортно с ассоциативными массивами и foreach, но я попробую метод объекта и посмотрю, смогу ли я заставить его работать. 01 ноя. 082008-11-01 21:16:10

  0

Бедный Стив просто накрутил людей, которые не читали правильно написанное. Я ненавижу это, когда это происходит, но я могу понять, почему они прочли его так, как они это сделали. Вы оставили заявление довольно неоднозначным. 06 апр. 102010-04-06 02:08:33

  0

+1, чтобы довести вас до 0. Но если серьезно, легко понять ваш ответ 21 май. 102010-05-21 05:45:33


0

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

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


1
while ($Row = mysql_fetch_object($rs)) { 
    // ...do stuff... 
} 

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

  0

Я действительно не видел такого кода в дикой природе. 24 июл. 122012-07-24 22:19:23


0

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

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


-2

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

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

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

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

+4

mysql_fetch_array() возвращает массив с численными и ассоциативными индексами; Веселье для всей семьи. 10 окт. 092009-10-10 23:41:55

  0

ахх справа! Я думал о другой функции. Я пересмотрел свой ответ 25 июл. 122012-07-25 17:20:42


5

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

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

+1

Хорошая точка (поддержка кеша памяти). 24 июл. 122012-07-24 22:20:01


30

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

mysql_fetch_object имеет некоторые недостатки, особенно если вы используете на нем слой db.

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

  • Если вы хотите, чтобы получить столбец на основе его имени, stroed в некоторых переменных вы также должны начать использовать свойство переменной $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){...} 

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

+3

+1 за лучший ответ на эту тему. Раньше я использовал ассоциацию, затем я переключился на объекты (пытаясь сделать все объекты), но переключился на связь по причинам, которые вы сказали; Это больше похоже на данные в виде массива, чем на объект. 21 авг. 122012-08-21 18:35:06

  0

@ J.Money Но как насчет того, когда вы на самом деле переключаетесь на результаты базы данных, представляемые объектами? Например, в активных шаблонах записей, я предпочитаю, если интерфейс уже использует интерфейс объекта. $ user = User :: find (1), а затем на лицевой стороне, если он уже реализован как $ user-> email, изменений не будет. Это дает вам больше гибкости, чтобы позволить методам вызывать из внешнего интерфейса результаты. Хотя по-прежнему довольно сложно сделать объекты реализацией интерфейса ArrayAccess, чтобы сделать $ user ['email'] делать то же самое с объектом, как $ user-> email .. 22 авг. 122012-08-22 17:53:18

  0

методы @Anther Magic упрощают реализацию активного запись с использованием массивов для хранения данных строки. Вы правы, хотя по мере того, как PHP больше движется в сторону ООП, реализация mysql_fetch_ * происходит за кулисами, и поэтому тривиально, используется ли тот или иной. Фактически, единственной причиной, по которой я начал думать об этом, было то, что я переписываю чей-то процедурный код, чтобы быть более ориентированным на объекты, и он не использует слой абстракции базы данных. Они используют все функции mysql_fetch_ * без каких-либо различимых шаблонов. 22 авг. 122012-08-22 18:24:39

  0

@ bažmegakapa Этот ответ имеет для меня большой смысл, и я действительно думал о переходе на mysql_fetch_assoc из mysql_fetch_object. Я обнаружил, что mysql_fetch_object может запутаться, когда вы начинаете присоединяться к полям из других таблиц. Один вопрос, если можно. У меня обычно есть небольшие функции полезности в моих объектных классах. Например, full_name() вернет $ this-> first_name. ''. $ This-> last_name. Я теряю быстрый доступ к этим методам при переключении на массивы. Как вы справились с этой проблемой? 02 янв. 132013-01-02 22:50:34

  0

@ Джонатан Я не написал этот ответ, просто отредактировал его. Это ответ темного пингвина, который кажется удаленным пользователем. (Я бы сказал, забыл старый материал 'mysql_' и переключился на PDO) 03 янв. 132013-01-03 02:34:55


2

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