Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
3 / 3 / 0
Регистрация: 10.12.2013
Сообщений: 32
1

Метот $_POST при работе с динамическими именами

25.03.2015, 20:59. Показов 1652. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет! Нужна помощь в таком вопросе.
На странице размещен тест, вопросы появляются по одному, ответы выполнены в виде радиогрупп.
Имена радиогрупп все разные. Поэтому имя конкретной радиогруппы присваивается переменной. В связи с этим не погу правильно написать запрос на получение данных из формы с моей радиогруппой.
PHP
1
2
3
4
5
6
7
8
9
10
$sql1 = mysql_query('SELECT * FROM answers WHERE number_question = "'.$result['number_question'].'"')
            if ($sql1)
            {
echo'<form method="post" action=''>';   
                                while ($result1 = mysql_fetch_array($sql1))
        
                    
echo "<input type='radio' name='".$result1['number_question']."' value='".$result1['number_answer']."'>".$result1['answer'].";
echo'<input type="submit" name="next" value="Следующий вопрос" /></form>';
}
PHP
1
2
3
4
5
6
7
<?php
//обычно делается так
$usr_answer=$_POST['имя_радиогруппы'];
//мне надо чтобы вместо имени радиогруппа встала переменная, содержащая это имя
//примерно так
$usr_answer=$_POST[$rado_name];
?>
Искал в инете, но не нашел ничего стоящего, можно ли вообще так делать? Если можно, то как правильно написать $_POST запрос?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.03.2015, 20:59
Ответы с готовыми решениями:

Ошибка при работе с динамическими компонентами
Делаю менюшку для игры. Пункты меню - Label и Image. При нажатии на какой либо пункт меню -...

Ошибке при работе с динамическими массивами
Добрый день, подскажите, как решить ошибку Non-terminated string(unreadable memory)?

Выделение и очищение памяти при работе с динамическими строками
Всем Доброго времени суток! Пожалуйста укажите на ошибку! #ifndef RECEIPT_H #define RECEIPT_H...

Операции с указателями. Использование указателей при работе с динамическими массивами
Дан динамический массив целых чисел {ai} (i=1, 2, ...,n) , целые c и d (c &lt; d). Написать программу...

17
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
25.03.2015, 21:55 2
А зачем вообще делать разные названия в HTML? В этом нет смысла, используйте статичное название.
0
3 / 3 / 0
Регистрация: 10.12.2013
Сообщений: 32
25.03.2015, 21:57  [ТС] 3
Был такой вариант. Но в последствии хотелось бы выводить вс вопросы и сразу, тут, как не крути имена будут разные, а кол-во вопросов практически неограничено.
0
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
25.03.2015, 22:53 4
Ок. Но всё-равно непонятно, зачем нужна $rado_name. Что там должно лежать и зачем потом использоваться?
0
3 / 3 / 0
Регистрация: 10.12.2013
Сообщений: 32
25.03.2015, 22:56  [ТС] 5
Возможно я пишу кривой код. Пока учусь. В $radio_name должно храниться имя радиогруппы с текущим вопросом. Поместить имя в $padio_name - это легко, а вот обраться по этому имени не могу, ибо конструкция $_POST[$rado_name]; записана неверно.
0
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
26.03.2015, 08:04 6
KDG94, а, кажется, понял вас.

Я бы использовал массивы. В общем случае массив передаётся так:
HTML5
1
2
<input name="array[one]">
<input name="array[two]">
Соответственно, one - первая радиогруппа, two - вторая.

Код примерно такой:
PHP/HTML
1
2
3
4
5
6
7
8
9
<?
    $result = mysql_query("SELECT * FROM answers WHERE number_question = '$result[number_question]'") or die(mysql_error());
?>
<form method="post" action="">
<? while($row = mysql_fetch_array($result)): ?>
    <input type="radio" name="options[<?=$row['number_question']?>]" value="<?=$row['number_answer']?>"><?=$row['answer']?>
    <input type="submit" name="next" value="Следующий вопрос" />
