Перейти к содержимому

Сервис обмена электронных валют


Не выводится текст через оператор printf

#1 Kuchuluk

Kuchuluk
  • Пользователь
  • 315 сообщений
  • Репутация: 5
0

Отправлено 16 Январь 2012 - 21:21

Изображение

Люди посмотрите пожалуйста код. Вроде ошибок не выдает, но и текст, который должен выводиться, не выводится, а просто пусто.

 

 

  • 0

#2 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 17 Январь 2012 - 13:18

Код можно было запостить, чтобы не писать его с нуля... хотя... такой код нужно действительно переписывать... Ошибок 2:
1) здесь: $myrow["$id"] - знака доллара в ключе быть не должно. Правильно так: $myrow['id']. Для title, соответственно, аналогично.
2) глобальная ошибка: if{код}... а условие куда делось? Так нужно: if(условие){код}
Странно, что PHP ошибок не выдает с таким кодом... скорее всего, показ ошибок попросту отключен.
Ну и сам запрос и цикл лучше организовать так:
$query = "SELECT title, id FROM lessons";
$res = mysql_query($query) or die(mysql_error());

while($row = mysql_fetch_assoc($res)){
echo "<p><a href='edit_lesson.php?id={$row['id']}'>{$row['title']}</a></p>";
}

Цикл do{} while() здесь абсолютно не нужен, почитайте в книжках, ради интереса, когда он используется.
  • 0


#3 Kuchuluk

Kuchuluk
    Topic Starter
  • Пользователь
  • 315 сообщений
  • Репутация: 5

Отправлено 17 Январь 2012 - 21:03

спасибо вам большое! исправил и как вы писали и заработало. но теперь возникает другая ошибка Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in Z:\home\localhost\www\phpsite\admin\edit_lesson.php on line 41. Т. е. список с названием уроков выходит, но когда нажимаю по нужному уроку, чтобы вывести из таблицы БД информацию по этому уроку, но выводится эта ошибка и форма с пустыми полями.
Изображение
  • 0

#4 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 17 Январь 2012 - 22:53

Пожалуйста. Только я же просил выкладывать код, а не скрин кода.

исправил и как вы писали и заработало

Неправда :blink: Опять-таки используете цикл do{}while()... забудьте про него и вспоминайте очень редко. Этот цикл может понадобится в 1 случае из 100. Ну и HEREDOC-синтаксис также рекомендовал бы использовать крайне редко.
Теперь по самой ошибке. Ошибка говорит, что в функцию mysql_fetch_array() попадает что угодно, но только не ресурс. В Вашем случае туда вообще ничего не попадает. Почему? Потому что в запросе идет обращение к переменной $id напрямую. На самом деле к этой переменной нужно обращаться через массив $_GET.
Так правильно:
<?php

$id = (int)$_GET['id']; // вот где ошибка... сначала нужно получить переменную из массива $_GET... при этом обязательно привести ее к ожидаемому типу

$query = "SELECT * FROM lessons WHERE id = $id";
$result = mysql_query($query) or die(mysql_error()); // не забываем проверять выполнен ли запрос

$myrow = mysql_fetch_assoc($result); // вместо mysql_fetch_array() лучше использовать mysql_fetch_assoc()... для работы ведь достаточно только ассоциативного массива, так зачем получать 2 массива вместо одного?

/* ну и дальше уже работайте с полученными данными*/

?>

  • 0


#5 Kuchuluk

Kuchuluk
    Topic Starter
  • Пользователь
  • 315 сообщений
  • Репутация: 5

Отправлено 18 Январь 2012 - 16:05

так если не использовать цикл do-while и функцию HEREDOC, чем их можно заменить?
  • 0

#6 HapkomaH

HapkomaH
  • Пользователь
  • 38 сообщений
  • Репутация: 2

Отправлено 18 Январь 2012 - 17:13

Вместо
$myrow=mysql_fetch_array($result);
do{
// что-то
}
while ($myrow=mysql_fetch_array($result));

