PHP MySQL вставьте ассоциативный массив в базу данных из «динамической» формы - PullRequest
0 голосов
/ 22 декабря 2010

У меня есть форма, которая позволяет дублирование полей.Форма публикуется через php и вставляется в базу данных.Моя проблема заключается в том, что я не могу правильно перебрать массив.Правильно ли я настраиваю форму (правильно ли отформатированы name) и правильно ли я перебираю массивы?Мне не удалось вставить какие-либо данные.

Хитрость в том, что дублированные поля должны слипаться.

Думайте о полях как о наборе вопросов и ответов.

Каждый вопрос имеет заголовок, текст вопроса и ввод файла.

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

У меня name настроен так:

name='question[1][title]'
name='question[1][text]'
name='question[1][file]'

answer[1][title][]
answer[1][text][]
answer[1][file][]
answer[1][correct][]

PHP для вставки формы выглядит следующим образом:

$insert_question = $db->prepare(
   'insert into questions (title, text) values (?, ?)');
$insert_answer = $db->prepare(
   'insert into answers (question_id, title, text, correct)'.
   ' values (?, ?, ?, ?)');
foreach ($_POST['question'] as $q_num => $q)
{
   $insert_question->execute(array($q['title'], $q['text']));
   $q_id = $db->lastInsertId();

   //********************
   // insert files
   //********************

   foreach ($_POST['answer'][$q_num] as $a)
   {
      $insert_answer->execute(
         array($q_id, $a['title'], $a['text'], $a['correct']));
   }
}

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

Ответы [ 2 ]

2 голосов
/ 22 декабря 2010

Я не уверен, что понял вашу проблему (я не говорю по-английски).

Но здесь вам нужен другой цикл вместо этого:

   foreach ($_POST['answer'][$q_num] as $a)
   {
      $insert_answer->execute(
         array($q_id, $a['title'], $a['text'], $a['correct']));
   }

как:

$lim = count($_POST['answer'][$q_num]['title']);
for($i=0;$i<$lim;++$i){
   $insert_answer->execute(
             array($q_id, $_POST['answer'][$q_num]['title'][$i], $_POST['answer'][$q_num]['text'][$i], $_POST['answer'][$q_num]['correct'][$i]));
}

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

0 голосов
/ 22 декабря 2010

Проблема со вторым циклом (массив ответов).Попробуйте это

<?php 
  foreach ($_POST['answer'][$q_num]['title'] as $a => $value)
   {
    $insert_answer->execute(
       array($q_id, $_POST['answer'][$q_num]['title'][$a], $_POST['answer'][$q_num]['text'][$a], $_POST['answer'][$q_num]['correct'][$a]));
}

?>
...