<? endwhile ?>
</form>
Не рекомендую выводить формы через echo, много геморроя с кавычками.

Теперь все пришедшие значения (т.е. подходит и для вывода всех вопросов сразу) будут лежать в массиве $_POST['options'].

Получить названия можно так:
PHP
1
2
3
4
5
$options_names = array();
 
foreach($_POST['options'] as $key => $value){
    $options_names[] = $key;
}
В массиве $options_names будут лежать названия всех пришедших радиогрупп.
1
3 / 3 / 0
Регистрация: 10.12.2013
Сообщений: 32
26.03.2015, 14:41  [ТС] 7
Спасибо. На счет форм учту. Буду разбираться и пробовать.

Добавлено через 1 час 13 минут
Попробовал ваш код.
Ругается на строку
PHP
1
 foreach($_POST['options'] as $key => $value)
Invalid argument supplied for foreach().

Не пойму в чем ошибка.
0
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
26.03.2015, 15:07 8
KDG94, данные не приходят или приходят неправильно. Проверьте, что выводит такой код?

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
$options_names = array();
 
if(!isset($_POST['options'])){
    die('Данные не пришли.');
}
 
if(!is_array($_POST['options'])){
    die('Пришёл не массив.');
}
 
foreach($_POST['options'] as $key => $value){
    $options_names[] = $key;
}
0
3 / 3 / 0
Регистрация: 10.12.2013
Сообщений: 32
26.03.2015, 17:06  [ТС] 9
Первый рад вывел "Данные не пришли."
После несколько раз обновил страницу, перезапустил Денвер, все пошло нормально.
Как я понимаю что-то лагает?

Добавлено через 1 час 54 минуты
Сейчас стал окончательно доделывать и столкнулся со следующим

Цитата Сообщение от Jodah Посмотреть сообщение
В массиве $options_names будут лежать названия всех пришедших радиогрупп.
Так и есть. Но как теперь по этим именам получить значение из радиогрупп?
PHP
1
 $_POST['$options_names[$i]'];
- так не получается выцепить value из радиогрупп.
0
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
26.03.2015, 17:11 10
Цитата Сообщение от KDG94 Посмотреть сообщение
- так не получается выцепить value из радиогрупп.
А зачем вам это?

Что вы хотите делать дальше? Подставлять в mysql-запрос?
0
23 / 23 / 17
Регистрация: 14.02.2014
Сообщений: 176
26.03.2015, 17:16 11
Если вам интересно, то посмотрите как можно немного по другому решить вашу проблему) http://webformyself.com/sozdan... ya-urok-1/
1
3 / 3 / 0
Регистрация: 10.12.2013
Сообщений: 32
26.03.2015, 17:25  [ТС] 12
Суть такая:
1) SQL-запросами я заполняю форму с радиогруппами, а именно: присваиваю значения, выводимый текст, может иногда придется присваивать имена
2) Получаю имена всех радиогрупп
3) По нажатии кнопки "Следующий вопрос" я должен получить значение из своей формы с радиогруппами. И тут сложность.
4) Сравнивать полученные ответы с правильными

Проблема в том, что не могу получить значение из формы.
Раньше все формы обрабатывал методом $_POST['']. Просто в [''] писал имя радигруппы и все. Сйчас имя радиогруппы хранится в переменной и такая запись по просту не понимается в PHP

Добавлено через 5 минут
Цитата Сообщение от !Boroda Посмотреть сообщение
Если вам интересно, то посмотрите как можно немного по другому решить вашу проблему) http://webformyself.com/sozdan... ya-urok-1/
Обязательно посмотрю, возможно что-то и позаимствую. Спасибо
Просто сроки зажимают, а работы непочатый край. И для меня списать готовое не очень интересно, хочется реализовать и понять ту схему, которую сам придумал.
возможно более простой вариант ляжет в последующую версию)

