Mysqli fetch assoc что это

от admin

PHP mysqli_fetch_assoc() Function

A PHP result object (of the class mysqli_result) represents the MySQL result, returned by the SELECT or, DESCRIBE or, EXPLAIN queries.

The mysqli_fetch_assoc() function accepts a result object as a parameter and, retrieves the contents of current row in the given result object, and returns them as an associative array.

Syntax

Parameters

result(Mandatory)

This is an identifier representing a result object.

Return Values

The PHP mysqli_fetch_assoc() function returns an associative array which contains the current row of the result object. This function returns NULL if there are no more rows.

PHP Version

This function was first introduced in PHP Version 5 and works works in all the later versions.

Example

Following example demonstrates the usage of the mysqli_fetch_assoc() function (in procedural style) −

This will produce following result −

Example

In object oriented style the syntax of this function is $result->fetch_assoc(); Following is the example of this function in object oriented style $minus;

Fetch_assoc

In this article, we will focus on the mysqli_fetch_assoc() function in PHP, which is used to fetch a row from a MySQLi result set as an associative array. We will provide you with an overview of the function, how it works, and examples of its use.

Introduction to the mysqli_fetch_assoc() function

The mysqli_fetch_assoc() function is a built-in function in PHP that is used to fetch a row from a MySQLi result set as an associative array. This function is useful when you need to fetch a single row from a MySQLi query and store it in an array for further processing.

How to use the mysqli_fetch_assoc() function

Using the mysqli_fetch_assoc() function is very simple. You just need to call the function on a valid MySQLi result set. Here is an example:

In this example, we call the mysqli_connect() function to connect to a MySQL database with a username and password. We then execute a query using the mysqli_query() function with a WHERE clause to select a single row from the table. We store the result in a variable and check if there was a result using the $result variable. If there was a result, we call the mysqli_fetch_assoc() function to fetch a row from the result set as an associative array. We then output the values of two columns for the row.

Conclusion

In conclusion, the mysqli_fetch_assoc() function is a useful tool for fetching a single row from a MySQLi result set and storing it in an associative array for further processing. By understanding how to use the function, you can take advantage of this feature to create powerful and flexible MySQLi queries.

Как правильно использовать mysqli

Небольшой дисклеймер от переводчика: в РНР сложилась парадоксальная ситуация. Сам язык ушёл далеко вперёд, но изучают его по жутко устаревшим материалам. Собственно, постоянный кринж от кода на Тостере (как в вопросах, так и в ответах) и побудил к переводу данной статьи.

Кроме того, переводчик, также как и вы, считает, что PDO является более продвинутым API для работы с БД, чем mysqli. Но поскольку новички в подавляющем большинстве всё равно начинают с mysqli, то нужен хотя бы один нормальный материал по этому расширению. Не можешь противостоять — возглавь!

Не говоря уже о том, что в последнее время mysqli была сильно улучшена, и из совершенно неюзабельной превратилась в довольно сносную библиотеку, в которой из принципиальных отличий от PDO осталось разве что отсутствие именованных плейсхолдеров. Так что даже (особенно) если вы учили РНР 20 лет назад и всё знаете вдоль и поперёк, то всё равно сможете найти для себя что-то новое.

Соединение

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

Если ваш код является обычным процедурным РНР, то вот простой пример соединения:

