[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как сделать вывод при нажатии кнопки? ++
DesignerMix
Вот делаю диплом, вывод вопросов в тесте,

вот код:
PHP
for ($i=1; $i<=$kol_vo; $i++)
    {
    
    $quest
="<p class='textHead'>".$vopros_a['vopros']."<form name='form1' method='get' action='StartTest.php' class='Test'><p>
              <label>
          <input type='radio' name=1 value=$rand1 id=$rand1>
         "
.$vopros_a['otvet_'.$rand1]."</label>
        <br><p>
        <label>
          <input type='radio' name=1 value=$rand2 id=$rand2>
          "
.$vopros_a['otvet_'.$rand2]."</label>
        <br><p>
        <label>
          <input type='radio' name=1 value=$rand3 id=$rand3>
          "
.$vopros_a['otvet_'.$rand3]."</label>
        <br><p>
        <label>
          <input type='radio' name=1 value=$rand4 id=$rand4>
          "
.$vopros_a['otvet_'.$rand4]."</label>
        <br><p>
        <input type='hidden' name='id' value=$_GET[id]>
        <input type='hidden' name='tid' value=$_GET[tid]>
        </p><input type='submit' value='Далее'>
      </form>
    <p>"
;
    } 
    do
{
    echo $quest;
    }
    while ($i<=$kol_vo);


где $kol_vo - это
PHP
$kol_vo_a=mysql_query("SELECT * FROM Vopros WHERE vid=$_GET[tid]");
    $kol_vo=mysql_num_rows($kol_vo_a);


Выводится понятное дело только первый вопрос. Я уже голову сломал, не могу придумать такого условия чтобы выводились все последующие вопросы при нажатии кнопки далее в форме.

Подскажите как сделать вывод каждого вопроса последовательно! unsure.gif



Спустя 11 минут, 34 секунды (5.06.2009 - 21:21) DesignerMix написал(а):
PS $rand1 ... $rand4 - это случайная последовательность от 1 до 4 для вывода вариантов случайно от 1-го до 4-го. С этим все в порядке, ошибок нету.

Спустя 1 час, 12 минут, 43 секунды (5.06.2009 - 22:33) DesignerMix написал(а):
ХЕЛП! user posted image

Спустя 7 часов, 34 минуты, 30 секунд (6.06.2009 - 06:08) twin написал(а):
Ну начнем с того, что id у элементов должны быть уникальными, то есть неповторяющимися ни при каких обстоятельствах. При рандоме это не факт.
Потом, не совсем понятно, что значит последующие вопросы. Имеется ввиду те, которые выбраны радиокнопкой? Или это ответы?
Если просто следующий, то нужно узнать ид следующего и подставить в запрос. Или если нет разрывов, можно +1 подставить.
Зачем там два цикла я вообще не понял. Первый совсем бестолковый, потому что переменная перезаписывается. Тогда уж конкатенацию что ли сделай:
PHP
$quest .= "<p class='textHead'>".
а во втором не нужно do ... while. Просто while для этих целей используется. Вообще лучше все в один объеденить.
Ну как то так:
PHP
<?php
$rand 
= range(1,4);
shuffle($rand);
$result = mysql_query("SELECT * FROM Vopros WHERE vid=".(int)$_GET['tid']);

$quest = "<p class='textHead'>".mysql_result($result,0,'vopros')."<form name='form1' method='get' action='StartTest.php' class='Test'><p>";
    while($row = mysql_fetch_assoc(($result))
    {
    $i 0;
     $quest .= '<label>
          <input type="radio" name="1" value="'
.$rand[$i].'" id="'.$rand[$i].'" />
         '
.$row['otvet_'.$rand[$i]].'</label>
        <br><p>'
;
    
$i++;
    }
    
    $quest 
.= '<input type="hidden" name="id" value="'.$_GET['id'].'" />
        <input type="hidden" name="tid" value="'
.($_GET['tid'] + 1).'" />
        </p><input type="submit" value="Далее" />
      </form>
    <p>'
;
    
echo $quest
;

Не лучший вариант, но для домашнего задания сойдет.

Спустя 5 минут, 51 секунда (6.06.2009 - 06:14) twin написал(а):
Вообще немного непонятна структура базы... Там в каждой строчке по 4 ответа? Эт не очень оптимально... Вобщем идея есть, разберешься.

Спустя 6 часов, 21 минута, 20 секунд (6.06.2009 - 12:35) DesignerMix написал(а):
Цитата
Ну начнем с того, что id у элементов должны быть уникальными, то есть неповторяющимися ни при каких обстоятельствах.

Это понятно, я просто не включил код который препятствует повторению случайных чисел, но может кому-нить будет интересно, вот:
PHP
$rand1=mt_rand(1,4);
$rand2=$rand1$rand3=$rand1$rand4=$rand1;
while (
$rand2==$rand1){$rand2=mt_rand(1,4);}
while (
$rand3==$rand1 || $rand3==$rand2){$rand3=mt_rand(1,4);}
while (
$rand4==$rand1 || $rand4==$rand2 || $rand4==$rand3){$rand4=mt_rand(1,4);


Цитата
Потом, не совсем понятно, что значит последующие вопросы. Имеется ввиду те, которые выбраны радиокнопкой? Или это ответы?

Это ответы, а вопрос, это следующая комбинация заголовка, т.е. самого вопроса и вариантов ответа, т.е. радиокнопок.

Цитата
Если просто следующий, то нужно узнать ид следующего и подставить в запрос. Или если нет разрывов, можно +1 подставить.

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

Здесь была ошибка:
PHP
while($row mysql_fetch_assoc(($result)

вроде так должно быть:
PHP
while($row mysql_fetch_assoc($result)


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

Структура базы такая:
user posted image

Курс объединяет в себе тесты и вопросы (включая ответы);
Тест объединяет только вопросы (включая ответы).

Не запутал?

Спустя 3 минуты, 1 секунда (6.06.2009 - 12:38) DesignerMix написал(а):
Т.е чтобы вывести вопрос, мне надо знать VID, TID и если они верны (соответствуют своему курсу и тесту), то узнать ID. Это я вроде осуществил, но вот разрывы все путают.

Спустя 4 часа, 17 минут, 24 секунды (6.06.2009 - 16:55) glock18 написал(а):
особенно потрясла глубиной мысли строчка:

PHP
while ($rand4==$rand1 || $rand4==$rand2 || $rand4==$rand3){$rand4=mt_rand(1,4);


biggrin.gif

Я не вижу, чтобы в вашей таблице было поле "Порядок". Если он не задан, и поля должны браться каждый раз в случайном порядке, то могу посоветовать только:
1. Собирать все вопросы в самом начале теста.(хотя бы порядок)
2. Сохранять в сессии.
3. Следующий вопрос будете определять по следующему элементу в массиве, сохраненном в сессии.

Спустя 46 минут, 51 секунда (6.06.2009 - 17:42) twin написал(а):
Твой
Цитата
код который препятствует повторению случайных чисел

немедленно выкинуть и не пугать людей надо. Я написал ведь, две первые строчки это он и есть.
База данных мягко скажем организована неверно. Отсюда и проблемы. Почему нумерация vid повторяется? Каким образом MySQL узнает, какой именно из 13-го вопроса выбрать? это поле вообще лишнее. Ориентироваться надо на автоинкрементное поле, тогда можно получить ближайшее. Лучше чтобы разрывов небыло, тогда один запрос. а если есть, то двумя.

Спустя 2 минуты, 16 секунд (6.06.2009 - 17:44) twin написал(а):
А, понял примерно зачем это все. Тебе надо наоборот, не проверять соответствие, а выбирать нужные.

Спустя 2 минуты (6.06.2009 - 17:46) twin написал(а):
Цитата
вроде так должно быть:PHP
while($row = mysql_fetch_assoc($result)

ошибка действительно была, но должно быть так:
PHP
while($row mysql_fetch_assoc($result))

Спустя 1 час, 41 минута, 51 секунда (6.06.2009 - 19:28) DesignerMix написал(а):
Немного перефразирую, как можно взять элементы из этого массива один за другим:
PHP
$kol_vo_a=mysql_query("SELECT id FROM Vopros WHERE vid=$_GET[tid] AND tid=$_GET[id]");
$id_index=mysql_fetch_row($kol_vo_a);

если он при условии
PHP
do
{
echo 
$id_index[0].'&nbsp;';
}
while (
$id_index=mysql_fetch_row($kol_vo_a));

выводит значения, к примеру "21 23 24 43 29".

Мне нужно взять сначала 21, затем при нажатии кнопки далее 23, затем 24 и т.д. Неважно что они не по порядку.

Спустя 20 минут, 58 секунд (6.06.2009 - 19:49) twin написал(а):
PHP
$res = mysql_query("SELECT MIN(`id`) 
                    FROM `Vopros` 
                    WHERE `vid`='"
.(int)$_GET['vid']."' 
                    AND `tid`='"
.(int)$_GET['tid']."'
                    AND `id` > '"
.(int)$_GET['id']."'
                    "
);
                    
        $row 
= mysql_fetch_assoc($res);
        $id = ($row['id'])?$row['id']:$_GET['id'];
        
    $quest 
.= '<input type="hidden" name="id" value="'.$id.'" />
    <input type="hidden" name="vid" value="'
.$_GET['vid'].'" />
        <input type="hidden" name="tid" value="'
.$_GET['tid'].'" />
        </p><input type="submit" value="Далее" />
      </form>
    <p>'
;
И не убирай ничего, я не просто для красоты пишу.

Спустя 1 час, 37 минут, 46 секунд (6.06.2009 - 21:27) DesignerMix написал(а):
PHP
AND `id` > '".(int)$_GET['id']."'


Я не передаю в GET параметр id именно потому что мне нужно его знать до того как передать. Ведь id идет не по порядку, а например так "24 43 29". Проблема вся и заключается в том чтобы взять id...

Или я что-то не так понял.

А что на счет того чтобы брать элементы из массива последовательно, как я спросил? Это бы решило мою проблему. Или это невозможно?

В любом случае спасибо!

Спустя 13 минут, 54 секунды (6.06.2009 - 21:41) twin написал(а):
Это и есть по порядку. Зачем тебе городушка с массивом то...
Если нужно знать до, тогда и доставай его до. Ты же просил выбрать по порядку, порядочнее не будет...

PHP
if(!empty($_GET['id']))
$res mysql_query("SELECT MIN(`id`) 
                    FROM `Vopros` 
                    WHERE `vid`='"
.(int)$_GET['vid']."' 
                    AND `tid`='"
.(int)$_GET['tid']."'
                    AND `id` > '"
.(int)$_GET['id']."'
                    "
);

else
$res mysql_query("SELECT MIN(`id`) 
                    FROM `Vopros` 
                    WHERE `vid`='"
.(int)$_GET['vid']."' 
                    AND `tid`='"
.(int)$_GET['tid']."'
                    "
);


        
$row mysql_fetch_assoc($res);
        
$id = ($row['id'])?$row['id']:$_GET['id'];
        
    
$quest .= '<input type="hidden" name="id" value="'.$id.'" />
    <input type="hidden" name="vid" value="'
.$_GET['vid'].'" />
        <input type="hidden" name="tid" value="'
.$_GET['tid'].'" />
        </p><input type="submit" value="Далее" />
      </form>
    <p>'
;

Спустя 5 дней, 20 часов, 21 минута, 48 секунд (12.06.2009 - 18:03) DesignerMix написал(а):
Цитата (twin @ 6.06.2009 - 18:41)
Это и есть по порядку. Зачем тебе городушка с массивом то...
Если нужно знать до, тогда и доставай его до. Ты же просил выбрать по порядку, порядочнее не будет...

PHP
if(!empty($_GET['id']))
$res = mysql_query("SELECT MIN(`id`) 
                    FROM `Vopros` 
                    WHERE `vid`='"
.(int)$_GET['vid']."' 
                    AND `tid`='"
.(int)$_GET['tid']."'
                    AND `id` > '"
.(int)$_GET['id']."'
                    "
);

else
$res = mysql_query("SELECT MIN(`id`) 
                    FROM `Vopros` 
                    WHERE `vid`='"
.(int)$_GET['vid']."' 
                    AND `tid`='"
.(int)$_GET['tid']."'
                    "
);


        $row = mysql_fetch_assoc($res);
        $id = ($row['id'])?$row['id']:$_GET['id'];
        
    $quest 
.= '<input type="hidden" name="id" value="'.$id.'" />
    <input type="hidden" name="vid" value="'
.$_GET['vid'].'" />
        <input type="hidden" name="tid" value="'
.$_GET['tid'].'" />
        </p><input type="submit" value="Далее" />
      </form>
    <p>'
;

Спасибо, долго не писал потому что то диплом, то госы... blink.gif , с вашим кодом я разобрался. Я просто по началу не понял как что работать должно. Сработало!
Быстрый ответ:

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