используйте
while ($myrow=mysql_fetch_assoc($result)){
// что-то
}

Результат тот же, кода меньше. То, что вы использовали, было популярно лет 10 назад среди начинающих программистов :blink: Вместо HEREDOC можете использовать внедренный html-код или обычный echo. Опять же тот же результат.
  • 0

#7 Kuchuluk

Kuchuluk
    Topic Starter
  • Пользователь
  • 315 сообщений
  • Репутация: 5

Отправлено 22 Январь 2012 - 21:12

HapkomaH, matroskin8, посмотрите пожалуйста еще раз. теперь вроде все правильно написал, но опять не выводится нужный текст, а просто путое место там, где он должен выводиться.

<?php $id = (int)$_GET['id'];$result2 = mysql_query("SELECT * FROM categories",$db);if (!$result2){echo "<p>Запрос на выборку из базы не прошел. Напишите об этом администратору admin@havebook.ru <br> <strong>Код ошибки:</strong></p>";exit (mysql_error());}if (mysql_num_rows($result2) > 0){$myrow2 = mysql_fetch_array($result2);while ($myrow2 = mysql_fetch_array($result2));{ printf ("<p><a class='nav_link' href='view_cat.php?cat=%s'>%s</a></p>", $myrow2["id"], $myrow2["title"]);}}else{echo "<p>Информация по запросу не может быть извлечена, в таблице нет записей.</p>";exit();}?>

  • 0

#8 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 22 Январь 2012 - 22:25

Строка $myrow2 = mysql_fetch_array($result2); вне цикла не нужна. Мало того, она даже вредна в контексте Вашего кода.
После условия цикла точка с запятой не нужна: while ($myrow2 = mysql_fetch_array($result2)); - именно из-за нее ничего и не выводится.
Где-то так должно быть:
if (mysql_num_rows($result2) > 0){
while ($myrow2 = mysql_fetch_assoc($result2)){
printf ("<p><a class='nav_link' href='view_cat.php?cat=%s'>%s</a></p>", $myrow2["id"], $myrow2["title"]);
}
}else{
echo "<p>Информация по запросу не может быть извлечена, в таблице нет записей.</p>";
exit();
}

  • 0


#9 Kuchuluk

Kuchuluk
    Topic Starter
  • Пользователь
  • 315 сообщений
  • Репутация: 5

Отправлено 23 Январь 2012 - 17:56

matroskin8, спасибо большое за содействие) А можешь объяснить почему не нужно использовать команду $myrow2 = mysql_fetch_array($result2); ... она же выводит значения из базы в массив.
  • 0

#10 yury

yury
  • Пользователь
  • 629 сообщений
  • Репутация: 176

Отправлено 23 Январь 2012 - 22:02

matroskin8, спасибо большое за содействие) А можешь объяснить почему не нужно использовать команду $myrow2 = mysql_fetch_array($result2); ... она же выводит значения из базы в массив.

Kuchuluk,
команду $myrow2 = mysql_fetch_array($result2); использовать нужно, но в правильном месте.
Она считывает _одну_строку_ из таблицы базы данных в переменную $myrow2 (ну в добавок команда mysql_fetch_array считанную строку еще и оформляет ввиде ассоциативного и численного массивов).

Вообще цикл
while ($row = mysql_fetch_array($result)){ 
...
}
означает примерно следующее (и, кстати, буквально так и переводится на русский язык с английского):
Пока можно считать в переменную $row (по-русски "строка") строку из таблицы базы данных (т.е. выполнить команду $row = mysql_fetch_array($result)), делаем это в цикле и выполняем с прочитанными строками действия, указанные в теле цикла. А как только прочитать очередную строку не получится (т.е. попытка положить в очередной раз в переменную $row строку из БД завершится неудачей, что на практике означает, что мы добрались до конца таблицы) цикл пора завершать.

Поэтому, чтобы обработать всю таблицу, при этом не забывая проверять не закончилась ли наша таблица, эту команду надо выполнять в цикле, а не за его пределами.
  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru