2009-05-12 15 views
8

Configuré esta página de prueba en mi servidor. Dígame por qué la matriz $_POST no contiene nada, incluso cuando envío el formulario. Lo he intentado en tres navegadores diferentes y no ocurre nada.

<?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> 

He estado escribiendo PHP durante años y esto nunca ha sucedido antes. ¿Qué está mal con este código?

Respuesta

51

Sus elementos de entrada no tienen atributos de nombre. Debe ser:

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

Si un elemento de entrada no tiene un atributo de nombre, no se envía como parte de los datos POST.

9

Bueno, usted no tiene una acción para la etiqueta del formulario? Debe ser el nombre del script:

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

... y tampoco está configurando los nombres para cada entrada de un formulario - el navegador no presenta la identificación que el nombre del elemento.

+0

En realidad, creo que es válido dejar el nombre de la acción. Si lo hace, el navegador simplemente publica/llega a la página actual. –

+6

La mayoría de los navegadores muestran este comportamiento, pero de acuerdo con las especificaciones oficiales, se requiere el atributo de acción - http://www.w3.org/TR/html401/interact/forms.html. – BrynJ

+0

Gracias por la aclaración. Estoy de acuerdo en que es una mala idea expresar ese tipo de ambigüedad cuando la especificación no define un comportamiento predeterminado. –

2

No hay ningún atributo de nombre para los elementos de entrada.

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

Esto funcionará ... olvidaste el 'nombre' y las partes de acción. – MichaelICE

0

Todos sus elementos de entrada necesitan un atributo de nombre.

1

Te sugiero que escribas algo así como las siguientes funciones basadas en los ayudantes de 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) 

Entonces nunca más olvidará/se perderá algo así.

<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> 

Consejo:

  • Si ID no está definido en attribs, id es el mismo que el nombre, a excepción de las etiquetas que se utilizan id en el atributo para = "$ id" y formHidden no debe tener una identificación predeterminada cualquiera.
  • formCheckbox escribe un formHidden por el mismo nombre que el anterior con el valor negativo, por lo que obtienes un valor de retorno si la casilla no está marcada también.
  • formCheckbox options es una matriz con los valores marcados o no.
  • Utilice un filtro con FILTER_VALIDATE_BOOLEAN para leer el valor de retorno de una casilla de verificación para comprobar si está marcado o no.
0

Olvidó los atributos del nombre para hacer que su script funcione. También puede incluir la etiqueta "para" en sus etiquetas para que coincida con los atributos de los nombres de sus entradas. Esto no es un requisito, pero puede ayudar con el formateo CSS de su forma:

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

ayuda a hacer coincidir todo de mantener y optimizar el código sea más legible y si tiene que volver a ella más de 6 meses después. El atributo de acción si no se va a llenar una que incluiría esto como su acción:

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

Esto hará que su página es bueno en cuanto a los requisitos del formulario, así como hacer que el script debe ejecutar . Parece una simple visión excesiva. Espero que esto ayude.

Cuestiones relacionadas