While row mysql fetch array result

While row mysql fetch array result

Я пытаюсь выбрать данные из таблицы 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() для дополнительной информации.

Читайте также:  Адаптеры на чипсете mt7601

Фактическая ошибка заключалась в одинарных кавычках, так что переменная $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:

for this action:

is this doing 1 loop (iterated x times)?

and for this one:

is this doing 2 loops (iterated x times)?

where x is the number of results

ok thanks guys, ok I basically phrased this question really, really badly.

in retrospect it should have been

‘does mysql_fetch_array() only return one row each time it is called’

I an now happy that my understanding of mysql_fetch_array() was v. incorrect!

thanks for your time!

7 Answers 7

I’m assuming mysql_fetch_array() perfroms a loop, so I’m interested in if using a while() in conjunction with it, if it saves a nested loop.

No. mysql_fetch_array just returns the next row of the result and advances the internal pointer. It doesn’t loop. (Internally it may or may not use some loop somewhere, but that’s irrelevant.)

This does the following:

  1. mysql_fetch_array retrieves and returns the next row
  2. the row is assigned to $row
  3. the expression is evaluated and if it evaluates to true , the contents of the loop are executed
  4. the procedure begins anew

This does the following:

  1. mysql_fetch_array retrieves and returns the next row
  2. the row is assigned to $row
  3. foreach loops over the contents of the array and executes the contents of the loop as many times as there are items in the array

In both cases mysql_fetch_array does exactly the same thing. You have only as many loops as you write. Both constructs do not do the same thing though. The second will only act on one row of the result, while the first will loop over all rows.

mysqli_result::fetch_array — mysqli_fetch_array — Выбирает одну строку из результирующего набора и помещает ее в ассоциативный массив, обычный массив или в оба

Описание

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

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

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

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

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

Читайте также:  Как настроить avast free antivirus

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

Только для процедурного стиля: Идентификатор результата запроса, полученный с помощью mysqli_query() , mysqli_store_result() или mysqli_use_result() .

Этот необязательный параметр принимает значение константы, которая указывает на тип массива, в который требуется поместить данные. Возможные значения параметра: MYSQLI_ASSOC , MYSQLI_NUM или MYSQLI_BOTH .

При использовании константы MYSQLI_ASSOC функция будет вести себя идентично mysqli_fetch_assoc() , а при MYSQLI_NUM идентично функции mysqli_fetch_row() . При задании MYSQLI_BOTH функция создаст один массив, включающий атрибуты обоих вариантов.

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

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

Примеры

Пример #1 Объектно-ориентированный стиль

= new mysqli ( "localhost" , "my_user" , "my_password" , "world" );

