2009-05-12 5 views
8

Я установил эту тестовую страницу на своем сервере. Скажите, пожалуйста, почему массив $_POST не содержит ничего, даже когда я отправляю форму. Я пробовал это в трех разных браузерах, и ничего не происходит.

<?php print_r($_POST);?> 

<form method="post"> 

<p><label>Email: </label> 
<input type="text" id="login_email" /> 
</p> 

<p><label>Password: </label> 
<input type="password" id="login_password" /> 
</p> 

<p><label>Remember Me?: </label> 
<input type="checkbox" id="login_remember" /> 
</p> 

<p> 
<input type="submit" value="Login" /> 
</p> 

</form> 

Я писал PHP много лет, и этого никогда не было раньше. Что не так с этим кодом?

ответ

51

Элементы ввода не имеют атрибутов имени. Должно быть:

<input type="text" id="login_email" name="login_email" /> 

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

9

Ну, у вас нет действия для тега формы? Это должно быть имя сценария:

<form method="post" action="scriptname.php"> 

... и вы также не устанавливать имена для каждой формы ввода - браузер не представляет идентификатор в качестве имени элемента.

+0

На самом деле, я думаю, что это действительно так, чтобы оставить название действия. Если вы это сделаете, браузер просто отправляет/получает текущую страницу. –

+6

Большинство браузеров демонстрируют это поведение, но, согласно официальным спецификациям, требуется атрибут действия - http://www.w3.org/TR/html401/interact/forms.html. – BrynJ

+0

Спасибо за разъяснение. Я согласен с тем, что это плохая идея выразить такую ​​двусмысленность, когда спецификация не определяет поведение по умолчанию. –

2

Нет атрибута имени для входных элементов.

4
<form method="POST" action="<?php echo $PHP_SELF; ?> 

<p><label>Email: </label> 
<input type="text" name="login_email" /> 
</p> 

<p><label>Password: </label> 
<input type="password" name="login_password" /> 
</p> 

<p><label>Remember Me?: </label> 
<input type="checkbox" name="login_remember" /> 
</p> 

<p> 
<input type="submit" value="Login" /> 
</p> 

</form> 
+0

Это будет работать ... вы забыли «имя» и части действия. – MichaelICE

0

Все ваши элементы ввода нуждаются в атрибуте имени.

1

Предлагаю вам написать что-то вроде следующих функций, основанных на помощниках Zend_View.

formText($name, $value = null, array $attribs = null) 
formPassword($name, $value = null, array $attribs = null) 
formLabel($id, $text, array $attribs = null) 
formHidden($name, $value = null, array $attribs = null) 
formSubmit($name = null, $text = null, array $attribs = null) 
formSelect($name, $selected, array $attribs = null, array $options = null) 
formCheckbox($name, $default, array $attribs = null, array $options = null) 

Тогда вы никогда не забудете или пропустите что-то подобное.

<form method="POST" action="<?php echo $PHP_SELF; ?> 

<p> 
<?php 
echo formLabel('login_email', 'Email'), ':', 
    formText('login_email'); 
?> 
</p> 

<p> 
<?php 
echo formLabel('login_password', 'Password'), ':', 
    formPassword('login_password'); 
?> 
</p> 

<p> 
<?php 
echo formCheckbox('login_remember'), ' ', 
    formLabel('login_remember', 'Remember me'); 
?> 
</p> 

<p> 
<?php 
echo formSubmit(null, 'Login'); 
?> 
</p> 
</form> 

Совет:

  • Если идентификатор не определен в attribs, идентификатор совпадает с именем, для этикеток, где идентификатор используется в атрибуте для = «$ ID» и formHidden не должны иметь, кроме Идентификатор по умолчанию.
  • formCheckbox пишет formHidden с тем же именем перед собой с отрицательным значением, поэтому вы получаете возвращаемое значение, если флажок также не установлен.
  • formCheckbox - это массив со значениями для отмеченных или непроверенных.
  • Используйте фильтр с FILTER_VALIDATE_BOOLEAN, чтобы прочитать возвращаемое значение из флажка, чтобы проверить, было ли оно отмечено или нет.
0

Вы забыли атрибуты имени для создания скрипта. Вы также можете включить тег «for» в своих ярлыках, чтобы соответствовать атрибутам имен вашего ввода. Это не является обязательным требованием, но может помочь с CSS форматированием вашей формы:

<p> 
<label for="login_email">Email: </label> 
<input type="text" name="login_email" id="login_email" /> 
</p> 

Помогает соответствовать все из и сохранить ваш код более обтекаемым и читаемым, если вы должны вернуться к нему через 6 месяцев. Атрибут действия, если вы не собираетесь заполнить один я бы включил это в качестве действия:

<form method="POST" action="<?php echo $PHP_SELF; ?> 

Это удостоверится ваша страница хороша, насколько требования в отношении формы, а также сделать как ваш сценарий должен выполнить , Похоже, это простой перехват. Надеюсь это поможет.

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