2014-11-19 5 views
0

Я делаю список дел, и у меня все работает, кроме одной. Мне нужно перебрать входы, которые были отправлены через форму, эти входы имеют одно и то же имя, так что я сделал, это хранить их как массив. Теперь мне нужно зациклиться на них, чтобы я мог отправлять их в базу данных один за другим. Вот что я пробовал:Цитирование по массиву входов с таким же именем

if (isset($_POST['submit'])) { 
    $labelValues = $_POST['labelValue[]']; 

    $i = 0; 

    while($i < sizeof($labelValues)) { 

     $stmt = $db->prepare("INSERT INTO tenta_table (text) VALUES (:text)"); 
     $stmt->bindParam(':text', $labelValues[$i]); 
     $stmt->execute(); 
     $i++; 
    } 
} 

HTML, входы помечены красным цветом:

inputs

Но это не похоже на работу, он не дает мне какие-либо ошибки, поэтому я не имею никакого отношения к Продолжай. Где я здесь не так?

+0

Можете ли вы опубликовать свою часть HTML, где появилось это сообщение? –

+3

Не уверен, но насколько я помню, это должно быть '$ labelValues ​​= $ _POST ['labelValue']'. Я думаю, что ваш '$ labelValues' является' null', и вы даже не вводите свой цикл. Вы должны сделать 'var_dump ($ _POST)', чтобы проверить, с чем вы работаете. – evilive

+0

@AnikIslamAbhi добавлена ​​картинка. – Chrillewoodz

ответ

3

Ваш $_POST['labelValue'] уже будет массивом, если вы правильно указали свои входы, что-то вроде <input type="text" name="labelValue[]" /> будет создавать и массивы под названием labelValue в вашем POST.

Оттуда вы должны быть в состоянии использовать свой текущий код с одним небольшим изменением

if (isset($_POST['submit'])) { 
    $labelValues = $_POST['labelValue']; 

    $i = 0; 

    while($i < sizeof($labelValues)) { 

     $stmt = $db->prepare("INSERT INTO tenta_table (text) VALUES (:text)"); 
     $stmt->bindParam(':text', $labelValues[$i]); 
     $stmt->execute(); 
     $i++; 
    } 
} 

Выше я изменения $labelValues на равную $_POST['lableValue'], а не $_POST['labelValue[]']

0

Вы должны заменить

$labelValues = $_POST['labelValue[]']; 

К

$labelValues = $_POST['labelValue']; 
1

В вашем случае будет доступен только последний элемент ввода.

Если вы хотите, чтобы несколько входов с одинаковым именем использовали name="foo[]" для атрибута имени ввода. $_POST будет содержать массив для foo со всеми значениями из входных элементов.

<form method="post"> 
    <input name="a[]" value="foo"/> 
    <input name="a[]" value="bar"/> 
    <input name="a[]" value="baz"/> 
    <input type="submit" /> 
</form> 

Причина $_POST будет содержать только последнее значение, если вы не используешь [] потому, что PHP будет в основном просто взрывается и Еогеасп над сырой строкой запроса для заполнения $_POST. Когда он встречает пару имен/значений, которая уже существует, она перезапишет предыдущую.

Однако, вы можете получить доступ к необработанной строке запроса, как это:

$rawQueryString = file_get_contents('php://input')) 

Если у вас есть форма, как это:

<form method="post"> 
    <input type="hidden" name="a" value="foo"/> 
    <input type="hidden" name="a" value="bar"/> 
    <input type="hidden" name="a" value="baz"/> 
    <input type="submit" /> 
</form> 

за $ rawQueryString будет содержать a=foo&a=bar&a=baz.

Затем вы можете использовать свою собственную логику для синтаксического анализа этого массива. Наивный подход будет

$post = array(); 
foreach (explode('&', file_get_contents('php://input')) as $keyValuePair) { 
    list($key, $value) = explode('=', $keyValuePair); 
    $post[$key][] = $value; 
} 

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

или лучший и простой подход к этой

<form method="post"> 
    <input name="a[0]" value="foo"/> 
    <input name="a[1]" value="bar"/> 
    <input name="a[2]" value="baz"/> 
    <input type="submit" /> 
</form> 
0

Не уверен, но, насколько я помню, она должна быть $ labelValues ​​= $ _POST [ 'labelValue']. Я думаю, что ваши $ labelValues ​​равны нулю, и вы даже не вводите свой цикл. Вы должны сделать var_dump ($ _POST), чтобы проверить, с чем работаете.

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