/* проверка подключения */
if ( $mysqli -> connect_errno ) <
printf ( "Не удалось подключиться: %s
" , $mysqli -> connect_error );
exit();
>

$query = "SELECT Name, CountryCode FROM City ORDER by ID LIMIT 3" ;
$result = $mysqli -> query ( $query );

/* обычный массив */
$row = $result -> fetch_array ( MYSQLI_NUM );
printf ( "%s (%s)
" , $row [ 0 ], $row [ 1 ]);

/* ассоциативный массив */
$row = $result -> fetch_array ( MYSQLI_ASSOC );
printf ( "%s (%s)
" , $row [ "Name" ], $row [ "CountryCode" ]);

/* ассоциативный и обычный массивы */
$row = $result -> fetch_array ( MYSQLI_BOTH );
printf ( "%s (%s)
" , $row [ 0 ], $row [ "CountryCode" ]);

/* очищаем результаты выборки */
$result -> free ();

/* закрываем подключение */
$mysqli -> close ();
?>

Пример #2 Процедурный стиль

= mysqli_connect ( "localhost" , "my_user" , "my_password" , "world" );

/* проверка подключения */
if ( mysqli_connect_errno ()) <
printf ( "Не удалось подключиться: %s
" , mysqli_connect_error ());
exit();
>

$query = "SELECT Name, CountryCode FROM City ORDER by ID LIMIT 3" ;
$result = mysqli_query ( $link , $query );

/* обычный массив */
$row = mysqli_fetch_array ( $result , MYSQLI_NUM );
printf ( "%s (%s)
" , $row [ 0 ], $row [ 1 ]);

/* ассоциативный массив */
$row = mysqli_fetch_array ( $result , MYSQLI_ASSOC );
printf ( "%s (%s)
" , $row [ "Name" ], $row [ "CountryCode" ]);

/* ассоциативный и обычный массивы */
$row = mysqli_fetch_array ( $result , MYSQLI_BOTH );
printf ( "%s (%s)
" , $row [ 0 ], $row [ "CountryCode" ]);

/* очищаем результаты выборки */
mysqli_free_result ( $result );

/* закрываем подключение */
mysqli_close ( $link );
?>

Результат выполнения данных примеров:

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

  • mysqli_fetch_assoc() — Извлекает результирующий ряд в виде ассоциативного массива
  • mysqli_fetch_row() — Получение строки результирующей таблицы в виде массива
  • mysqli_fetch_object() — Возвращает текущую строку результирующего набора в виде объекта
  • mysqli_query() — Выполняет запрос к базе данных
  • mysqli_data_seek() — Перемещает указатель результата на выбранную строку

User Contributed Notes 4 notes

Putting multiple rows into an array:

= new mysqli ( "localhost" , "my_user" , "my_password" , "world" );

/* check connection */
if ( mysqli_connect_errno ()) <
printf ( "Connect failed: %s
" , mysqli_connect_error ());
exit();
>

$query = "SELECT Name, CountryCode FROM City ORDER by ID LIMIT 3" ;
$result = $mysqli -> query ( $query );

while( $row = $result -> fetch_array ())
<
$rows [] = $row ;
>

foreach( $rows as $row )
<
echo $row [ ‘CountryCode’ ];
>

/* free result set */
$result -> close ();

/* close connection */
$mysqli -> close ();
?>

Читайте также:  Dexp ixion xl150 обзор

Note that the array returned contains only strings.

E.g. when a MySQL field is an INT you may expect the field to be returned as an integer, however all fields are simply returned as strings.

What this means: use double-equals not triple equals when comparing numbers.

print $array_from_mysqli_fetch_array [ ‘id’ ] == 1 ? "true" : "false" ; // true
print $array_from_mysqli_fetch_array [ ‘id’ ] === 1 ? "true" : "false" ; // false
?>

Please note that under PHP 5.x there appears to be a globally defined variable MYSQL_ASSOC, MYSQL_NUM, or MYSQL_BOTH which is the equivalent of MYSQLI_ASSOC, MYSQLI_NUM, or MYSQLI_BOTH. Yet under PHP 7.x this is NOT the case and will cause a failure in trying to retrieve the result set!

This can cause severe headaches when trying to find out why you are getting the error:
— mysqli_result::fetch_array() expects parameter 1 to be integer, string given in ‘Filename’ on line ‘XX’

Here is a function to return an associative array with multiple columns as keys to the array.

This is a rough approximation of the perl DBI->fetchall_hashref function — something I find myself using quite a bit.

Given a simple mySQL table:

mysql> select * from city;
+—————-+—————-+——————+————+
| country | region | city | hemisphere |
+—————-+—————-+——————+————+
| South Africa | KwaZulu-Natal | Durban | South |
| South Africa | Gauteng | Johannesburg | South |
| South Africa | Gauteng | Tshwane | South |
| South Africa | KwaZulu-Natal | Pietermaritzburg | South |
| United Kingdom | Greater London | City of London | North |
| United Kingdom | Greater London | Wimbledon | North |
| United Kingdom | Lancashire | Liverpool | North |
| United Kingdom | Lancashire | Manchester | North |
+—————-+—————-+——————+————+

*Note* — this is a simple function that makes no attempt to keep multiple values per key, so you need to specify all the unique keys you require.

= mysqli_connect ( "localhost" , "username" , "password" , "test" );
$result = mysqli_query ( $link , "select * from city" );
$results_arr = fetch_all_assoc ( $result ,array( ‘hemisphere’ , ‘country’ , ‘region’ , ‘city’ ));

function fetch_all_assoc (& $result , $index_keys ) <

// Args : $result = mysqli result variable (passed as reference to allow a free() at the end
// $indexkeys = array of columns to index on
// Returns : associative array indexed by the keys array

$assoc = array(); // The array we’re going to be returning

while ( $row = mysqli_fetch_array ( $result , MYSQLI_ASSOC )) <

$pointer = & $assoc ; // Start the pointer off at the base of the array

for ( $i = 0 ; $i count ( $index_keys ); $i ++) <

$key_name = $index_keys [ $i ];
if (!isset( $row [ $key_name ])) <
print "Error: Key $key_name is not present in the results output.
" ;
return( false );
>

$key_val = isset( $row [ $key_name ]) ? $row [ $key_name ] : "" ;

if (!isset( $pointer [ $key_val ])) <

$pointer [ $key_val ] = "" ; // Start a new node
$pointer = & $pointer [ $key_val ]; // Move the pointer on to the new node
>
else <
$pointer = & $pointer [ $key_val ]; // Already exists, move the pointer on to the new node
>

// At this point, $pointer should be at the furthest point on the tree of keys
// Now we can go through all the columns and place their values on the tree
// For ease of use, include the index keys and their values at this point too

foreach ( $row as $key => $val ) <
$pointer [ $key ] = $val ;
>

/* free result set */
$result -> close ();

Ссылка на основную публикацию
Adblock detector