[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Ошибка в функции mysql_fetch_array
lovetolaugh
Доброго времени суток! Возникает следующая ошибка, которая судя по всему относится к функции mysql_fetch_array:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in Z:\home\localhost\www\410.php on line 20

Читал на других форумах - говорят ошибка связана с тем, что в mysql_query() не обрабатываются возможные ошибки... Но конкртного решения нигде не нашел. Только-только начал изучать PHP, поэтому прошу - конкретный ответ.
Вот часть кода, с которой связана ошибка.

$result = mysql_query("select * from students where group = '{$dano}'");
while ($row = mysql_fetch_array($result, MYSQL_BOTH)) {
printf("здесь что-то выводится");}




Спустя 5 минут, 16 секунд (4.06.2011 - 17:36) m4a1fox написал(а):
lovetolaugh
mysql_fetch_assoc а не mysql_fetch_array это во первых

Спустя 1 минута, 43 секунды (4.06.2011 - 17:37) m4a1fox написал(а):
И откуда вот это MYSQL_BOTH?

Спустя 44 секунды (4.06.2011 - 17:38) lovetolaugh написал(а):
m4a1fox

Это было написано в примере.

Спустя 29 секунд (4.06.2011 - 17:39) alex12060 написал(а):
m4a1fox

http://php.net/manual/en/function.mysql-fetch-array.php

И извинись перед ТС)

Спустя 30 секунд (4.06.2011 - 17:39) m4a1fox написал(а):
lovetolaugh
Попробуй без него!

Спустя 59 секунд (4.06.2011 - 17:40) m4a1fox написал(а):
alex12060
Ага круто.... Будем массив вынимать вместо строк.

Спустя 59 секунд (4.06.2011 - 17:41) alex12060 написал(а):
lovetolaugh


$result = mysql_query("select * from students where group = '".mysql_real_escape_string($dano)."'") or die(mysql_error());
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
print('Here is print <br />');
}

Спустя 21 секунда (4.06.2011 - 17:41) lovetolaugh написал(а):
m4a1fox

Пробовал - толку ноль. Самое противное - что ведь пример который у меня есть работает - и написано тоже самое!

Спустя 16 секунд (4.06.2011 - 17:42) Игорь_Vasinsky написал(а):
m4a1fox
mysql_fetch_array($result, MYSQL_BOTH);

всё у него верно, просто запрос ни чего не вернул, нужно сначала проверить если отдача из бд, я бы так сделал

error_reporting(E_ALL);
$result = mysql_query("select * from `students` WHERE `group` = '".$dano."'") or die(mysql_error());
if(mysql_num_rows($result))
{
//аргумент я бы опустил
while ($row = mysql_fetch_array($result))
{
printf("здесь что-то выводится");
}
}

else
echo "Здесь пусто";

Спустя 41 секунда (4.06.2011 - 17:42) alex12060 написал(а):
m4a1fox

Цитата
Будем массив вынимать вместо строк


Это как понимать? Здесь что-то криминальное?

Спустя 1 минута, 45 секунд (4.06.2011 - 17:44) lovetolaugh написал(а):
alex12060

Спасибо за ответ. Однако ж если пробовать твой вариант возникает такая ошибка, которая портит всю малину:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'group = 'П-408'' at line 1

P.S. П-408 - это группа, которую я ввожу в браузере//

Спустя 3 минуты, 5 секунд (4.06.2011 - 17:47) m4a1fox написал(а):
alex12060
Цитата
Прежде чем использовать функцию, стоит заглянуть в мануал, а не копипастить из первого попавшего источника. Дело в том, что функция mysql_fetch_array() возвращает два массива. Нумерованный и ассоциативный. А используется только один.
Для чего брать в одну руку ложку, а в другую вилку, если мы собираемся есть суп?
Если уж использовать её, то с подобающим флагом (MYSQL_ASSOC). А вообще тут уместнее mysql_fetch_assoc()

Спустя 1 минута (4.06.2011 - 17:48) lovetolaugh написал(а):
Игорь_Vasinsky

Спасибо за пример - он 2 раза вывел "здесь что-то выводится". Все верно - в БД есть только 2 записи, которые удовлетворяют заданному условию (номер группы).
И что это значит? БД откликается?

Спустя 15 секунд (4.06.2011 - 17:48) alex12060 написал(а):
lovetolaugh


