Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Несколько форм с одним submit!
 
 автор: Front   (22.10.2007 в 14:56)   письмо автору
 
 

Всем привет!
Вопрос следующего характера, есть три таблицы:

Анкета или голосование:

CREATE TABLE IF NOT EXISTS satisfy (
  id int(10) unsigned NOT NULL auto_increment,
  satis tinytext ,
  date_s date ,
  date_e date ,
  vis int(1) unsigned ,
  section_id int(2) ,
  PRIMARY KEY (id)
);


Вопрос:

CREATE TABLE IF NOT EXISTS question (
  id int(10) unsigned NOT NULL auto_increment,
  question tinytext ,
  vis int(1) unsigned ,
  pos int(2) unsigned ,
  PRIMARY KEY (id)
);



Ответ:

CREATE TABLE IF NOT EXISTS answer (
  id int(10) unsigned NOT NULL auto_increment,
  answer tinytext ,
  question_id int(10) unsigned ,
  PRIMARY KEY (id)
);


Допустим у меня в анкете 3 вопроса в каждом вопросе по 3 ответа, я написал скрипт который все это дело выводит.

echo "<table bgcolor='#8EDBFF' cellpadding='0' cellspacing='0' border='0' width='750'>";
                echo "<tr>";
                    echo "<td class='content'>";
                      
                      $query = mysql_query( "
                      SELECT
                      id,
                      satis
                      FROM 
                      satisfy
                      WHERE 
                      date_s <= NOW() 
                      AND date_e >= NOW()");
                      
                      if (!$query) echo mysql_error();
                      echo "<form action='index.php?bk=add_total' method='post'>";
                      while ($row_satis = mysql_fetch_assoc($query))
                      {
                      echo "<table cellpadding='0' cellspacing='0' border='0'>";
                          echo "<tr>";
                              echo "<td>Наименование голосования/анкетирования:</td>";
                              echo "<td>$row_satis[id]</td>";
                              echo "<td>$row_satis[satis]</td>";
                          echo "</tr>";
                          echo "<tr>";
                              
                                  echo "<input type='text' name='id_satisfy' value='$row_satis[id]'>";
                                  $sql = mysql_query ( "SELECT id,question,type_id FROM question WHERE sat_id='$row_satis[id]'" );
                                  if (!$sql) mysql_error();
                                  while ($res_question = mysql_fetch_assoc($sql))
                                  {
                                      echo "<input type='text' name='id_question' value='$res_question[id]'>";
                                    echo "<td>$res_question[question]</td>";
                                        //Вывод ответов
                                    $ans = mysql_query ( "SELECT id,answer FROM answer WHERE question_id='$res_question[id]'" );
                                    while ($res_answer = mysql_fetch_assoc($ans))
                                    {
                                        if ($res_question[type_id] == 1) $try = "checkbox";
                                        elseif ($res_question[type_id] == 2) $try = "radio";
                                        else $try = "text";
                                        echo "<tr>";
                                        echo "<td><input type='$try' id='$res_answer[id]' name='id_answer[]' value=".$res_answer["id"]." ></td>";
                                        echo "<td><label for='$res_answer[id]'>${res_answer["answer"]}</label><td>";
                                        echo "</tr>";
                                    }
                                echo "</tr>";
                                echo "<tr>";
                        echo "<td align='right'><input class='button' type='submit' value='Отправить'></td>";
                          echo "</form>";
                    echo "</tr>";
                                  }
                          echo "</tr>";
                      echo "</table>";
                      }
                      
                    echo "</td>";
                echo "</tr>";
            echo "</table>";

Как сделать чтобы все вопросы были в одной форме, спасибо:

   
 
 автор: sim5   (22.10.2007 в 15:00)   письмо автору
 
   для: Front   (22.10.2007 в 14:56)
 

А в чем суть вопроса? Прописывайте все поля в одной форме, в чем проблема?

   
 
 автор: Front   (22.10.2007 в 15:04)   письмо автору
 
   для: sim5   (22.10.2007 в 15:00)
 

Просто в приведенном ранее коде, она на каждый вопрос выведет кнопку submit, а вопросов может быть много. Не будет же пользователь 10 раз нажимать на разные кнопки.
А если поставить вывод submit за циклом он формирует это как одну форму, соответственно нельзя выбрать для двух вопросов 2 radio!

   
 
 автор: sim5   (22.10.2007 в 15:19)   письмо автору
 
   для: Front   (22.10.2007 в 15:04)
 

Почему нельзя? Вы можете одному вопросу сколь угодно радиокнопок повесить, так же и чекбоксов - группируйте их по именам, индексам... объявляйте их массивами... и будет у вас одна кнопка SUBMIT.

   
 
 автор: Front   (22.10.2007 в 15:23)   письмо автору
 
   для: sim5   (22.10.2007 в 15:19)
 

Не могли бы вы поподробнее сказать? По индексам из БД?

   
 
 автор: sim5   (22.10.2007 в 15:29)   письмо автору
 
   для: Front   (22.10.2007 в 15:23)
 

Напишите просто код формы, которую вы ожидаете увидеть, и разбейте ее пробелами на секции, как бы, если бы вам потребовалось несколько форм. И напишите, что является проблемой - так виднее будет.

   
 
 автор: Front   (22.10.2007 в 15:40)   письмо автору
 
   для: sim5   (22.10.2007 в 15:29)
 


<FORM action=index.php?bk=add_total method=post>
            <TABLE cellSpacing=0 cellPadding=0 border=0>
              <TBODY>
              <TR>
                <TD>Наименование голосования/анкетирования:</TD>
                <TD>3</TD>
                <TD>FORD</TD></TR>
              <TR><INPUT value=3 name=id_satisfy><INPUT value=23 
                name=id_question>
                <TD>Какой автомобиль?</TD>
              <TR>
                <TD><INPUT id=55 type=radio value=55 name=id_answer[]></TD>
                <TD><LABEL for=55>focus</LABEL>
                <TD></TD>
              <TR>
                <TD><INPUT id=56 type=radio value=56 name=id_answer[]></TD>
                <TD><LABEL for=56>fusion</LABEL>
                <TD></TD>
              <TR>
                <TD><INPUT id=70 type=radio value=70 name=id_answer[]></TD>
                <TD><LABEL for=70>mondeo</LABEL>
                <TD></TD></TR>
              <TR></TR><INPUT value=29 name=id_question>
              <TR>
                <TD>Какой объем?</TD>
              <TR>
                <TD><INPUT id=71 type=radio value=71 name=id_answer[]></TD>
                <TD><LABEL for=71>1,2</LABEL>
                <TD></TD>
              <TR>
                <TD><INPUT id=72 type=radio value=72 name=id_answer[]></TD>
                <TD><LABEL for=72>1,4</LABEL>
                <TD></TD>
              <TR>
                <TD><INPUT id=73 type=radio value=73 name=id_answer[]></TD>
                <TD><LABEL for=73>1,6</LABEL>
                <TD></TD>
              <TR>
                <TD><INPUT id=74 type=radio value=74 name=id_answer[]></TD>
                <TD><LABEL for=74>1,8</LABEL>
                <TD></TD>
              <TR>
                <TD><INPUT id=75 type=radio value=75 name=id_answer[]></TD>
                <TD><LABEL for=75>2,0</LABEL>
                <TD></TD></TR>
              <TR></TR>
              <TR>
                <TD align=right><INPUT class=button type=submit value=Отправить></TD></FORM>


проблема в том что в коде форма формируется с одинаковыми имена, а мне нужно с разными?

   
 
 автор: sim5   (22.10.2007 в 15:45)   письмо автору
 
   для: Front   (22.10.2007 в 15:40)
 

То есть у вас радиокнопки должны быть независимы? Тогда доваляйте к имени id, как я понимаю это зависит от записи в базе:


<INPUT id=55 type=radio value=55 name=id_answer_55[]> 
<INPUT id=56 type=radio value=56 name=id_answer_56[]>

Например так. Я бы вообще убрал из имени id_

   
 
 автор: Front   (22.10.2007 в 15:47)   письмо автору
 
   для: sim5   (22.10.2007 в 15:45)
 

Тогда мне не записать результаты опроса или анкетирования! Я же формирую список checkbox в цикле!

   
 
 автор: sim5   (22.10.2007 в 15:51)   письмо автору
 
   для: Front   (22.10.2007 в 15:47)
 

Ну и формируйте. Почему не записать результатов анкетирования? Вы имеете ввиду, что не сможете получить данные от формы?

   
 
 автор: Front   (22.10.2007 в 16:00)   письмо автору
 
   для: sim5   (22.10.2007 в 15:51)
 

Да, как я потом буду записывать если у меня в коде будет:


echo "<td><input type='$try' id='$res_answer[id]' name='id_answer[]._.$res_answer[id]' value=".$res_answer["id"]." ></td>";


Чтобы сформировать форму вида:
<INPUT id=55 type=radio value=55 name=id_answer_55[]>

А записываю я в базу вот так:

    foreach($_POST['id_answer'] as $id_answer)
    {
        $query="INSERT INTO total (id,id_satisfy,id_question,id_answer) VALUES ('0','$id_satisfy','$id_question','$id_answer')";
    if (!mysql_query($query)) echo mysql_error();

   
 
 автор: sim5   (22.10.2007 в 16:12)   письмо автору
 
   для: Front   (22.10.2007 в 16:00)
 

Вы кругом $id_answer прописали, не понятно зачем. Ну и в чем проблема? Назовите свои кнопки вообще как name_1[], name_2[]... и т.д., какая разница. Вы же значение кнопок записываете, а не их имена, а значение вы получите только у нажатых радиокнопок.

   
 
 автор: Front   (22.10.2007 в 16:18)   письмо автору
 
   для: sim5   (22.10.2007 в 16:12)
 


echo "<td><input type='$try' id='$res_answer[id]' name='id_answer[]._.$res_answer[id]' value=".$res_answer["id"]." ></td>"; 

При таком коде в базу он пишет, все правильно. Но в форме я могу выделить в одной форме несколько radio - а по определению это неправильно!

   
 
 автор: sim5   (22.10.2007 в 16:27)   письмо автору
 
   для: Front   (22.10.2007 в 16:18)
 

Ну я же вас спрашивал - у вас какие кнопки должны быть независимы или зависимы? Если зависимы (то есть можно нажать только одну), то имена у таких конопок должны быть одинаковы: id_answer[]. Если в одной форме у вас должно быть несколько групп кнопок с зависимой фиксацией, то именуйте их соответственно:
'id_answer_55[]
'id_answer_55[]
'id_answer_56[]
'id_answer_56[]
Тогда вытащить все можно в цикле:


<?
foreach ($vars["_POST"] as $key => $val)  {
//здесь можно получить имя кнопики принадлежащей какой либо группе и т.п.
//следовательно значение группы и пр.
{

   
 
 автор: Front   (22.10.2007 в 16:30)   письмо автору
 
   для: sim5   (22.10.2007 в 16:27)
 

<?
foreach ($vars["_POST"] as $key => $val) {
//здесь можно получить имя кнопики принадлежащей какой либо группе и т.п.
//следовательно значение группы и пр.
{

Уже при записе в базу данных?

И ПРи этом должно быть
name='id_answer[]._.$res_answer[id]'

или name='id_answer[]'

   
 
 автор: sim5   (22.10.2007 в 16:55)   письмо автору
 
   для: Front   (22.10.2007 в 16:30)
 


<?
$vars 
get_defined_vars(); //массив всех определённых переменных.
foreach ($vars["_POST"] as $key => $val) {
//здесь получаете все что вам надо - это будут имена
//кнопок формы, виделить которые из массива просто
//достаточно обрезать у имени id_answer_
//и вы получите id (номер кнопки)
//здесть можете сформировать строки запроса к базе,
//а вне цикла вставить их
//можете в цикле вставлять 
}

Как должны называться кнопки, зависит от того, какие вам нужны. Если имена радиокнопок одинаковы, то они имеют зависимую фиксацию - можно выбрать только одну из них, и соотвественно, если имена кнопок разные, можно выбрать много радио кнопок.

   
 
 автор: Front   (23.10.2007 в 10:27)   письмо автору
 
   для: sim5   (22.10.2007 в 16:55)
 

//достаточно обрезать у имени id_answer_

А зачем их обрезать если у них имена одинаковые, они же имеют зависимую Фиксанцию.

Получил я все переменные:
$vars = get_defined_vars(); в виде двухмерного массива.

При этом код я изменил следующим образом:


echo "<td><input type='text' name='id_question[]' value='$res_question[id]'></td>";


У меня просто к определенному вопросу по id привязан определенный ответ, а сам вопрос привязан к номеру анкетирования или голосования!

А как мне теперь записать это все в базу данных?

   
 
 автор: sim5   (23.10.2007 в 11:17)   письмо автору
 
   для: Front   (23.10.2007 в 10:27)
 

Если у вас ВСЕ кнопки, это кнопки с зависимой фиксацией, то вам вообще ничего "резать" не надо. Это нужно было бы, если бы из групп кнопок выделить нужное. Так что $vars = get_defined_vars(); и сопутсвующее можно выбросить. Имена кнопок в этом случае роли не играют, лишь бы это был массив. У вас ID записано как значение кнопки, если это ID определяет номер записи в базе, то в чем проблема?

   
 
 автор: Front   (23.10.2007 в 11:22)   письмо автору
 
   для: sim5   (23.10.2007 в 11:17)
 

Проблема записи в базу данных двумерного массива

   
 
 автор: sim5   (23.10.2007 в 11:25)   письмо автору
 
   для: Front   (23.10.2007 в 11:22)
 

Что-то по форме, вами представленной, не видно, что это двумерный массив.

   
 
 автор: Front   (23.10.2007 в 12:31)   письмо автору
 
   для: sim5   (23.10.2007 в 11:25)
 

После того как я посылаю данные из формы в обработчик приходит массив:


Array ( [id_satisfy] => 3 [id_answer] => Array ( [0] => 56 [1] => 72 ) [id_question] => Array ( [0] => 23 [1] => 29 ) )


Разве это не двумерный массив?

   
 
 автор: sim5   (23.10.2007 в 13:12)   письмо автору
 
   для: Front   (23.10.2007 в 12:31)
 

Это многомерный. А вот как можно его разобрать:


<?
$send 
= Array('id_satisfy' => 3'id_answer' => Array(=> 56=> 72), 'id_question' => Array(=> 23=> 29));
foreach (
$send as $key1 => $val1) {
 if(!
is_array($val1)) echo $key1.' - '.$val1.'<BR>';
  else {
   echo 
'&nbsp;&nbsp;'.$key1.'<BR>';
      foreach (
$val1 as $key2 => $val2) {
       echo 
'&nbsp;&nbsp;&nbsp;'.$key2.' - '.$val2.'<BR>';
    }
  }
}
?>

Но я несколько не понимаю, если у вас форма - это элементы объедененные в группы, по id записи в базе, например, и их имена отражают этот id, то нет проблем получить его и произвести запись. Как - я раньше приводил пример, можете иначе, тем более у вас эти id кругом прописаны, в чем проблема у вас, я так и не понял.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования