Что такое код msql_fetch_object

Содержание

mysql_fetch_object

mysql_fetch_object — Обрабатывает ряд результата запроса и возвращает объект

Данное расширение устарело, начиная с версии PHP 5.5.0, и удалено в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API и соответствующий FAQ для получения более подробной информации. Альтернативы для данной функции:

Описание

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

Список параметров

Обрабатываемый результат запроса. Этот результат может быть получен с помощью функции mysql_query() .

Имя класса. Будет создан экземпляр указанного класса, заполнен свойствами и возвращен. Если не указан, возвращается экземпляр stdClass.

Необязательный массив ( array ) параметров, передаваемых в конструктор создаваемого экземпляра class_name .

Возвращаемые значения

Возвращает объект ( object ) со строковыми свойствами, соответствующими полученному ряду, или FALSE , если рядов больше нет.

Примеры

Пример #1 Пример использования mysql_fetch_object()

Пример #2 Пример использования mysql_fetch_object()

mysql_connect ( «hostname» , «user» , «password» );
mysql_select_db ( «mydb» );

$result = mysql_query ( «select name from mytable limit 1» );
$obj = mysql_fetch_object ( $result , ‘foo’ );
var_dump ( $obj );
?>

Примечания

Замечание: Производительность

В плане скорости эта функция аналогична mysql_fetch_array() и почти также быстра, как mysql_fetch_row() (разница незначительна).

mysql_fetch_object() работает аналогично mysql_fetch_array() , с единственным отличием — функция возвращает объект вместо массива. Это, кроме всего прочего, означает, что вы сможете работать с полями только по имени колонок, а не индексов (числа не могут быть свойствами объекта).

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

Замечание: Эта функция устанавливает NULL-поля в значение NULL PHP.

Смотрите также

  • mysql_fetch_array() — Обрабатывает ряд результата запроса, возвращая ассоциативный массив, численный массив или оба
  • mysql_fetch_assoc() — Возвращает ряд результата запроса в качестве ассоциативного массива
  • mysql_fetch_row() — Обрабатывает ряд результата запроса и возвращает массив с числовыми индексами
  • mysql_data_seek() — Перемещает внутренний указатель в результате запроса
  • mysql_query() — Посылает запрос MySQL

Параметр PHP class_name функции mysql_fetch_object()

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

Ошибка следующая: Warning: Missing argument 1 for Ratio::__construct() in /Users/Alex/Sites/All Good Things/_manage/c/c_ratio.php on line 9

Что я могу понять; здесь код для конструктора Ratio :

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

Я не могу найти примеров синтаксиса, необходимых для этого третьего параметра.

Используйте псевдоним столбца. Атрибут столбца зависит от того, как вы создаете запрос. Если вы используете псевдоним (через as ), то он должен быть псевдонимом, иначе использовать имя столбца. См. Пример ниже.

Описание констант PDO::FETCH_*.

Как уже говорилось в статье Как работать с PDO?, константы, задающие режим получения данных (наряду с передачей параметров напрямую в execute() ) делают PDO по-настоящему удобной библиотекой для работы с БД, а не просто еще одним (пусть и универсальным) API для доступа к базе данных. С помощью этих констант можно значительно сократить код многих рутинных операций, поскольку они позволяют получить данные сразу в нужном формате.

Хотя интересующие нас константы частично описываются на страницах документации, посвященных методам fetch() и fetchAll() , полный список приведен только на странице с общим списком констант PDO, что не кажется мне очень удобным, и может являться той причиной, по которой некоторые особенно интересные режимы получения данных оказались вне поля зрения большинства разработчиков. Я решил выделить интересующие нас константы из общего списка и разбить для удобства на несколько категорий, поскольку их количество впечатляет — ни много ни мало, а целых 25 штук!

Классика

Для начала перечислим константы, которые дублируют стандартное поведение теплых ламповых функций mysql. Все примеры даются с использованием функции var_export() .

PDO::FETCH_BOTH

аналог mysql_fetch_array() . Все данные возвращаются в дублированном виде — и с текстовыми индексами, и с цифровыми. Этот режим включен в PDO по умолчанию.

PDO::FETCH_NUM

снова старый знакомый, аналог mysql_fetch_row() . Только цифровые индексы:

PDO::FETCH_ASSOC

то же самое, аналог mysql_fetch_assoc() , только текстовые индексы.

PDO::FETCH_OBJ

аналог mysql_fetch_object() без указания имени класса, возвращает экземпляр stdClass

PDO::FETCH_LAZY

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

  • Во-первых, эта переменная не содержит сами запрошенные данные, а отдаёт их по запросу (на что намекает название)
  • Во-вторых, помимо запрошенных данных, в объекте присутствует загадочная переменная, которая называется queryString и содержит SQL запрос(!) (что намекает о родственности этого класса PDOStatement):

Для пытливых — да, перезаписать queryString можно :)

  • В-третьих, эту переменную невозможно сохранить в сессии (или, другими словами — сериализовать)
  • В-четвертых, получать из неё данные можно как угодно, любым из трёх способов: через числовой индекс, ассоциативный, или обращаясь к свойству класса через ->
  • В-пятых, обращение к несуществующим свойствам не вызывает нотис Undefined property / index. Молча возвращается NULL .
  • В-шестых, эта переменная меняет своё состояние от последующих вызовов fetch() с другими константами. Плюс ко всему, эта константа не работает с fetchAll() , а только с fetch() .
  • Проведём пару экспериментов. Попробуем запросить относительно большой объём данных, и посмотрим, как меняется потребление памяти, и заодно проверим ещё пару утверждений:

    Как видно, этот код опрашивает нашу таблицу users, добавляя к строке мегабайтное поле. После этого мы получаем строку через эту константу — объём памяти не поменялся. Только после того, как мы присваиваем значение мегабайтного поля переменной — он увеличивается. Для контроля выводим имя из таблицы users. Затем получаем ещё одну строку, уже в одном из стандартных режимов. Видим, что объем памяти тут же подскакивает, в отличие от предыдущего случая. Экономия в первом случае налицо! Так же мы видим отсутствие нотиса и смену состояния $lazy после вызова fetch() .

    Из всей этой информации можно сделать вывод, что объект PDORow — это канал прямой связи с астралом resultSet-ом драйвера БД. И, не имея собственного состояния, попросту читает данные с текущей позиции курсора. Учитывая всё вышесказанное можно только удивляться, почему эта константа до сих пор так редко используется.

    Самое полезное

    Здесь я решил собрать самые полезные, на мой взгляд, режимы, которые возвращают данные в наиболее востребованных в повседневной разработке форматах.

    Примечание: здесь и далее все примеры даются при включенном по умолчанию формате вывода PDO::FETCH_ASSOC

    PDO::FETCH_COLUMN

    Вытаскивает только одну колонку из результата. Соответственно, имеет смысл только при использовании с fetchAll() — и в этом случае возвращает сразу одномерный массив. Очень удобно.

    Дополнительным параметром можно указать номер выбираемой колонки. Если этот флаг используется сам по себе, то номер указывать нет смысла (надо сразу в запросе выбирать только одну колонку, которая и будет выведена), но если в комбинации с другими, то номер может оказаться полезным.

    PDO::FETCH_KEY_PAIR

    Малоизвестный, но довольно полезный режим, когда из двух запрошенных полей содержимое первого становится ключом, а второго — значением одномерного массива.

    Требователен к количеству колонок в запросе — их должно быть строго две

    PDO::FETCH_UNIQUE

    похож на предыдущий, но в качестве значения возвращает всю оставшуюся строку. C fetch() этот режим не возвращает ничего вразумительного, а вот с fetchAll() как раз получается такой, весьма востребованный режим. Главное, чтобы первой колонкой в запросе выбиралось уникальное поле — тогда оно будет использовано в качестве индекса возвращаемого массива, вместо обычной нумерации

    PDO::FETCH_GROUP

    Группирует значения по первой колонке. К примеру, нижеследующий код разобьёт пользователей на мальчиков и девочек, и положит их в разные массивы:

    То есть, этот режим идеально подходит для классической задачи «вывести события сгруппированные по дням» (или «вывести товары, сгруппированные по категориям»). Также может комбинироваться с PDO::FETCH_COLUMN :

    Объектное ориентирование

    Разумеется, простым stdObject возможности (я бы даже сказал — аппетиты) PDO по работе с объектами не исчерпываются. Дальше идет целая серия режимов для всевозможной манипуляции ими.

    PDO::FETCH_CLASS

    Создаёт объект указанного класса, заполняя его свойства данными из БД. Однако здесь, увы, начинаются неудобства и непоследовательность в работе вызывающих функций. Если для fetchAll() можно написать красиво и компактно

    то для fetch() приходится писать такую колбасу:

    Из-за того что fetch() не позволяет передать имя класса, мы вынуждены пользоваться setFetchMode() . А учитывая, что эта функция возвращает булево значение, а не ссылку на объект, мы не можем использовать method chaining. Пичаль. Также следует помнить, что в этом режиме PDO будет вызывать магический метод __set() если свойство, совпадающее с именем поля, не найдено в объекте. Для PHP это означает, что если в объекте отсутствует такой метод, то все колонки строки, полученной из БД, будут назначены переменным класса. Если же мы хотим присвоить значения только существующим переменным, то этот момент надо контролировать с помощью метода __set() . Например

    в то время как у класса с пустым __set() будут заполнены только существующие свойства:

    Можно, кстати, заметить, что PDO присваивает значения и приватным свойствам, что несколько неожиданно, но очень удобно.

    PDO::FETCH_CLASSTYPE

    Очень интересная константа. Представляет собой не самостоятельный режим получения данных, а флаг-модификатор, изменяющий поведение других режимов. При её использовании PDO будет брать имя класса из первой колонки полученных из БД данных. То есть, с её помощью код для fetch() можно сделать короче

    PDO::FETCH_PROPS_LATE

    Ещё один флаг-модификатор. По умолчанию PDO присваивает значения свойствам класса до вызова конструктора. При помощи же данной константы это поведение можно изменить — сначала будет вызываться конструктор:

    Илон Маск рекомендует:  Строит список воспроизведения MP3 на PHP

    PDO::FETCH_INTO

    в отличие от PDO::FETCH_CLASS не создаёт новый объект, а обновляет существующий. Соответственно, в качестве параметра передается переменная с объектом. По очевидным причинам имеет смысл только с fetch()

    Как видно, fetch() возвращает тот же объект, что представляется мне несколько избыточным. Также, с сожалением приходится констатировать, что в отличие от PDO::FETCH_CLASS , этот режим не присваивает значения приватным свойствам.

    PDO::FETCH_SERIALIZE

    ещё один флаг для PDO::FETCH_CLASS . Должен возвращать объект, который хранился в БД в сериализованном виде. Конструктор не вызывается. На данный момент не работает. Должно быть что-то вроде такого

    Этот режим попил у меня крови изрядно. Описание у него самое невинное — «то же самое, что и PDO::FETCH_INTO, но объект передается в сериализованном массиве». А куда передавать-то? В параметры что ли? пробовал и так, и сяк — ничего не получалось. Только когда нашел юнит-тест, посвященный этому режиму, стало понятно, что объект должен придти из БД. Но всё равно не получается — пишет, «cannot unserialize class».

    В общем, предполагается, что этот режим должен создавать объект из сериализованного представления, хранящегося в БД. Но это не работает, поскольку при использовании этого метода из базы возвращается не то, что туда клали! Вместо исходного объекта возвращается внонимный класс, который содержит два свойства — одно с именем объекта, и второе с исходным объектом. В общем, мы с zerkms-ом покопались, и в итоге он накатал баг-репорт, https://bugs.php.net/bug.php? >

    Разное

    PDO::FETCH_FUNC

    для любителей замыканий. Работает только внутри fetchAll() . В параметры функции PDO передаёт переменные для каждого полученного поля, что может быть неудобным — нет доступа к именам полей, а только к значениям. К примеру, эмуляция работы PDO::FETCH_COLUMN:

    PDO::FETCH_NAMED

    почти то же самое, что PDO::FETCH_ASSOC , но с одним отличием. Много раз я встречал на форумах вопросы о том, как получить значения полей с одинаковыми именами из разных таблиц при джойне. Всегда ответ был один — писать алиасы руками в запросе или использовать цифровые индексы. А вот и ответ от PDO: получение данных в этом режиме аналогично PDO::FETCH_ASSOC, но если встречаются поля с одинаковыми именами, то все значения по очереди записываются во вложенный массив. Допустим, у нас есть таблицы users и companies, причем в обеих есть поле name. Если получать данные традиционным путём, то одно из полей будет съедено:

    Если же указать это флаг, то все значения колонок с совпадающими именами будут собраны во вложенном массиве в порядке поступления:

    Уж не знаю, насколько это востребованная фича, и насколько легче разбирать массив, нежели прописать алиасы в запросе.

    PDO::FETCH_BOUND

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

    Untested

    За неимением подходящей БД я не смог проверить работу еще нескольких констант. Но, на мой взгляд, их поведение достаточно очевидно и не нуждается в особом описании.

    • PDO::ATTR_FETCH_CATALOG_NAMES — возвращает имена колонок в формате «каталог.имя_колонки». Поддерживается не всеми драйверами.
    • PDO::ATTR_FETCH_TABLE_NAMES — возвращает имена колонок в формате «имятаблицы.имяколонки». Поддерживается не всеми драйверами.
    • PDO::FETCH_ORI_* — 6 функций по управлению курсором при получении данных из БД. Пример есть в документации

    РНР параметр имя_класса из mysql_fetch_object функции ()

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

    Ошибка заключается в следующем: Warning: Missing argument 1 for Ratio::__construct() in /Users/Alex/Sites/All Good Things/_manage/c/c_ratio.php on line 9

    Что я могу понять; вот код для Ratio конструктора:

    Во всяком случае, как я передать переменные из результата я только что созданной функции, то есть, что я что делать что-то вроде этого:

    Я не могу найти примеры синтаксиса, необходимого для третьего параметра.

    Используйте псевдоним столбца. Псевдоним столбца зависит от того, как построить запрос. Если вы используете псевдоним (от as ) , то он должен быть псевдоним иным образом использовать имя столбца. Смотрите пример ниже.

    mysql_fetch_array () / mysql_fetch_assoc () / mysql_fetch_row () / mysql_num_rows и т. д. … ожидает, что параметр 1 будет ресурсом или результатом

    Я пытаюсь выбрать данные из таблицы MySQL, но получаю одно из следующих сообщений об ошибке:

    mysql_fetch_array () ожидает, что параметр 1 будет ресурсом, учитывая логическое значение

    mysqli_fetch_array () ожидает, что параметр 1 будет mysqli_result, логическое значение

    Вызов функции-члена fetch_array () для логического / необъектного

    То же самое относится и к коду

    Решение

    Запрос может завершиться ошибкой по разным причинам, и в этом случае и mysql_ *, и расширение mysqli вернутся false из их соответствующих функций / методов запроса. Вы должны проверить это условие ошибки и обработать его соответствующим образом.

    НОТА MySQL функции устарели и были удалены в версии 7 php.

    Проверьте $result прежде чем передать его mysql_fetch_array , Вы обнаружите, что это false потому что запрос не удался. Увидеть mysql_query документация для возможных возвращаемых значений и предложения о том, как с ними обращаться.

    используя подготовленное утверждение:

    Эти примеры только иллюстрируют какие должно быть сделано (обработка ошибок), а не как это сделать. Производственный код не должен использовать or die при выводе HTML, иначе он будет (по крайней мере) генерировать недействительный HTML. Кроме того, сообщения об ошибках базы данных не должны отображаться пользователям без прав администратора, так как раскрывает слишком много информации .

    Другие решения

    Это сообщение об ошибке отображается, когда в вашем запросе есть ошибка, которая привела к его сбою. Это проявится при использовании:

    • mysql_fetch_array / mysqli_fetch_array()
    • mysql_fetch_assoc() / mysqli_fetch_assoc()
    • mysql_num_rows() / mysqli_num_rows()

    Заметка: Эта ошибка делает не появляются, если ваш запрос не затрагивает ни одной строки. Только запрос с неправильным синтаксисом будет генерировать эту ошибку.

    Действия по устранению неполадок

    Убедитесь, что ваш сервер разработки настроен для отображения всех ошибок. Вы можете сделать это, разместив это в верхней части ваших файлов или в вашем конфигурационном файле: error_reporting(-1); . Если у вас есть какие-либо синтаксические ошибки, это укажет их вам.

    использование mysql_error() . mysql_error() сообщит о любых ошибках, обнаруженных MySQL при выполнении вашего запроса.

    Запустите ваш запрос из командной строки MySQL или инструмента вроде PhpMyAdmin . Если в вашем запросе есть синтаксическая ошибка, это скажет вам, что это такое.

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

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

    Убедитесь, что вы не смешиваете mysqli_* а также mysql_* функции. Они не одно и то же и не могут использоваться вместе. (Если вы собираетесь выбрать одну или другую палку с mysqli_* , Смотрите ниже, почему.)

    Другие советы

    mysql_* функции не должны использоваться для нового кода. Они больше не поддерживаются, и сообщество начало процесс амортизации . Вместо этого вы должны узнать о готовые заявления и использовать либо PDO или же MySQLi . Если ты не можешь решить, Эта статья поможет выбрать. Если вы хотите учиться, вот хороший учебник PDO .

    Ошибка произошла здесь из-за использования одинарных кавычек ( ‘ ). Вы можете поставить свой запрос так:

    Он использует mysql_real_escape_string для предотвращения SQL-инъекций.
    Хотя мы должны использовать расширение MySQLi или PDO_MYSQL для обновленной версии PHP (PHP 5.5.0 и выше), но для более старых версий mysql_real_escape_string сделает свое дело.

    Как scompt.com объяснил , запрос может потерпеть неудачу. Используйте этот код, чтобы получить ошибку запроса или правильный результат:

    Увидеть документация для mysql_query() для дополнительной информации.

    Фактическая ошибка заключалась в одинарных кавычках, так что переменная $username не был разобран. Но вы должны действительно использовать mysql_real_escape_string($username) чтобы избежать SQL-инъекций.

    Положите цитаты вокруг $username , Строковые значения, в отличие от числовых значений, должны быть заключены в кавычки.

    Кроме того, нет смысла использовать LIKE условие, если вы не используете подстановочные знаки: если вам нужно точное совпадение, используйте = вместо LIKE ,

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

    перед запросом MySQL
    а затем перейти к следующему шагу

    Ваш код должен быть примерно таким

    Сделав это, вы напечатаете запрос на экране. Попробуйте этот запрос на вашем сервере и посмотрите, даст ли он желаемые результаты. В большинстве случаев ошибка в запросе. Остальная часть кода верна.

    Вы определяете строку, используя одинарные кавычки, а PHP не анализирует строки, разделенные одинарными кавычками. Чтобы получить переменную интерполяцию, вам нужно использовать двойные кавычки ИЛИ конкатенацию строк (или их комбинацию). Увидеть http://php.net/manual/en/language.types.string.php для дополнительной информации.

    Также вы должны убедиться, что mysql_query вернул действительный ресурс результата, иначе fetch_ *, num_rows и т. Д. Не будут работать с результатом, поскольку это не результат! IE:

    Использование mysql_fetch_object

    Недавно я изучал некоторые ООП PHP и, кажется, столкнулся с проблемой при использовании mysql_fetch_object (), получая ошибку

    Примечание: неопределенное свойство: stdClass :: $ FirstName в C: \ xampp \ htdocs \ includes \ login.php в строке 10

    Вот код, который я использую:

    И я вызываю эту функцию следующим образом:

    Я довольно озадачен тем, что я делаю неправильно, сможет ли кто-нибудь указать мне правильное направление или дать возможное решение?

    3 ответа

    Вы выбираете только два столбца с вашим запросом: адрес электронной почты и пароль. Таким образом, все остальные поля в вашей таблице, включая поле FirstName, не будут выбраны и недоступны в объекте, возвращаемом вами из функции.

    Это также извлечет свойство FirstName или используйте * для выбора всех столбцов, чтобы вы могли использовать любое поле в выбранном объекте. Удачи!

    Вы выбираете адрес Email и Password , имя отсутствует, поэтому вы не можете получить к нему доступ.

    Вы только получаете электронную почту и пароль, а не имя.

    Таким образом, ваш запрос будет выглядеть так:

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

    php mysql assoc (8)

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

    Илон Маск рекомендует:  Что такое код domelement >get_attribute

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

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

    Если вы хотите получить столбец на основе его имени, в какой-то переменной вам нужно будет начать использовать свойства переменной $row-> <$column_name>, а синтаксис массива $row[$column_name]

    Конструкторы не вызываются, если вы можете ожидать, если вы укажете имя класса.

    Если вы не укажете имя класса, вы получите stdClass , который вряд ли лучше, чем массив.

    mysql_fetch_assoc — самый простой из трех, с которым нужно работать, и мне нравится различие, которое это дает в коде между объектами и строками результатов базы данных .

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

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

    Answer #1

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

    Answer #2

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

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

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

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

    Answer #3

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

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

    Answer #4

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

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

    Answer #5

    По производительности не имеет значения, что вы используете. Разница в том, что mysql_fetch_object возвращает объект:

    mysql_fetch_assoc () возвращает ассоциативный массив:

    и mysql_fetch_array () возвращает массив:

    Answer #6

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

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

    Answer #7

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

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

    PHP PDO: Режимы получения данных, константы PDO::FETCH_*

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

    Все предопределенные константы здесь

    PDO::FETCH_BOTH

    Аналог mysql_fetch_array() . Все данные возвращаются в дублированном виде, с текстовыми индексами и цифровыми. Этот режим включен в PDO по умолчанию.

    PDO::FETCH_NUM

    Аналог mysql_fetch_row() . Только цифровые индексы:

    PDO::FETCH_ASSOC

    Аналог mysql_fetch_assoc() Только текстовые индексы.

    PDO::FETCH_OBJ

    Аналог mysql_fetch_object() без указания имени класса, возвращает экземпляр stdClass

    PDO::FETCH_LAZY

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

    PDO::FETCH_COLUMN

    Когда необходимо получить только одну колонку из результата. Соответственно, имеет смысл только при использовании с fetchAll() — и в этом случае возвращает сразу одномерный массив.

    PDO::FETCH_KEY_PAIR

    Малоизвестный, но очень полезный режим, когда из двух запрошенных полей содержимое первого становится ключом, а второго — значением одномерного массива.

    PDO::FETCH_UNIQUE

    Похож на предыдущий, но в качестве значения возвращает всю оставшуюся строку. C fetch() этот режим не возвращает ничего вразумительного, а вот с fetchAll() как раз получается такой, весьма востребованный режим. Главное, чтобы первой колонкой в запросе выбиралось уникальное поле — тогда оно будет использовано в качестве индекса возвращаемого массива, вместо обычной нумерации

    PDO::FETCH_GROUP

    Группирует значения по первой колонке. К примеру, нижеследующий код разобьёт пользователей на мальчиков и девочек, и положит их в разные массивы:

    То есть, этот режим идеально подходит для классической задачи вывести события сгруппированные по дням (или вывести товары, сгруппированные по категориям). Также может комбинироваться с PDO::FETCH_COLUMN :

    PDO::FETCH_CLASS

    Создаёт объект указанного класса, заполняя его свойства данными из БД. Однако здесь, увы, начинаются неудобства и непоследовательность в работе вызывающих функций. Если для fetchAll() можно написать красиво и компактно

    то для fetch() приходится писать такую колбасу:

    Из-за того что fetch() не позволяет передать имя класса, мы вынуждены пользоваться setFetchMode() . А учитывая, что эта функция возвращает булево значение, а не ссылку на объект, мы не можем использовать method chaining. Также следует помнить, что в этом режиме PDO будет вызывать магический метод __set() если свойство, совпадающее с именем поля, не найдено в объекте. Для PHP это означает, что если в объекте отсутствует такой метод, то все колонки строки, полученной из БД, будут назначены переменным класса. Если же мы хотим присвоить значения только существующим переменным, то этот момент надо контролировать с помощью метода __set() . Например

    в то время как у класса с пустым __set() будут заполнены только существующие свойства:

    Можно, кстати, заметить, что PDO присваивает значения и приватным свойствам, что несколько неожиданно, но очень удобно.

    PDO::FETCH_CLASSTYPE

    Очень интересная константа. Представляет собой не самостоятельный режим получения данных, а флаг-модификатор, изменяющий поведение других режимов. При её использовании PDO будет брать имя класса из первой колонки полученных из БД данных. То есть, с её помощью код для fetch() можно сделать короче

    PDO::FETCH_PROPS_LATE

    Ещё один флаг-модификатор. По умолчанию PDO присваивает значения свойствам класса до вызова конструктора. При помощи же данной константы это поведение можно изменить — сначала будет вызываться конструктор:

    PDO::FETCH_INTO

    В отличие от PDO::FETCH_CLASS не создаёт новый объект, а обновляет существующий. Соответственно, в качестве параметра передается переменная с объектом. По очевидным причинам имеет смысл только с fetch()

    Как видно, fetch() возвращает тот же объект, что представляется мне несколько избыточным. Также, с сожалением приходится констатировать, что в отличие от PDO::FETCH_CLASS , этот режим не присваивает значения приватным свойствам.

    PDO::FETCH_SERIALIZE

    Ещё один флаг для PDO::FETCH_CLASS . Должен возвращать объект, который хранился в БД в сериализованном виде. Конструктор не вызывается. На данный момент не работает. Должно быть что-то вроде такого

    PDO::FETCH_FUNC

    Для любителей замыканий. Работает только внутри fetchAll() . В параметры функции PDO передаёт переменные для каждого полученного поля, что может быть неудобным — нет доступа к именам полей, а только к значениям. К примеру, эмуляция работы PDO::FETCH_COLUMN :

    PDO::FETCH_NAMED

    Почти то же самое, что PDO::FETCH_ASSOC , но с одним отличием. Много раз я встречал на форумах вопросы о том, как получить значения полей с одинаковыми именами из разных таблиц при джойне. Всегда ответ был один — писать алиасы руками в запросе или использовать цифровые индексы. А вот и ответ от PDO: получение данных в этом режиме аналогично PDO::FETCH_ASSOC , но если встречаются поля с одинаковыми именами, то все значения по очереди записываются во вложенный массив. Допустим, у нас есть таблицы users и companies, причем в обеих есть поле name. Если получать данные традиционным путём, то одно из полей будет съедено:

    Если же указать это флаг, то все значения колонок с совпадающими именами будут собраны во вложенном массиве в порядке поступления:

    PDO::FETCH_BOUND

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

    Материал подготовлен на основе официальной статьи .

    Mysql_fetch_object

    Php функции


    Php скрипты


    mysql_fetch_object

    (PHP 3, PHP 4, PHP 5)

    mysql_fetch_object — Обрабатывает ряд результата запроса и возвращает объект

    Описание

    object mysql_fetch_object ( resource result )

    Возвращает объект со свойствами, соответствующими колонкам в обработанном ряду или FALSE, если рядов больше нет.

    mysql_fetch_object() работает аналогично mysql_fetch_array(), с единственным отличием — функция возвращает объект, вместо массива. Это, кроме всего прочего, означает, что вы сможете работать с полями только по имени колонок. Числа не могут быть свойствами объекта.

    Замечание: Имена полей, возвращаемые этой функцией, регистро-зависимы .

    /* корректно */
    echo $row -> field ;
    /* не корректно */
    echo $row -> 0 ;

    В плане скорости эта функция аналогична mysql_fetch_array() и почти также быстра, как mysql_fetch_row() (разница незначительна).

    Пример 1. Пример использования mysql_fetch_object()

    mysql_connect ( «hostname» , «user» , «password» );
    mysql_select_db ( «mydb» );
    $res ult = mysql_query ( «select * from mytable» );
    while ( $row = mysql_fetch_object ( $res ult )) <
    echo $row -> user_id ;
    echo $row -> fullname ;
    >
    mysql_free_result ( $res ult );
    ?>

    User Contributed Notes

    This method offers a nice way to fetch objects from databases. As Federico at Pomi dot net mentioned it doesn’t work native as the type of the object fetched isn’t the right one, but with a small typecast it works flawlessly.

    function >$obj , $class_type ) <
    if ( >$class_type )) <
    $obj = unserialize( preg_replace («/ˆO: [ 0-9 ] +:\\» [ ˆ\» ] +\\»:/i»,
    «O:». strlen ( $class_type ).»:\\»». $class_type .»\\»:», serialize ( $obj )));
    >
    >

    class Foo
    <
    var $foo ;
    var $bar ;
    function get_from_db()
    <
    mysql_connect();
    mysql_select_db();
    $res = mysql_query(«SELECT foo,bar from my_table»);

    $fetched_object = mysql_fetch_object( $res );
    >$fetched_object ,»Foo»);
    $this = $fetched_object ;
    >
    >
    ?>

    backglancer at hotmail
    07-Aug-2005 02:07

    Watch out for mysql_fetch_object() to return all values as strings.
    if you try to do

    $p = mysql_fetch_object ( $some_sql );
    // and then try to do something like

    $money = $p -> dollars + $p -> cents ;
    ?>

    You may experience «Unsupported operand types»

    so always cast them both as ( int ) ‘s!!
    q
    09-Jul-2004 06:31

    Some clarifications about previous notes concerning duplicate field names in a result set.

    Consider the following relations:

    TABLE_A(id, name)
    TABLE_B(id, name, id_A)

    Where TABLE_B.id_A references TABLE_A.id.

    Now, if we join these tables like this: «SELECT * FROM TABLE_A, TABLE_B WHERE TABLE_A. >
    The behaviour of mysql_fetch_object on a result like this isn’t documented here, but it seems obvious that some data will be lost because of the duplicate field names.

    This can be avoided, as Eskil Kvalnes stated, by aliasing the field names. However, it is not necessary to alias all fields on a large table, as the following syntax is legal in MySQL: «SELECT *, TABLE_A.name AS name_a, TABLE_B.name AS name_b FROM TABLE_A, TABLE_B . «. This will produce a result set formatted like this: (id, name, id, name, id_A, name_a, name_b), and your data is saved. Hooray!

    -q
    rcoles at hotmail dot com
    16-Oct-2003 01:11

    In reviewing Eskil Kvalnes’s comments (04-Mar-2003 11:59
    When using table joins in a query you obviously need to name all the fields to make it work right with mysql_fetch_object()) I was left asking and, as a newbie, the reason why I’m here. I have a 28 field table. Ran SELECT * with a LEFT JOIN, etc and it appears to have worked on my test server without issue.

    On further reading, MYSQL.COM has the following:
    * It is not allowed to use a column alias in a WHERE clause, because the column value may not yet be determined when the WHERE clause is executed. See section A.5.4 Problems with alias.
    * The FROM table_references clause indicates the tables from which to retrieve rows. If you name more than one table, you are performing a join. For information on join syntax, see section 6.4.1.1 JOIN Syntax. For each table specified, you may optionally specify an alias.

    Aware of the fact there’s a difference between tables and fields there appears to be confusion here somewhere.
    zhundiak at comcast dot net
    16-May-2003 05:44

    /* Explode the array and set the objects’s instance data */
    foreach ( $row as $key => $value )
    <
    $obj -> < $key >= $value ;
    >
    return $obj ;
    >
    class CPerson
    <
    function getFullName()
    <
    return $this ->fname . ‘ ‘ . $this ->lname;
    >
    >
    $set = mysql_query(‘SELECT fname,lname FROM person’);
    while ( $p erson =& db_fetch_object( $set ,’CPerson’))
    <
    echo $p erson ->getFullName();
    >
    Eskil Kvalnes
    04-Mar-2003 09:59

    When using table joins in a query you obviously need to name all the fields to make it work right with mysql_fetch_object().
    kalleanka
    31-Jan-2003 02:50

    an addition to the previous.

    for example getting members from a database:

    function getAllMembers () <
    $query = «SELECT * FROM people ORDER BY lname»;
    $res ult = mysql_query( $query );

    while ( $member = mysql_fetch_object( $res ult )) <
    $member s [ ] = $member ;
    >

    return $member s ;
    >

    DON’T FORGET TO DECLARE THE ARRAY. If you try to cycle through members after the function has been called and you don’t declare the array first you will get a horribly (HORRIBLY!) ugly error in your page. Also, if you try to add the object into the members array ins >while condition instead of in the while loop, you will generate one extra empty space in the array due to the last iteration/check.
    spamme at aol dot com
    16-Jan-2003 11:28

    This is probably a little more elegant:

    $sql = «SELECT * FROM table «;
    $res ult = mysql_query( $sql );

    while ( $row = mysql_fetch_object( $res ult ))
    $data [ ] = $row ;
    allen at brooker dot gb dot net
    19-Nov-2002 03:14

    I found the above code to be buggy, not adding all the records to the array. This is the code I used instead:

    $command = «SELECT * FROM table «;
    $res ult = mysql_query( $command , $link_id );
    $num = mysql_num_rows( $res ult );

    for ( $i = 0; $i $num ; $i ++) <
    $clickthru [ $i ] = array ();
    $clickthru [ $i ] = mysql_fetch_array( $res ult );
    >

    Allen
    Federico at Pomi dot net
    15-Sep-2002 06:41

    Be carefull:
    the object returned will be a new /fresh object.

    You can’t use this function to replace some attributes of an existing object keeping the old ones.

    Example:
    class person
    <
    var $name ;
    var $surname ;
    var $doh ;

    function print ()
    <
    print ( $name .» «. $surname );
    >

    function get_from_db()
    <
    $res =query(«select name, surname from ppl where. limit 1»);
    $this =mysql-fetch-object( $res );
    >

    This won’t work! When the method get_from_db() is executed, your old object will be destroyed. you won’t find anything in the attribute $doh , and if you’ll try to call the method print (), it will say it doesn’t exist.
    amackenz at cs dot uml dot edu
    15-Jan-2001 10:03

    When selecting with a count /sum, the field must be named.

    select count (*) from users;
    becomes
    select count (*) as total from users;

    This way the result can be referenced as:
    $row ->total;

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

    php mysql assoc (8)

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

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

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

    Если вы хотите получить столбец на основе его имени, в какой-то переменной вам нужно будет начать использовать свойства переменной $row-> <$column_name>, а синтаксис массива $row[$column_name]

    Конструкторы не вызываются, если вы можете ожидать, если вы укажете имя класса.

    Если вы не укажете имя класса, вы получите stdClass , который вряд ли лучше, чем массив.

    mysql_fetch_assoc — самый простой из трех, с которым нужно работать, и мне нравится различие, которое это дает в коде между объектами и строками результатов базы данных .

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

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

    Answer #1

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

    Answer #2

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

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

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

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

    Answer #3

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

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

    Answer #4

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

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

    Answer #5

    По производительности не имеет значения, что вы используете. Разница в том, что mysql_fetch_object возвращает объект:

    mysql_fetch_assoc () возвращает ассоциативный массив:

    и mysql_fetch_array () возвращает массив:

    Answer #6

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

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

    Answer #7

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

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

    Илон Маск рекомендует:  Шаблон сайта черного тона HTML, CSS, 1 страница
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL