Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: mysql_fetch_assoc и mysql_fetch_array
 
 автор: neadekvat   (11.10.2009 в 01:35)   письмо автору
 
 

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

Но все-таки. Что лучше использовать? Чисто логически, если мне не нужен числовой массив, надо воспользоваться первым. Но есть ли какие-то еще везкие причины использовать именно mysql_fetch_assoc, а не mysql_fetch_array (при том, что последняя функция вызывается без доп.параметров)?

По логике, запрос с mysql_fetch_array должен занимать ~в два раза больше времени, т.к. надо вернуть два массива, вместо одного. Верно ли я мыслю?

  Ответить  
 
 автор: Drago   (11.10.2009 в 02:45)   письмо автору
 
   для: neadekvat   (11.10.2009 в 01:35)
 

Неправильный вопрос вы задаете. А правильный звучит так:
"Есть ли какие-то еще веские причины (помимо дополнительного числового массива) использовать именно mysql_fetch_array, а не mysql_fetch_assoc (при том, что первая функция вызывается без доп. параметров, а значит занимает ~в два раза больше памяти)"

  Ответить  
 
 автор: neadekvat   (11.10.2009 в 02:50)   письмо автору
 
   для: Drago   (11.10.2009 в 02:45)
 

Не будьте занудой.
Если это завуалированный ответ, то не правильно вы отвечаете. А правильно ответить было бы, сказав прямо свою точку зрения и подтвердив её аргументами.

  Ответить  
 
 автор: Trianon   (11.10.2009 в 09:53)   письмо автору
 
   для: neadekvat   (11.10.2009 в 02:50)
 

>Не будьте занудой.
>Если это завуалированный ответ, то не правильно вы отвечаете. А правильно ответить было бы, сказав прямо свою точку зрения и подтвердив её аргументами.

Почему? Точку зрения Вы уже выразили. Подтвердите её аргументами, чтоли?
Я сейчас по поводу формулировки ответа, если что.

  Ответить  
 
 автор: neadekvat   (11.10.2009 в 15:12)   письмо автору
 
   для: Trianon   (11.10.2009 в 09:53)
 

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

  Ответить  
 
 автор: Trianon   (11.10.2009 в 15:55)   письмо автору
 
   для: neadekvat   (11.10.2009 в 15:12)
 

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

  Ответить  
 
 автор: neadekvat   (11.10.2009 в 16:30)   письмо автору
 
   для: Trianon   (11.10.2009 в 15:55)
 

Потому что, изложив свою точку зрения оппоненту с аргументами, мы предоставим ему возможность размышлять, оперируя, в том числе, вашими аргументами. Если у вас есть своя точка зрения, то почему я должен доказывать себе её правильность? Докажите вы мне, тем более, когда я спрашиваю вашего мнения с объяснениями, а не намеков и подсказок, коих в моей голове и так достаточно.

  Ответить  
 
 автор: dios™   (11.10.2009 в 17:06)   письмо автору
 
   для: neadekvat   (11.10.2009 в 16:30)
 

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

  Ответить  
 
 автор: Trianon   (11.10.2009 в 17:54)   письмо автору
 
   для: neadekvat   (11.10.2009 в 16:30)
 

Ну ... доказывать, пожалуй, ни я, ни Drago никому ничего не собирались :)
Если пищи для размышления у Вас с избытком - переваривайте :))

Могу лишь оформить свои мысли по этому поводу.



Есть вызов mysql_fetch_row .
Возвращает строго определенные данные - строку массива результата.
Ключами элементов являются номера столбцов.
Вызов хорош тем, что при строго детерминированном SELECT-запросе (т.е. без звездочек) - также является полным и строго детерминированным.
Количество элементов массива всегда соответствует количеству столбиков запроса.
Неудобен тем, что связь через номер столбика не надежнаяи и наглядная, но такая запись, как
for($res = mysql_query( "SELECT id, name, grp FROM tbl");
     list( $id, $name, $grp) = mysql_fetch_row($res);)
   echo "$id/$name/$grp";
этот недостаток практически устраняет.



Есть вызов mysql_fetch_assoc .
Возвращает строго определенные данные - строку массива результата.
Ключами элементов являются имена столбцов.
Вызов хорош тем, что при строго детерминированном SELECT-запросе (т.е. без звездочек и с алиасами, исключающими неоднозначность) - также является полным и строго детерминированным.
Несколько плох тем, что количество элементов массива соответствует количеству столбиков запроса только тогда, когда нет неоднозначности полей. Иначе поля теряются.
При запросе без неоднозначностей - прекрасен жесткой связью имени столбика и ключа массива.

for($res = mysql_query( "SELECT * FROM tbl");
     $row = mysql_fetch_row($res);)
    echo $row['id'].'/'.$row['name'].'/'.$row['grp'];



Есть вызов mysql_fetch_array .
Возвращает кашу, несоответствующую никакому осмысленному набору данных, на поверку оказывающуюся помесью результатов первых двух вызовов.
Помимо этого факта сочетает в себе недостатки их обоих.
Атавистическое достоинство - работает в php3 (Вам не смешно?)

Разумного применения вне первых двух - не имеет. Пример не привести.

Как-то так.

  Ответить  
 
 автор: neadekvat   (11.10.2009 в 18:57)   письмо автору
 
   для: Trianon   (11.10.2009 в 17:54)
 

Этого я от вас и ждал :)

Спасибо за подробный ответ.

  Ответить  
 
 автор: dios™   (11.10.2009 в 08:41)   письмо автору
 
   для: neadekvat   (11.10.2009 в 01:35)
 

Функция mysql_fetch_array() возвращает по умолчанию, как ассоциативный, так и нумерованный массив(параметр MYSQL_BOTH). Не знаю конечно, как это реализовано в РНР, но по логике вещей индекс массива - это ссылка на определённый адрес памяти, то есть на одну и ту же ячейку памяти, поэтому кол-во данных одинаково, единственное что - дополнительные накладные расходы на хранение дополнительных указателей(индексов массива). При передаче других параметров (MYSQL_ASSOC или MYSQL_NUM) возвращается либо ассоциативный либо нумерованный массив. Вообще по сути говоря за несколько сотых миллисекунд стоит бороться лишь в том случае, если нагрузка на сервер большая, да и обращение к элементу ассоциативного массива требует больше времени и ресурсов, нежели обращение к нумерованному( убедиться можно с помощью профилирования кода с доастаточно большой выборкой из таблицы с 100 000 записей, к примеру ).
Это всего лишь моё ИМХО, за чистую монету не принимать.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования