2013-11-22 3 views
0

Так что я пытаюсь отправить результаты формы с помощью PHP. внутри моей формы у меня есть набор флажков. Приведенный ниже сценарий работает, когда отмечен по крайней мере 1 флажок в группе. Если ни один из флажков не проверяются я получаю следующее сообщение об ошибке:PHP-функция impode не работает правильно

Предупреждение: взрываться() [function.implode]: Invalid дополняющая прошло в {имя PHP док} в строке {ххх} Массив

Вот пример кода, я использую:

<?php 
$data = array(); 
    foreach ($_POST as $key => $value) { 
     $data[] = $value; 
    } 

if(!$data[14]) //$data[14] is an array of checkbox values 
    {echo 'No User Selection';} 
else 
    {echo implode(" | ", $data[14]);} //This is where the error occurs 
?> 

HTML код

<label for="b0" class="left">Item 1</label> 
<input type="checkbox" name="b[0]" id="b0" value="Item 1"/> 
<label for="b1" class="left">Item 2</label> 
<input type="checkbox" name="b[1]" id="b1" value="Item 2"/> 
<label for="b2" class="left">Item 3</label> 
<input type="checkbox" name="b[2]" id="b2" value="Item 3"/> 
ect.... 

кто-нибудь есть идея, почему я получаю Тхи s ошибка?

+2

попробуйте распечатать $ data [14], чтобы убедиться, что это массив! –

+1

Почему вы преобразовываете массив '$ _POST', который имеет легко идентифицируемые ключи, в новый массив, где вы должны угадать, что такое ключ? Добавьте новое поле перед флажками, и все это рухнет. Просто используйте '$ _POST ['b']'. – jeroen

+0

Я думаю, что то, что происходит. Если ни один из флажков не установлен, $ data [14] становится следующим входом со значением, опубликованным. Когда проверяется хотя бы один флажок $ data [14] - это массив? Как я могу легко назначить все должности переменной без необходимости их индивидуального использования? – Austin

ответ

0

Если этот флажок не установлен, он не отправляется на сервер. я предлагаю вам сделать что-то вроде этого:

<label for="b0" class="left">Item 1</label> 
<input type="hidden" name="b[0]" value=""/> 
<input type="checkbox" name="b[0]" id="b0" value="Item 1"/> 
<label for="b1" class="left">Item 2</label> 
<input type="hidden" name="b[1]" value=""/> 
<input type="checkbox" name="b[1]" id="b1" value="Item 2"/> 
<label for="b2" class="left">Item 3</label> 
<input type="hidden" name="b[2]" value=""/> 
<input type="checkbox" name="b[2]" id="b2" value="Item 3"/> 

Таким образом, вы уверены, что б [0], B [1] и т.д. всегда посылаются

+0

HTTP-заголовки могут быть изменены при отправке данных, поэтому лучше было бы проверить, существуют ли переменные на стороне сервера. – evuez

+0

@evuez вы могли бы объяснить об измененных заголовках http и флажках? Я не уверен, что я тебя понимаю. – Matthew

+0

Это не очень приятное решение: вам нужно удвоить количество полей ввода, и единственная разница на стороне сервера заключается в том, что теперь вам нужно проверить 'empty' вместо' isset'. – jeroen

2

Убедитесь, что переменная а) set и b) - массив.

$data = array(); 
foreach ($_POST as $key => $value) { 
    $data[] = $value; 
} 

if (!isset($data[14]) || !is_array($data[14])) { 
    echo 'No User Selection'; 
} else { 
    echo implode(" | ", $data[14]); 
} 

Всегда правильно проверять переменные, используя isset(), если, конечно, вам не нравятся гигантские журналы ошибок! Я также предлагаю использовать ключи $ _POST в качестве ключей для $ data, тем самым делая жизнь еще проще, когда вы хотите найти конкретный элемент $ _POST.

0

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

<?php 

    if(!isset ($_POST['b']) || !is_array($_POST['b'])) { 
     echo 'No User Selection'; 
    } else { 
     echo implode(" | ", $_POST['b']); 
    } 

?> 

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

Ваш код будет невероятно хрупким, если вы его не измените.

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