В целом у меня система многоуровневая:
выбираем дисциплину
тему
вопрос
отвечаем и узнаем оценку
0
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
26.03.2015, 18:11 13
Покажите, как вы выполняете 4-ый пункт, т.е. каким запросом проверяете, правильный ответ или нет.
0
3 / 3 / 0
Регистрация: 10.12.2013
Сообщений: 32
26.03.2015, 18:24  [ТС] 14
Я еще не дошел до 4-го пункта, по тому, что не могу получить данные из моей формы с радиогруппами.
Уже переделал, чтобы получать вопросы сразу из всех форм (вопросы выводятся разом).
Выводится переменная с именем радиогрупп. Имена совпадают с именами из форм. Но метот $_POST выдает пустоту.

На счет сравнения, то при чтении из БД правильные ответы хочу помещать в массив, а потом просто сравнивать массив ответов пользователя и правильные ответы.
Прилагаю код, правда в нем пока много мусора. И некрасивых выводов, потом поправлю.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
<?php
if (isset($_GET['show'])) { 
    $sql = mysql_query('SELECT * FROM variant_tests WHERE number_topic = "'.$_GET['show'].'"');
    if ($sql) 
    {
        echo "<ul>";
       while ($result = mysql_fetch_array($sql))
        {
            $id_test=$result['id'];
            echo "<li><a href='index.php?show_questions=".$result['id']."'>".$result['name']."</a></li>";
        }
        echo "</ul>";
    } 
        else 
            {
                echo "<p>Произошла ошибка.</p>";
            }
}
?>
<?php
$kol_ques=0;
if (isset($_GET['show_questions'])) {
    echo '<form method="POST" action="">';
    $sql = mysql_query('SELECT * FROM variant_tests WHERE id = "'.$_GET['show_questions'].'"');
        if ($sql)
            { 
                $result = mysql_fetch_array($sql);
                echo "<h3>".$result['name']."</h3></br>";
            }
    $sql = mysql_query('SELECT * FROM questions WHERE id_test = "'.$_GET['show_questions'].'"');
    if ($sql)
            { 
                while ($result = mysql_fetch_array($sql))
                    {
                        $kol_ques++;
                        echo "<p><b>".$result['question']."</b></p>";
                        
                        $sql1 = mysql_query('SELECT * FROM answers WHERE number_question = "'.$result['number_question'].'"');
                        if ($sql1)
                            {   
                                $i=0;
                                while ($result1 = mysql_fetch_array($sql1))
                                    if ($result1['right_answer']!='')
                                        $i=$i+1;
                                $sql1 = mysql_query('SELECT * FROM answers WHERE number_question = "'.$result['number_question'].'"');
                                if($i==1)
                                    {   
                                        if ($sql1)
                                            {
                                                while($row = mysql_fetch_array($sql1)): ?>
                                                    <input type="radio" name="options[<?=$kol_ques?>]" value="<?=$row['number_answer']?>"><?=$row['answer']?></br></br>
                                        <? endwhile ?>
                                            <?
                                            }
                                    }
                                else
                                    {
                                        if ($sql1)
                                            {
                                                while ($result1 = mysql_fetch_array($sql1))
                                                    echo "<p><input type='checkbox' name='".$result1['number_answer']."' value=''>".$result1['answer']."</p>";
                                            }
                                    }
                            }
                    }
            }
            
    ?>
    <p> <input type="submit" name="OK" value="Ответить" /></p>
     </form>
     <?
}
 
//ответы
if (isset($_POST['OK'])) {
    
        $options_names = array();
 
        if(!isset($_POST['options'])){
            die('Данные не пришли.');
        }
 
        if(!is_array($_POST['options'])){
            die('Пришёл не массив.');
        }
        
        $i=0;
        foreach($_POST['options'] as $key => $value){
            $options_names[] = $key;
            $n=(string)"options[".$options_names[$i]."]";
            // echo$n;
            echo $_POST[$n]; //ничего не выводит, якобы пусто
            $i++;
        }
}
?>
0
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
26.03.2015, 18:46 15
Цитата Сообщение от KDG94 Посмотреть сообщение
Я еще не дошел до 4-го пункта, по тому, что не могу получить данные из моей формы с радиогруппами.
Хорошо.

Допустим, есть таблица `answers`, в которой хранятся все ответы на тесты. Помимо остальных столбцов, есть 3 столбца:
id - номер ответа (его вы подставляете в input - <?=$row['number_answer']?>)
is_true - если его значение 1 - ответ правильный, если 0 - неправильный.
group - здесь лежит название группы тестов, например 'test1', 'test2' и т.п.

Тогда решить вашу задачу можно так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?
// Получаем все правильные ответы.
$result = mysql_query('SELECT `id`, `group` FROM `answers` WHERE is_true = 1') or die(mysql_error());
 
// Формируем массив правильных ответов в формате группа => номер правильного ответа
$answers = array();
while($row = mysql_fetch_assoc($result)
{
    $answers[$row['group']] = $row['id'];
}
 
//А теперь проверяем, на какие вопросы пользователь ответил правильно
foreach($_POST['options'] as $key => $value)
{
    if($answers[$key] == $value){
        echo "Ответ на вопрос $key правильный.<br/>";
    }else{
        echo "Ответ на вопрос $key неправильный.<br/>";
    }
}
?>
0
3 / 3 / 0
Регистрация: 10.12.2013
Сообщений: 32
26.03.2015, 19:04  [ТС] 16
Получается следующая картина:
мои поля:
number_answer // он же id
answer // формулировка вопроса
right_answer //правильный ответ, хранит любые числа, а если не правильный, то поле остается пустым
number_question // связь с к-л одним вопросом


Немного исправил код под себя, вроде все правильно, но ругается на "syntax error" в строке с запросом к БД

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
if (isset($_POST['OK'])) {
 
 
// Получаем все правильные ответы.
$result = mysql_query('SELECT * FROM `answers` WHERE right_answer' IS NOT NULL) or die(mysql_error());
 
// Формируем массив правильных ответов в формате группа => номер правильного ответа
$answers = array();
while($row = mysql_fetch_assoc($result)
{
    $answers[$row['number_question']] = $row['number_answer'];
}
 
//А теперь проверяем, на какие вопросы пользователь ответил правильно
foreach($_POST['options'] as $key => $value)
{
    if($answers[$key] == $value){
        echo "Ответ на вопрос $key правильный.<br/>";
    }else{
        echo "Ответ на вопрос $key неправильный.<br/>";
    }
}
Можно еще объяснить $_POST['options'] ? как я понял получаем сразу весь массив с именами радиокнопок?
0
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
26.03.2015, 19:36 17
Потому что вы поставили закрывающую кавычку до IS NOT NULL. Посмотрите ваш код, форум подсвечивает, где кончается текст.

Да, в $_POST['options'] лежит массив всех значений. Т.е. $_POST['options']['test1'] - здесь лежит ответ на первый вопрос.
0
3 / 3 / 0
Регистрация: 10.12.2013
Сообщений: 32
26.03.2015, 19:48  [ТС] 18
Так вроде работает. Но неверно определяет правильный - неправильный.
Допустим есть 2 вопроса в каждом 2 ответа.

В1О1
В1О2 - это правильный ответ

В2О1 - это правильный ответ
В2О2

Однако, когда я отмечаю эти ответы, проходит только первый вопрос. Если во втором отмечаю правильным второй вариант, то оба отображаются правильными.
0
26.03.2015, 19:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.03.2015, 19:48
Помогаю со студенческими работами здесь

Важно:207 ошибка при работе с типизированными файлами и динамическими массивами
Объясните, пожалуйста, почему возникает ошибка 207 &quot;Invalid floating point operation&quot; при...

Распарсить Json с динамическими именами
Вот такой Json нужно распарсить, не могу составить класс. { &quot;name1&quot;: { &quot;Age&quot;: 20,...

Как взять данные из чекбоксов с динамическими именами в цикле?
Доброго времени суток! Возникла проблема и не сумел справиться с ней сам. В общем: Есть файл...

Ошибка в работе в цикле с динамическими массивами
Здравствуйте! После ввода 5 значения вылетает ошибка о невозможности чтения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru