Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2012, 21:39   #1
HDMI
Пользователь
 
Регистрация: 21.09.2009
Сообщений: 48
По умолчанию Автоматическое создание формы

Суть: создаю форму, в ней количество строк зависит от количества файлов в бд. Генерирую ссылку, создаю 5 радиобаттонов и 1 поле комментария. Как мне сделать у каждого файла индивидуальные радиобаттоны и комментарии? Надеюсь объяснил понятно.

Ниже код, для лучшего понимания проблемы:

PHP код:
$query "SELECT predmet.name_pr, zadania.name_z, upload.name, upload.directory FROM predmet,zadania,upload WHERE predmet.id_users='{$_SESSION['user_id']}' AND predmet.id_predmet=zadania.id_predmet AND zadania.id_zadania=upload.id_zadania";  
$result mysql_query($query);  
echo 
"<form action='proverka.php' method='POST'>";
while(
$query_data mysql_fetch_array($result))   
{  
$name_pr $query_data["name_pr"]; 
$name_z $query_data["name_z"];
$name $query_data["name"];
$directory $query_data["directory"];

echo 
"<br><a href='./upload/$directory/$name.pdf' type='application/pdf' target='_blank'>$name_pr - $name_z <img src='img/download.png' width='35' height='30' /></a>";
echo 
"<br>
<input type='hidden' name='name' value='
$name'>";
<
input type='Radio' name='status' value='5'>5
<input type='Radio' name='status' value='4'>4
<input type='Radio' name='status' value='3'>3
<input type='Radio' name='status' value='2'>2
<input type='Radio' name='status' value='1'>Вернуть на доработку<br>
<
input type='text' name='komment' placeholder='ваш комментарий' size='50'><br>
<
input type='submit' value='Оценить'>


";

}


    
$name = (isset($_POST['name'])) ? mysql_real_escape_string($_POST['name']) : '';
    
$status = (isset($_POST['status'])) ? mysql_real_escape_string($_POST['status']) : '';
    
$komment = (isset($_POST['komment'])) ? mysql_real_escape_string($_POST['komment']) : '';
    
    echo "
Имя$name";
    echo "
Статус$status";
    echo "
Комментарий$komment";
    
$query = "UPDATE upload SET `status`='{$status}', `komment` = '{$komment}' WHERE name '$name'";    
    
    
$sql = mysql_query($query) or die(mysql_error());
    

Картинка для понимания:


Думаю из кода понятно, что в цикле while форма строится и создаются с одинаковым именем радибаттоны и поля ввода, т.е. при обработке формы изменяется только последняя строчка в БД, т.к. в цикле она и есть последняя. Как можно создать с разным именем поля? Идея моя, которая сразу не подошла: называть поля по разному, тоже в цикле. Но после отправки я не смогу узнать, что именно то отправил с помощью POST, т.к. не знаю конкретное имя.

P.S. знаю, что вопрос глупый, помогите с алгоритмом, можно псевдокод, голова уже не работает от этого

Последний раз редактировалось HDMI; 01.04.2012 в 21:42.
HDMI вне форума Ответить с цитированием
Старый 01.04.2012, 21:51   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,544
По умолчанию

Надо несколько форм создавать, на каждый файл отдельная форма.
Arigato на форуме Ответить с цитированием
Старый 01.04.2012, 22:02   #3
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

В форме - подставляем ID текущей записи в качестве ключа массива:
PHP код:
<input type='Radio' name='status[<?=$row['id'];?>]' value='5'>5
В обработчике: в массиве $_POST['status'] ключи - это ID записей в БД, а значения - это значения выбранных радио-кнопок:
PHP код:
if(!empty($_POST['status'])){
    foreach(
$_POST['status'] as $row_id => $row_value){
        
// do something...
    
}

Andkorol вне форума Ответить с цитированием
Старый 02.04.2012, 09:46   #4
HDMI
Пользователь
 
Регистрация: 21.09.2009
Сообщений: 48
По умолчанию

Цитата:
Сообщение от Andkorol Посмотреть сообщение
В форме - подставляем ID текущей записи в качестве ключа массива:
PHP код:
<input type='Radio' name='status[<?=$row['id'];?>]' value='5'>5
В обработчике: в массиве $_POST['status'] ключи - это ID записей в БД, а значения - это значения выбранных радио-кнопок:
PHP код:
if(!empty($_POST['status'])){
    foreach(
$_POST['status'] as $row_id => $row_value){
        
// do something...
    
}

Обработчик создавать для 3 переменных? И в нем нужно подключаться к БД и там уже искать по ID, я правильно понял?

Последний раз редактировалось HDMI; 02.04.2012 в 09:49.
HDMI вне форума Ответить с цитированием
Старый 02.04.2012, 10:50   #5
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от HDMI Посмотреть сообщение
Обработчик создавать для 3 переменных? И в нем нужно подключаться к БД и там уже искать по ID, я правильно понял?
А это уже как вам угодно.
Хотите - обрабатывайте сразу все элементы, т.е. вот у вас три отдельных элемента на скриншоте - вы можете сделать не три отдельных кнопки-submit, а одну, в конце формы. И таким образом предоставите возможность сразу оценить все три элемента (что удобнее, как мне кажется).
Хотите - обрабатывайте по одному элементу, как сейчас у вас, с отдельными кнопками-submit для каждого.
В этих вариантах изменяется только количество элементов в массиве $_POST['status'] - в первом случае в нем будет 3 элемента, во втором случае - 1 элемент.
Причем код обработчика - одинаковый для обоих вариантов, именно за счет использования массивов.

И у вас опять идентификация записи в БД идет по названию - когда вы уже поймете, что это глупость?
Для идентификации записи в БД нужно использовать именно ID - иначе однажды у вас обязательно случится коллизия имен - и вы очень долго будете отлавливать такой баг.
Andkorol вне форума Ответить с цитированием
Старый 02.04.2012, 11:04   #6
HDMI
Пользователь
 
Регистрация: 21.09.2009
Сообщений: 48
По умолчанию

Цитата:
Сообщение от Andkorol Посмотреть сообщение
А это уже как вам угодно.
Хотите - обрабатывайте сразу все элементы, т.е. вот у вас три отдельных элемента на скриншоте - вы можете сделать не три отдельных кнопки-submit, а одну, в конце формы. И таким образом предоставите возможность сразу оценить все три элемента (что удобнее, как мне кажется).
Хотите - обрабатывайте по одному элементу, как сейчас у вас, с отдельными кнопками-submit для каждого.
В этих вариантах изменяется только количество элементов в массиве $_POST['status'] - в первом случае в нем будет 3 элемента, во втором случае - 1 элемент.
Причем код обработчика - одинаковый для обоих вариантов, именно за счет использования массивов.

И у вас опять идентификация записи в БД идет по названию - когда вы уже поймете, что это глупость?
Для идентификации записи в БД нужно использовать именно ID - иначе однажды у вас обязательно случится коллизия имен - и вы очень долго будете отлавливать такой баг.
Про id, уже исправил, да.
Для понимания всего этого:

PHP код:
<input type='Radio' name='$row[id]' value='5'>5
<input type='Radio' name='$row[id]' value='4'>4
<input type='Radio' name='$row[id]' value='3'>3
<input type='Radio' name='$row[id]' value='2'>2
<input type='Radio' name='$row[id]' value='1'>Вернуть на доработку<br
Создаю в цикле while таким образом, т.е. получается массив, количество элементов которого = 3 в конкретном случае.

Затем пытаюсь просто вывести эту переменную, для проверки:

PHP код:
if(!empty($_POST['status'])){ 
    foreach(
$_POST['status'] as $row_id => $row_value){ 
         
$status $_POST['status'];   // $row_value присваивать?
         
echo "Статус: $status";      // Статус: - не выводится даже это
    


Что не так я делаю?
HDMI вне форума Ответить с цитированием
Старый 02.04.2012, 11:05   #7
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,158
По умолчанию

Код:
'$row[id]'
если внутри строки - то надо в двойных кавычках
ADSoft вне форума Ответить с цитированием
Старый 02.04.2012, 11:06   #8
HDMI
Пользователь
 
Регистрация: 21.09.2009
Сообщений: 48
По умолчанию

Цитата:
Сообщение от ADSoft Посмотреть сообщение
Код:
'$row[id]'
если внутри строки - то надо в двойных кавычках
Эта конструкция у меня в echo, двойными не получится
HDMI вне форума Ответить с цитированием
Старый 02.04.2012, 11:10   #9
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,158
По умолчанию

Код:
echo "<input type='Radio' name='$row[id]' value='5'>5 ";
короче смысл в том -чтоб строка правильно формировалась... когда исходный код смотрите - там все нормально?

и для проверки выводите всеь пост массив .. посмотрите что у вас там var_dump($_POST);
ADSoft вне форума Ответить с цитированием
Старый 02.04.2012, 11:12   #10
HDMI
Пользователь
 
Регистрация: 21.09.2009
Сообщений: 48
По умолчанию

Цитата:
Сообщение от ADSoft Посмотреть сообщение
Код:
echo "<input type='Radio' name='$row[id]' value='5'>5 ";
короче смысл в том -чтоб строка правильно формировалась... когда исходный код смотрите - там все нормально?

и для проверки выводите всеь пост массив .. посмотрите что у вас там var_dump($_POST);
Код:
<input type='Radio' name='$id' value='5'>5
- все выводит, переменная $id есть

$row[id] чему должно присваиваться вообще?

Последний раз редактировалось HDMI; 02.04.2012 в 11:18.
HDMI вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автоматическое изменение размера формы в соответствии с размером экрана ru3000 Microsoft Office Excel 18 08.11.2021 10:16
Автоматическое открытие формы. Artiomtb C# (си шарп) 1 09.01.2012 21:14
Автоматическое удаление формы или запроса s8259 Microsoft Office Access 8 21.12.2010 23:52
Автоматическое создание макроса lavrentiyy Microsoft Office Excel 16 14.10.2010 00:07
Автоматическое формирование нескольких отчётов по данным из формы Kerguru Microsoft Office Access 1 20.04.2010 20:20