Полное объяснение всех этих команд приводится в отдельной статье, Как правильно соединяться с mysqli (en), а здесь я приведу только ключевые моменты

  • устанавливая правильный режим информирования об ошибках, мы избавляемся от непонятных ошибок типа mysqli_fetch_assoc() expects parameter. / Call to a member function bind_param(). , получая вместо них актуальные сообщения об ошибках от MySQL.
    • кроме того, режим исключений значительно упростит код, в котором не нужно будет писать проверку успешности выполнения каждой функции

    Объектный и процедурный интерфейсы

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

    Единственное различие заключается в том, что для объектного синтаксиса мы берём параметр функции (например $mysqli ), добавляем объектный оператор ( -> ) и дальше пишем собственно имя метода, выкидывая избыточное «mysqli_». Отдельно отмечу, что вам не нужно знать ООП чтобы использовать объектный синтаксис: это просто другой способ вызвать ту же самую функцию.

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

    Учитывая, что объектный синтаксис является более коротким, без постоянных повторений (ср. mysqli_stmt_get_result($stmt) и $stmt->get_result() ) я настоятельно рекомендую именно его, так что именно объектный синтаксис будет использоваться в этом руководстве.

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

    Одной из основных причин, по которым старое расширение mysql было удалено из PHP, является отсутствие поддержки подготовленных выражений, то есть переменные PHP без вариантов должны были добавляться напрямую в SQL. Но нет ни малейшей причины продолжать эту опасную практику с mysqli. Другими словами, теперь вы должны использовать подготовленные запросы, что означает полное переписывание каждой операции с БД.

    Почему надо использовать подготовленные запросы? По той простой причине, что если мы добавляем данные прямо в запрос, то они могут повредить его. При этом последствия варьируются от синтаксических ошибок до SQL инъекций. В отличие от печально известного «экранирования», которое работает только для строк, и которое легко можно забыть, использовать неправильно или посчитать ненужным, подготовленные запросы позволяют нам сформулировать простую, но стопроцентно безопасную инструкцию из трёх шагов:

    1. Подготавливаем запрос, добавляя знаки вопроса, ? , там где раньше была переменная
    2. Привязываем сами переменные к этому подготовленному выражению, указывая для каждой её тип
    3. Выполняем запрос

    Вот простой пример запроса INSERT:

    Как можно видеть, тут нет ничего сложного, те самые три шага, описанные выше.

    Давайте рассмотрим подготовленный запрос подробнее, на примере запроса UPDATE:

    Что здесь происходит?

    Как это было описано выше, сначала мы заменяем все переменные запросе на вопросительные знаки.

    Дальше мы подготавливаем запрос. Идея тут очень остроумная: для того чтобы исключить даже теоретическую возможность инъекции, сам запрос и данные для него едут на сервер по отдельности. Именно это мы здесь и видим: вызов prepare() отправляет на сервер сначала сам запрос, без данных. При этом создаётся специальная переменная $stmt , содержащая экземпляр класса mysqli_statement и дальше мы будем работать именно с ней.

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

    • i для целых чисел;
    • d для чисел с плавающей запятой;
    • s для строк;
    • b для блобов.

    И теперь вы можете сказать, что запись «sssi» означает «у нас будет 3 переменных строкового типа и одна — целочисленного». Затем в функцию передаются все переменные, 4 штуки.

    И наконец, запрос выполняется. Переменные отправляются в БД и запрос выполняется.

    Кстати, начиная с PHP 8.1, bind_param можно не использовать, отправив вместо этого все переменные в execute() в виде массива:

    В этом случае все переменные будут переданы как строки.

    Чисто для комплекта, пример запроса DELETE, но я надеюсь, что вы уже уловили идею:

    Выполнение запросов SELECT через подготовленные выражения

    Точно так же как это было описано выше, мы подготавливаем запрос с вопросительными знаками, затем привязываем переменные и выполняем запрос. Однако для запросов SELECT нам понадобится один дополнительный шаг, получение переменной типа mysqli_result , которую можно будет использовать для выборки полученных строк:

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

    Получение результатов запроса

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

    Стандартным способом получения как одной, так и нескольких строк, будет обращение к одной из следующих функций:

      которая возвращает нумерованный массив; которая возвращает ассоциативный массив; которая возвращает объект.

    Получение одной строки

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

    Получение нескольких строк в цикле

    Что интересно, для получения нескольких строк служит та же самая функция, что и для получения одной строки. И всё благодаря одной маленькой детали: когда мы получаем строку с помощью одной из этих функций, внутренний указатель в возвращённом базой наборе строк перемещается на одну позицию, и поэтому следующее обращение к той же самой функции возвращает следующую строку — и так далее, пока строки не кончатся. Если строк больше нет, то функция fetch_* вернёт null , что позволит нам использовать цикл while для перебора всех строк:

    Здесь мы получили все полученные из БД строки в массив $users.

    Выполнение запросов без переменных

    Если запрос целиком прописан прямо в коде, то есть в нем не используются никакие переменные PHP, то для выполнения запроса можно воспользоваться функцией query() , которая сразу возвращает объект класса mysqli_result , и в результате мы получим гораздо более простой код, например

    Простая функция-хелпер

    Но не нужно завидовать, выполнение подготовленных запросов может быть таким же простым, благодаря крошечной функции-хелперу (en):

    Эта функция может быть добавлена в файл, в котором прописано соединение с БД и таким образом она будет доступна везде, где требуется mysqli, позволяя писать такие же аккуратные однострочники:

    Обработка ошибок

    Обработка ошибок в запросах является очень важной темой, но её реализация вас удивит: в общем случае ошибки mysqli никак обрабатывать не нужно! Несмотря на то, что написано в бесчисленных примерах и руководствах по РНР, как правило, вы не должны писать никакого кода, обрабатывающего ошибки в запросах. Это звучит очень непривычно, но на самом деле именно так и надо делать. Если подумать, то для большинства ошибок надо только сообщить об их возникновении. И mysqli/PHP отлично справляются с этим сами, никакой помощи с вашей стороны им для этого не требуется. Следовательно, вы и не должны писать код, который проверяет результат выполнения запроса — в случае ошибки mysqli сообщит о ней автоматически, благодаря функции mysqli_report() о которой шла речь выше. Таким образом, все ошибки взаимодействия с БД будут обрабатываться единообразно, точно так же, как и все остальные ошибки РНР, что естественно является очень удобным с точки зрения обработки, которую можно выполнять в одном месте, а не разбрасывать по коду отдельно для каждого запроса. Подробнее почитать про правильный подход к обработке ошибок можно в статье Обработка ошибок в PHP (en).

    В тех редких случаях, когда вам действительно надо обработать ошибку, то есть выполнить какое-то определённое действие в случае ошибки, а не просто сообщить о её появлении, запрос(ы) можно обернуть в try..catch .

    Количество строк, которые вернул запрос SELECT

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

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

    Но конечно же надо помнить, что код ни в коем случае не должен запрашивать из БД больше строк, чем требуется на одной странице. Это относится как к запросам, которые получают определенные строки из БД для последующей обработки, так и — в особенности — к запросам, которые служат только для получения количества строк. Во втором случае вместо запроса самих строк необходимо запросить только их количество, запросом SELECT count(*) . .

    Количество строк, затронутых при изменении данных

    В отличие от предыдущего, количество строк, затронутых запросами INSERT, UPDATE и DELETE может быть довольно полезным. Что интересно, в mysqli есть не одна, целых две возможности получить эту цифру.

    Одна из них — это привычное свойство affected_rows :

    Но есть еще одна, уникальная функция mysqli_info(), которая возвращает отдельно количество найденных и затронутых строк. Во всех других драйверах, включая PDO, вы можете получить либо то, либо другое, но не всё вместе. Хотя эта функция возвращает строку, её несложно распарсить, и получить аккуратный массив:

    mysql_fetch_assoc

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

    • mysqli_fetch_assoc()
    • PDOStatement::fetch(PDO::FETCH_ASSOC)

    Описание

    Возвращает ассоциативный массив, соответствующий полученному ряду и сдвигает вперёд внутренний указатель результата. Функция mysql_fetch_assoc() аналогична вызову функции mysql_fetch_array() со вторым необязательным параметром, равным MYSQL_ASSOC. Функция возвращает только ассоциативный массив.

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

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

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

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

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

    Примеры

    Пример #1 Расширенный пример использования mysql_fetch_assoc()

    $conn = mysql_connect ( «localhost» , «mysql_user» , «mysql_password» );

    if (! $conn ) <
    echo «Unable to connect to DB: » . mysql_error ();
    exit;
    >

    if (! mysql_select_db ( «mydbname» )) <
    echo «Unable to select mydbname: » . mysql_error ();
    exit;
    >

    $sql = «SELECT id as userid, fullname, userstatus
    FROM sometable
    WHERE userstatus = 1″ ;

    $result = mysql_query ( $sql );

    if (! $result ) <
    echo «Could not successfully run query ( $sql ) from DB: » . mysql_error ();
    exit;
    >

    if ( mysql_num_rows ( $result ) == 0 ) <
    echo «No rows found, nothing to print so am exiting» ;
    exit;
    >

    // До тех пор, пока в результате содержатся ряды, помещаем их в ассоциативный массив.
    // Замечание: если запрос возвращает только один ряд — нет нужды в цикле.
    // Замечание: если вы добавите extract($row); в начало цикла, вы сделаете
    // доступными переменные $userid, $fullname и $userstatus
    while ( $row = mysql_fetch_assoc ( $result )) <
    echo $row [ «userid» ];
    echo $row [ «fullname» ];
    echo $row [ «userstatus» ];
    >

    Примечания

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

    Важно отметить, что mysql_fetch_assoc() лишь незначительно медленнее, чем mysql_fetch_row() , но в то же время предоставляет важную дополнительную информацию.

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

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

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

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

    User Contributed Notes 15 notes

    It appears that you can’t have table.field names in the resulting array.
    Just use an alias if your results come up empty and you are using multi-table query’s:

    $res=mysql_query(«SELECT user.ID AS uID, order.ID AS oID FROM user, order WHERE ( order.userid=uID )»;
    while ($row=mysql_fetch_assoc($res)) <
    echo «<p>userid: $row[‘uID’], orderid: $row[‘oID’]</p>»;
    >

    Worth pointing out that the internal row pointer is incremented once the data is collected for the current row.

    This means that multiple calls will iterate through the row data, so you DONT need to mysql_data_seek(..) between calls.

    This is noted in the mysql_fetch_row() docs, but not here!?

    Please be advised that the resource result that you pass to this function can be thought of as being passed by reference because a resource is simply a pointer to a memory location.

    Because of this, you can not loop through a resource result twice in the same script before resetting the pointer back to the start position.

    // Assume We Already Queried Our Database.

    // Loop Through Result Set.

    while( $queryContent = mysql_fetch_row ( $queryResult ) <

    echo $queryContent [ 0 ];
    >

    // We looped through the resource result already so the
    // the pointer is no longer pointing at any rows.

    // If we decide to loop through the same resource result
    // again, the function will always return false because it
    // will assume there are no more rows.

    // So the following code, if executed after the previous code
    // segment will not work.

    while( $queryContent = mysql_fetch_row ( $queryResult ) <

    echo $queryContent [ 0 ];
    >

    // Because $queryContent is now equal to FALSE, the loop
    // will not be entered.

    The only solution to this is to reset the pointer to make it point at the first row again before the second code segment, so now the complete code will look as follows:

    // Assume We Already Queried Our Database.

    // Loop Through Result Set.

    while( $queryContent = mysql_fetch_row ( $queryResult ) <

    echo $queryContent [ 0 ];
    >

    // Reset Our Pointer.

    while( $queryContent = mysql_fetch_row ( $queryResult ) <

    echo $queryContent [ 0 ];
    >

    Of course you would have to do extra checks to make sure that the number of rows in the result is not 0 or else mysql_data_seek itself will return false and an error will be raised.

    Also please note that this applies to all functions that fetch result sets, including mysql_fetch_row, mysql_fetch_assos, and mysql_fetch_array.

    Thanks to to R. Bradley for the implode idea. The following fixes a few bugs and includes quote_smart functionality (and has been tested)

    <?php
    function mysql_insert_assoc ( $my_table , $my_array ) <

    //
    // Insert values into a MySQL database
    // Includes quote_smart code to foil SQL Injection
    //
    // A call to this function of:
    //
    // $val1 = «foobar»;
    // $val2 = 495;
    // mysql_insert_assoc(«tablename», array(col1=>$val1, col2=>$val2, col3=>»val3″, col4=>720, col5=>834.987));
    //
    // Sends the following query:
    // INSERT INTO ‘tablename’ (col1, col2, col3, col4, col5) values (‘foobar’, 495, ‘val3’, 720, 834.987)
    //

    // Find all the keys (column names) from the array $my_array
    $columns = array_keys ( $my_array );

    // Find all the values from the array $my_array
    $values = array_values ( $my_array );

    // quote_smart the values
    $values_number = count ( $values );
    for ( $i = 0 ; $i < $values_number ; $i ++)
    <
    $value = $values [ $i ];
    if ( get_magic_quotes_gpc ()) < $value = stripslashes ( $value ); >
    if (! is_numeric ( $value )) < $value = "'" . mysql_real_escape_string ( $value , $db_link ) . "'" ; >
    $values [ $i ] = $value ;
    >

    // Compose the query
    $sql = «INSERT INTO $my_table » ;

    // create comma-separated string of column names, enclosed in parentheses
    $sql .= «(» . implode ( «, » , $columns ) . «)» ;
    $sql .= » values » ;

    // create comma-separated string of values, enclosed in parentheses
    $sql .= «(» . implode ( «, » , $values ) . «)» ;

    $result = @ mysql_query ( $sql ) OR die ( «<br />\n<span style=\»color:red\»>Query: $sql UNsuccessful :</span> » . mysql_error () . «\n<br />» );

    Читать:
    Как сделать чтобы 1с выключалась при

Похожие статьи