2011-02-02 2 views
1

Я создаю онлайн-опрос с нуля, который будет храниться в базе данных. Я работаю над созданием системы, чтобы кто-то мог создать новый опрос.Получить данные POST без знания точного количества полей

У меня будет пользователь, заполняющий простую форму HTML с вопросами и ответами (может быть несколько ответов). Пользователь может добавить несколько вопросов и несколько ответов для каждого вопроса.

Поскольку общее количество вопросов и ответов будет определено пользователем, мне нужно создать какой-нибудь умный PHP, чтобы удовлетворить это - как бы там ни было много.

При работе со статическим количеством вопросов это просто. Но у меня возникли проблемы с мыслью о том, как получить все данные POST в отдельные переменные PHP, чтобы я мог их обработать.

Я думал об использовании петли foreach, у кого есть идеи?

Извините за длинное описание! Если кому-нибудь понадобится что-нибудь разъясненное, я буду рад сделать это. Моя проблема заключается в том, что я не могу понять, как бороться с значениями POST, когда я не знаю точно, какой элемент массива будет содержать что. Если бы все было статично с заданным количеством вопросов и ответов, я бы знал, что $_POST[0] был Вопрос1 и т. Д.

Спасибо! =)

ответ

1

Когда вы назовете свои поля ввода, как questions[], они будут переданы по таким параметрам, как это: questions[]=Q1&questions[]=Q2 (будь то в строке запроса или в теле сообщения). PHP преобразует их в массив в $_POST['questions'], где вы можете легко их перебирать. Вы также можете указать ключ явно, если вам нужно, чтобы несколько полей объединялись в один массив.

красота в этом возникает, когда вам нужно данных гнезда, так что «вопрос 1» имеет вопрос строку, п ответы, и, возможно, вариант настройки:

<input type="text" name="questions[0]"> 
<input type="text" name="questions[0][answers][]"> 
<input type="text" name="questions[0][answers][]"> 
<input type="text" name="questions[0][answers][]"> 
<input type="text" name="questions[0][answers][]"> 
<input type="text" name="questions[0][option][foo]"> 

... преобразующий в ...

[questions] => Array 
    (
     [0] => Array 
      (
       [answers] => Array 
        (
         [0] => answer1 
         [1] => answer2 
         [2] => answer3 
         [3] => answer4 
        ) 

       [option] => Array 
        (
         [foo] => bar 
        ) 

      ) 

    ) 
+0

Мне нравится этот подход, о чем свидетельствуют сами и meagar. Как мне получить доступ к массиву вопросов в PHP? – James

+0

«PHP преобразует их в массив в' $ _POST ['questions'] '." :) – coreyward

+0

Отметили этот ответ как решение, поскольку я использую многомерный подход массива, как показано здесь. Большое спасибо meagar и всем остальным за ответ. Я использовал сообщения каждого, чтобы создать что-то, что сработало для меня, что я мог понять! - отличный сайт, отличное сообщество! Еще раз спасибо! – James

1

foreach будет работать.

foreach($_POST as $name => $item) 

$ name будет содержать имя значения, с помощью которого вы можете определить, какое значение оно есть. Он будет содержать «question1» для поля, которое было названо «question1». :)

+0

ha получил ninja'd на 14 secs ... upvoting y наш ответ и удаление шахты – Serge

2

$_POST всегда должен быть ассоциативным массивом, с именем отображения элемента формы в индекс массива. Вам никогда не придется обращаться к $_POST[0], если вы специально не назовете поля формы 0. Вместо этого, если ваш элемент равен <input name="field1" />, вы можете найти представленное значение в $_POST['field1'].

Имейте в виду, что вы можете заставить PHP интерпретировать входящие элементы формы в качестве значений массива путем добавления индексов массива с их именами:

<input name="question[]" type="text" /> 
<input name="question[]" type="text" /> 

Когда возвращенной к вам, $_POST['questions'] будет содержать массив всех из question полей.

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

Вы будете в состоянии перебрать входящих почтовых данных с чем-то, напоминающим:

foreach ($_POST['questions'] as $question) { 
    // sanitize/save your user's question 
} 
+0

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

1

создать несколько полей ввода с именем, заканчивающимся с [], а именно:

ans1: <input type=text name='ans[]'> 
ans2: <input type=text name='ans[]'> 
name: <input name='name'> 

Тогда все значения будут отображаются как массив внутри массива $ _POST .:

array(2) { 
    ["ans"]=> 
    array(2) { 
    [0]=> 
    string(3) "LOL" 
    [1]=> 
    string(3) "WTF" 
    } 
    ["name"]=> 
    string(4) "John" 
} 
+0

Вы должны указывать значения ваших атрибутов ''; 'type =" text "' not 'type = text' – meagar

+0

@meagar: В HTML4 Transitional и HTML5 это необязательно. – mateusza

+1

Ах. Я пропустил ваше объявление doctype: p – meagar

Смежные вопросы