$result = mysql_query("select * from `students` where `group` = '".mysql_real_escape_string($dano)."'") or die(mysql_error());
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
print('Here is print <br />');
}


И теперь опиши мне, что изминилось и будет тебе счастье, и я буду счастлив)

Спустя 1 минута, 5 секунд (4.06.2011 - 17:50) alex12060 написал(а):
m4a1fox

ДЯДЯ КОЛЯ СКАЗАЛ!!!

Цитата
Если уж использовать её, то с подобающим флагом (MYSQL_ASSOC). А вообще тут уместнее mysql_fetch_assoc()


Так а мы что и делаем?!
Эх ты, пирожок с капустой...

Спустя 1 минута, 11 секунд (4.06.2011 - 17:51) m4a1fox написал(а):
alex12060
А ты с картошкой! dry.gif

Спустя 2 минуты, 13 секунд (4.06.2011 - 17:53) Игорь_Vasinsky написал(а):
Цитата
И что это значит? БД откликается?

совершенно верно - БД вернула результат wink.gif

Спустя 1 минута, 29 секунд (4.06.2011 - 17:54) lovetolaugh написал(а):
alex12060

Она 2 раза вывела Here is print alex12060
Спасибо! Теперь все работает! Только сейчас мелкий вопрос еще задам по выводу...

Спустя 4 минуты, 43 секунды (4.06.2011 - 17:59) lovetolaugh написал(а):
alex12060

В моем прошлом варианте в while мне необходимо было вывести из бд пару значений. Я это делал так:

while ($row = mysql_fetch_array($result, MYSQL_BOTH)) {
printf("ID: %s Name: %s", $row[0], $row[1]);
}


Одкако ж в твоем варианте, когда я прописываю

die(mysql_error());
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
printf("ID: %s Name: %s", $row[0], $row[1]);
}


Он выводит "ID: Name: ID: Name: ". Т.е. казалось бы правильно, но почему он не вставил вместо %s значения $row[] ...

Спустя 5 минут, 1 секунда (4.06.2011 - 18:04) inpost написал(а):
после выборки возвращается 2-х видов данные:
array -> $row[0], $row[1] , где цифра - порядок выборки.
и
assoc -> $row['name'],$row['val'] и т.д., где имя - это имя колонки, в которую были записаны данные.

Для того, чтобы не дублировать одни и те же данные, предлагают использовать assoc, но тогда ты уже не сможешь обращаться к ним как к $row[0],$row[1] !

И ещё, не используй printf smile.gif

Спустя 3 минуты, 18 секунд (4.06.2011 - 18:07) alex12060 написал(а):
lovetolaugh

Давай я тебе объясню, ну и еще кое-кому smile.gif

Смотри в чем здесь удивительная вещь состоит. Функция mysql_fetch_array как в математике, возводит число в квадрат. Что сие означает?

Функция mysql_fetch_array возвращает 2 массива, нумерованный и ассоциативный. Нумерованный массив, это когда ключи выглядят цифрами, а ассоциативный, это когда ключи выглядят как буквы.

Функция mysql_fetch_array может принимать 3 разных флага.
  • MYSQL_BOTH (по умолчанию)
  • MYSQL_NUM (нумерованный массив)
  • MYSQL_ASSOC (ассоциативный массив)

Я в своем примере поставил какой флаг? Если угадал, очень буду рад что пишу это не просто так.
Итак, как было выше сказано, чтобы не писать всю эту ерунду с флагами, используй функции-производные от этой (mysql_fetch_array)

Это функции:
  • mysql_fetch_assoc
  • mysql_fetch_row
  • mysql_fetch_object

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

Если ты угадал, по какому принципу выстроен порядок функций-производных, то ты молодец, идешь к успеху.

Советиую почитать тебе мануал по этим функциям и по массивам.

На бис скажу следующее - не используй printf() для вывода строк, эта функция для этого не предназначена!

Удачи...

Спустя 1 минута, 51 секунда (4.06.2011 - 18:09) inpost написал(а):
alex12060
О, как, постарался! Я не читал, но оформленно красиво! smile.gif

Спустя 3 минуты, 41 секунда (4.06.2011 - 18:13) lovetolaugh написал(а):
alex12060

Спасибо за подробное и, главное - доступное разъяснение. Теперь все более-менее ясно...

inpost

Благодарю - после того как заменил индексы выборки на имена - все стало выводить нормально.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.