2016-06-28 6 views
1

Я читаю mysqli_store_result и не понимаю, почему это отказ, а не отказ. Согласно руководству я не должен использовать это для операций с памятью, но при условии, что я получаю только 50-100 строк текста за раз (обычно), я пришел к выводу, что я всегда должен его использовать, но я должен явно вызовите его для каждого запроса. Мне это кажется странным. Я говорю это, потому что это указывает на то, что я что-то неправильно понял.Использовать mysqli_store_result по умолчанию

Насколько я понимаю; если вы прочитали 100 строк и используете while ($stmt->fetch()), вы фактически отправляете 100 запросов read-next-to MySQL по сети (предполагая, что сеть и БД находятся на разных машинах). Если вы используете mysqli_store_result, вы отправляете только один запрос и зацикливаете результирующий набор на веб-сервере. Почему я не всегда так делаю? Что мне не хватает?

И подзапрос: Имеет ли это какое-то отношение к моей переменной статуса MySQL, «handler read next» является очень высокой, и будет хранить help_result?

+0

imo, я не уверен насчет части «по сети» вашего вопроса. Скрипт PHP работает на сервере, что база данных находится в обычном режиме. Я подозреваю, что сетевые накладные расходы между PHP и движком базы данных незначительны. Т.е. я склонен думать о 100 выборках как о медленных вызовах функций. Кроме того, данные будут также буферизованы механизмом базы данных. Поэтому для сбора данных не требуется много работы для обеих сторон. –

+1

PHP-скрипт работает на веб-сервере, а не на сервере базы данных. Обычно это один и тот же хост, если приложение не масштабируется до любого примечательного размера. Я сделал несколько простых тестов и не могу измерить разницу между сохранением результата или нет, поэтому, возможно, я должен просто оставить это в покое. Теперь я просто не вижу, какую цель он служит. – nickdnk

+0

точка, взятая о больших базах данных –

ответ

-1

Фактически вы можете или не можете выдавать «100 запросов». PHP обращается к интерфейсу уровня MySQL, который, в свою очередь, разговаривает с базой данных. (Но вы можете наблюдать за трафиком, скажем, с помощью «WireShark» или других не менее интересных инструментов TCP/IP-sniffing ...)

Однако, сказав это, что я закончил делать ... после столкнувшись с некоторыми «откровенно, очень странными» особенностями ... должен был получить весь набор результатов в массив, а затем закрыть дескриптор-дескриптор. Затем моя логика выводит строки из этого массива. «Меньше наполнения, вкусно.»

У меня был ... вопросов ... с mysqli_store_result, который я так и не смог полностью выяснить. Поэтому я отказался от него, нашел такой же удовлетворительный способ, которым работала (а именно: «хранить его в массиве PHP ...») и перемещалась.

+0

Можете ли вы уточнить (возможно, с кодом?) «Получить весь набор результатов в массив» Я не уверен, что вы имеете в виду – nickdnk

+0

Мой код * (класс ...) * завершен используя 'mysqli_fetch_array()' ... –

+0

для использования mysqli_fetch_array() вам либо нужно использовать store_result в форме get_result, либо использовать mysqli_query вместо готовых операторов. что делает ваши размышления скорее нерелевантными или противоречивыми. –

1

Почему это отказ, а не отказ.

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

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

Интересно, однако, почему для mysqli_query() буферный режим включен по умолчанию, но для подготовки/выполнения это не так.

все же я должен явно называть его для каждого запроса.

Да ладно! это только вещь, которую вы должны вызвать для каждого запроса? Как насчет , вызывающего bind_param, bind_result, execute()? Понимаете, mysqli - это вызов самых основных функций API. Итак, в некотором смысле, вызов store_result() довольно логичен.

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

+0

Да, очевидно, мне нужно вызвать несколько вопросов для каждого запроса, но все остальные функции зависят либо от времени (execute/fetch), либо связаны с конкретным запросом (bind/prepare). Я бы счел разумным иметь возможность глобально (скажем, за соединение) разрешить буферизованное чтение. – nickdnk

+0

, тогда вы должны попробовать PDO :) –

Смежные вопросы