[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Порядок вывода данных
Tenevoi
Здравствуйте. Я хочу написать форму и базу к тесту. Возникла проблема с порядком вывода вопросов и ответов.
Они у меня выводятся: сначала идут подряд все вопросы, а затем подряд все ответы, а должны то идти правильно: вопрос1 - ответы, вопрос2 - ответы....
Вопросы и ответы в разных таблицах и связаны через код вопроса. Если я их сведу в одну таблицу то порядок будет нормальный, НО количество ответов разное и иногда остаются пустые радиокнопки...В данном случае кнопок выводится столько, сколько и ответов...но порядок....Помогите.

PHP
<?php
$code_test 
= $_GET['code_test'];

 $resultat_1 = mysql_query ("SELECT question,code_quest FROM test_question WHERE code_test='$code_test'");
 $myrow = mysql_fetch_array ($resultat_1);

 $code_quest = $myrow['code_quest'];
 
 $resultat_2 
= mysql_query ("SELECT id,answer FROM test_answer WHERE code_test = '$code_test'");
 $myrow_2 = mysql_fetch_array ($resultat_2);

while ($myrow = mysql_fetch_array ($resultat_1))
do { printf("<p>%s</p>",$myrow["question"]);}

while ($myrow_2 = mysql_fetch_array ($resultat_2))
do { printf("<p><input name='id' type='radio' value='%s'><label> %s</label></p>", $myrow_2["id"],$myrow_2["answer"]);}




Спустя 6 часов, 47 минут, 46 секунд (16.06.2009 - 07:44) sergeiss написал(а):
Подсказка для самостоятельного размышления: используй в селекте ORDER BY с указанием нужного списка полей для сортировки, для получения нужного порядка

Спустя 4 часа, 47 минут, 47 секунд (16.06.2009 - 12:32) Tenevoi написал(а):
Не догоняю. У меня 2 таблицы.
Test_Questuion: id, question, code_quest
Test_Answer: id, answer, code_quest Сначала я вывожу в цикле вопросы, а потом ответы. Проблема в том что все чередуется не в том порядке(сначала идут подряд вопросЫ а потом ответЫ). Проблемы типа: к вопросу вывелись не те ответы - такой нет....Вся загвоздка в отображении. Я думаю должно быть так:
- выводить в цикле таблицу из 2х строк до тех пор пока есть вопросы
- в первой строке каждой таблицы должны быть вопросы
- во второй строке каждой таблицы должны быть ответы к вопросу (3-5шт.)
user posted image

Спустя 5 минут, 53 секунды (16.06.2009 - 12:38) glock18 написал(а):
1. Выбираешь вопросы.
2. Выбираешь ответы с упорядочиванием по id вопроса (ORDER BY).
3. В цикле выводишь вопросы. Внутри этого цикла выводишь ответы для соответствующего вопроса.

Спустя 9 минут, 40 секунд (16.06.2009 - 12:48) sergeiss написал(а):
Это всё лучше (да и проще) сделать одним запросом.
Но только сначала раздели задачу на две:
1. Получить данные.
Объедини 2 таблицы в одну посредством одного запроса. Получи таблицу с данными вида id, question, answer, code_quest, и отсортируй эти данные по номерам вопросов и ответов.
2. Вывод данных.
Просто "тупо" выведи данные, в цикле. Пока АйДи вопроса не меняется, выводим ответы. Как только АйДИ вопроса поменялся, выводим сначала вопрос, потом ответ, потом идем дальше по циклу.

Спустя 4 минуты, 26 секунд (16.06.2009 - 12:52) glock18 написал(а):
sergeiss, ну я подумал, что так человеку понятнее будет smile.gif Хотя и для выборки всего-всего запрос несложный. А вывод, дак и вправду, проще еще получается.

Спустя 21 минута (16.06.2009 - 13:13) Tenevoi написал(а):
Сделал одну таблицу: id, question,otv_1,otv_2,otv_3,otv_4,otv_5
В данном случае порядок в норме, но есть лишние радиокнопки
PHP
<form action="testing.phpmethod="post">
<?
php
$code_test 
$_GET['code_test'];
$result mysql_query ("SELECT id,question,otv_1,otv_2,otv_3,otv_4,otv_5 FROM quest_answ WHERE code_test='$code_test'"$db);
 
$myrow mysql_fetch_array ($result);
 
while (
$myrow mysql_fetch_array ($result))
do { 
printf ("
<p>%s</p>
<p><input name='id' type='radio' value='%s'><label> %s</label></p>
<p><input name='id' type='radio' value='%s'><label> %s</label></p>
<p><input name='id' type='radio' value='%s'><label> %s</label></p>
<p><input name='id' type='radio' value='%s'><label> %s</label></p>
<p><input name='id' type='radio' value='%s'><label> %s</label></p>"

$myrow['question'], 
$myrow['otv_1'], $myrow['otv_1'], 
$myrow['otv_2'], $myrow['otv_2'], 
$myrow['otv_3'], $myrow['otv_3'],
$myrow['otv_4'], $myrow['otv_4'], 
$myrow['otv_5'], $myrow['otv_5']);}
?>
<p><input name="Submit" type="submit" value=


value='%s' - подставляется $myrow['otv_Х'] я как понимаю это значит что если есть ответ то радокнопка выводится, а если его нет то и кнопки нет....НО кнопки все равно есть, даже если нет ответа=(

Спустя 11 минут, 30 секунд (16.06.2009 - 13:25) sergeiss написал(а):
Если количество ответов разное по разным вопросам, то см., что glock18 написал ранее.
Используем 2 таблицы.
Сначала делаем запрос по вопросам, а потом идем в цикле и делаем запрос по ответам каждого вопроса. По ходу дела выводим их.

Спустя 8 минут, 58 секунд (16.06.2009 - 13:34) glock18 написал(а):
1. Кнопки здесь в любом случае выводятся:
Цитата
<p><input name='id' type='radio' value='%s'><label> %s</label></p>

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

2. Это абсолютно не то что вам советовали, и именно по этой причине я вам давал несколько другой совет. Если все же следовать совету sergeiss, то

таблицы должны иметь ту же структуру, что имели. а именно:
1 таблица - вопросы.
1 таблица - ответы с id вопроса к которому относятся.

выбираете все это дело примерно таким запросом:

SQL
SELECT q.id, q.`text`, a.`text`, a.`id`
FROM `questions` q
JOIN `answers` a ON q.id = a.question_id
WHERE q.code_test = 12
ORDER BY q.id

здесь у вас получится дублирование текста вопроса для каждого ответа, от которого можно избавиться используя GROUP_CONCAT. Это не критично.

Далее в цикле выводите все это добро. Проверяя, изменился ли q.id с предыдущей итерации. Если изменился - это новый вопрос. Иначе - это ответ для последнего выведенного вопроса.

Спустя 47 секунд (16.06.2009 - 13:34) glock18 написал(а):
sergeiss smile.gif Однако biggrin.gif
Цитата
Если все же следовать совету sergeiss, то

Цитата
Если количество ответов разное по разным вопросам, то см., что glock18 написал ранее

Спустя 18 минут, 33 секунды (16.06.2009 - 13:53) Tenevoi написал(а):
Это так если я не ошибаюсь? Вышло 2 вопроса и у каждого 1 ответ...один и тот же...
PHP
$code_test $_GET['code_test'];

$result mysql_query ("SELECT id,question,code_quest FROM test_question WHERE code_test='$code_test'");
$myrow mysql_fetch_array ($result);
$id $myrow["id"];
$code_quest $myrow["code_quest"];

$result2 mysql_query ("SELECT id,answer FROM test_answer WHERE code_quest='$code_quest' ORDER BY id='$id'");
$myrow2 mysql_fetch_array ($result2);
 
do{ 
printf("<p>%s</p>
<p><input name='id' type='radio' value='%s'><label> %s</label></p>"
,
$myrow["question"],
$myrow2["id"],$myrow2["answer"]);}
while (
$myrow mysql_fetch_array ($result));

Спустя 31 минута, 22 секунды (16.06.2009 - 14:24) sergeiss написал(а):
Tenevoi...

Ну так, ЁПРСТ!!!!!!

Ты запрос ответов делай в цикле, и указывай в запросе полученный для данного вопроса идентификатор. А потом уже внутри делай еще один цикл для вывода ответов.

Спустя 25 минут, 30 секунд (16.06.2009 - 14:50) glock18 написал(а):
Tenevoi, чую я неладное. Вы учите php, позвольте полюбопытствовать, по Попову? Забудьте весь бред, который запомнили из его уроков.

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

2. По чему еще можно узнать Попова - идиотское использование do {} while.

Это если не вдаваться в логику скрипт, ибо она абсолютно ошибочна.

1 что вы должны сделать - выбрать все вопросы, и собрать из них массив.

PHP
$questions = array();
    
$query "SELECT id,question,code_quest FROM test_question WHERE code_test='$code_test'";
    
$result mysql_query ($query);
    while (
$row mysql_fetch_assoc($result))
    {
        
$questions[$row['code_quest']] = $row;
    }
    
    
$codeQuestRange implode(',',array_keys($questions));
    
$answers = array();
    
$query "SELECT id,answer,code_quest FROM test_answer WHERE code_quest IN ($codeQuestRange) ORDER BY code_quest";
    
$result mysql_query($query);
    while (
$row mysql_fetch_assoc($result))
    {
        
$answers[$row['code_quest']] = $row;
    }
print_r($questions);
print_r($answers);


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

PS: Возникает такое впечатление, что Попову бабло платят за то, чтобы все кто учатся по его курсам ничему не научились.

Спустя 40 минут, 47 секунд (16.06.2009 - 15:31) Tenevoi написал(а):
Большое спасибо за помошь!!!!!!!
Раз уж на то пошло то и я выскажусь. Я делаю диплом, основой которого (судя по теме) будет "субд" тестов, движок теста писать буду не я...А может и вообще ни кто. Врать не стану, учу по Попову. Но я думаю во всех моих муках виноват не только он. Спорить не стану, из за его проколов в уроках(пояснение к предыдущему уроку идет последующих, поэтому результат предыдущего урока не работает и т.д.) я потерял не мало времени. Но здесь есть и моя вина. Я уже много раз читал не лестные отзывы о нем, но все продолжал гнуть его линию.
НО благодаря ему я выйду на диплом не только с субд тестов(это на мой взгляд очень мало для диплома), а так же смогу пустить хоть какую то пыль в глаза тем кто будет меня слушать...Я видел ДП в котором чел реализовал "задать вопрос преподу" - ну это же просто смешно и мало так же как и субд теста. Другое дело реализовать Информационный портал: тесты, лекции, скачать материалы(учебные или программы) + готовая админка ко всему этому.Пусть по оформлению слабо, но хотябы есть основа или движок если так можно выразиться.....Без Жеки я бы этого не сделал.

P.S. php и sql я учу первый раз в жизни и со 2 февраля...как могу и по материалам которые есть...Если не сложно, черканите пожалуйсто матералы которые на Ваш взгляд правильные. Желательно не только книги но и видео.

Спустя 9 минут, 49 секунд (16.06.2009 - 15:40) glock18 написал(а):
единственное что я когда-либо читал по php - php.net

Спустя 1 минута, 41 секунда (16.06.2009 - 15:42) sergeiss написал(а):
Цитата (Tenevoi @ 16.06.2009 - 16:31)
Если не сложно, черканите пожалуйсто матералы которые на Ваш взгляд правильные. Желательно не только книги но и видео.


PHP:
- хэлп у меня в подписи - полная инфа про ПХП
- этот форум

SQL:
- найди хэлп по той БД, которой пользуешься,
- этот форум.

А самое главное - не только читай, но и тут же делай, тренируйся smile.gif Со 2 февраля ежели учить, то можно было уже супер-портал написать. А про видео... Я сам по видео не учил ничего, но что-то мне это не нравится. Заведомо не нравится. Потому что и в книге (в т.ч. и в электронной), и в форуме я могу двигаться своим темпом. Где-то быстрее, где-то медленнее.

Спустя 47 минут, 13 секунд (16.06.2009 - 16:29) Tenevoi написал(а):
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in Z:\home\localhost\www\phpsite\testing.php on line 46
Array ( ) Array ( )

46: while ($row = mysql_fetch_assoc($result))
Так и должно быть?

Спустя 15 минут, 4 секунды (16.06.2009 - 16:44) sergeiss написал(а):
Цитата (Tenevoi @ 16.06.2009 - 17:29)
Так и должно быть?

А позволь тебе назад "отфутболить" это вопрос? smile.gif

Для ответа на него:
1. Переведи текст с описанием ошибки.
2. Подумай, к чему относится в данной строке.
3. Определи причину проблемы и устрани ее.

Я думаю, что после решения п.1 остальные получатся "на автомате".

Спустя 1 час, 25 минут, 30 секунд (16.06.2009 - 18:10) Tenevoi написал(а):
как я понимаю ошибка в result (не действителен) Возможно во 2м запросе используется переменная которую надо вытащить из массива и только потом использовать во 2м запросе?

Спустя 39 минут, 40 секунд (16.06.2009 - 18:49) glock18 написал(а):
1. вот здесь у меня ошибка
PHP
$answers[$row['code_quest']] = $row;


когда будет что-то выводить. попробуй найти ее сам.

2. ошибка может быть из-за того, что code_test имеет строковый тип. Тогда тебе придется скорее всего несколько обезобразить циклом вот это:
PHP
$codeQuestRange implode(',',array_keys($questions));

Спустя 3 часа, 13 минут, 36 секунд (16.06.2009 - 22:03) sergeiss написал(а):
Цитата (Tenevoi @ 16.06.2009 - 19:10)
как я понимаю ошибка в result (не действителен) Возможно во 2м запросе используется переменная которую надо вытащить из массива и только потом использовать во 2м запросе?

Не совсем так smile.gif

Вот этот текст
Цитата (Tenevoi @ 16.06.2009 - 17:29)
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in Z:\home\localhost\www\phpsite\testing.php on line 46
Array ( ) Array ( )

46: while ($row = mysql_fetch_assoc($result))

говорит о том, что в этой строке переменная $result имеет не тот тип, который требуется. А это значит, что SQL-запрос не был выполнен. То есть, реальная ошибка у тебя выше этой строки!!!

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

PS. Сорри, не могу без подобных образов smile.gif

Спустя 2 часа, 8 минут, 4 секунды (17.06.2009 - 00:11) Tenevoi написал(а):
как я понимаю это переменная - строковое представление массива состоящего из ключей вопросов?
PHP
$codeQuestRange implode(',',array_keys($questions));

Надо в цикле вывести ключи?
user posted image

Спустя 8 часов, 25 минут, 17 секунд (17.06.2009 - 08:36) glock18 написал(а):
Цитата
как я понимаю это переменная - строковое представление массива состоящего из ключей вопросов?

Ну это вам лучше знать вообще то. Ваша база - ваши данные.

Цитата
Надо в цикле вывести ключи?

Экспериментируйте с переменными при помощи print_r или var_dump. Посмотрите что в $questions лежит. и что сейчас лежит в $codeQuestRange. если код вопроса строковый, то каждую строку нужно получить заключенную в кавычки '.

Спустя 6 часов, 47 минут, 55 секунд (17.06.2009 - 15:24) Tenevoi написал(а):
$questions - массив из кодов вопросов, где каждому коду вопроса присвоен массив из idшников, вопросов и кода вопроса.
А $codeQuestRange - это просто строка из кодов вопроса: q1,q2
как я понимаю надо чтобы $codeQuestRange был не строкой а массивом
Array ( [0] => Array ( [0] => q1 [1] => q2 ) ) ?

Спустя 2 минуты, 5 секунд (17.06.2009 - 15:26) glock18 написал(а):
Цитата
как я понимаю надо чтобы $codeQuestRange был не строкой а массивом

нет

читайте мой предыдущий пост.


_____________
PHP? Проще Хакинтошь поставить на AMD+nForce+IDE
Быстрый ответ:

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