recibir por metodo funciona enviar datos array _post php login undefined-index

php - por - Índice no definido con $_POST



recibir array por post php (10)

Estoy tratando de volver a aprender algunos conceptos básicos de PHP para hacer un script de inicio de sesión simple, sin embargo recibo un error que no he recibido antes (hice el mismo script hace poco más de un año y nunca tuve este error. Simplifiqué el código tanto como Pude probar para ver qué área era problemática y aquí está el problema:

<?php $user = $_POST["username"]; if($user != null) { echo $user; echo " is your username"; } else { echo "no username supplied"; } ?>

Ahora bien, este código funciona bien cuando envío una variable a la secuencia de comandos, pero cuando no se suministra ninguna variable, aparece un error. En teoría, esto estará bien porque si no se proporciona un nombre de usuario / pase, entonces se espera un error. Antes de que se envíe el código al script, comprobaré que esté seguro de esto, sin embargo, me temo que de alguna manera puede pasar una cadena en blanco y escupir algún error desconocido. Aquí está el error que recibo:

( ! ) Notice: Undefined index: username in C:/wamp/www/verify_login.php on line 2 Call Stack Time Memory Function Location 1 0.0003 668576 {main}( ) ../verify_login.php:0

ningún nombre de usuario proporcionado

como puede ver, el código registra que no se suministró ninguna variable, pero da un error que supongo que significa que no se encontró una de las variables que se esperaba o algo así. ¿Alguien puede aclarar esto por mí?


Antes de PHP 5.2.0 y superior, debe usar filter_input() que está especialmente creado para que pueda obtener entradas de un usuario externo específico como get, post o variables de cookie por nombre y opcionalmente lo filtra para evitar cualquier ataque XSS / Injection en su sitio. Por ejemplo:

$user = filter_input(INPUT_POST, ''username'');

Puede usar uno de INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER o INPUT_ENV.

Al utilizar el tercer argumento opcional, puede extenderlo por variedad de filters (para validating , sanitizing , filtering u other ), por ejemplo, FILTER_SANITIZE_ENCODED , FILTER_SANITIZE_ENCODED , etc.

Por ejemplo:

<?php $search_html = filter_input(INPUT_GET, ''search'', FILTER_SANITIZE_SPECIAL_CHARS); $search_url = filter_input(INPUT_GET, ''search'', FILTER_SANITIZE_ENCODED); echo "You have searched for $search_html./n"; echo "<a href=''?search=$search_url''>Search again.</a>"; ?>

La sintaxis es:

mixed filter_input (int $ type, string $ variable_name [, int $ filter = FILTER_DEFAULT [, mixed $ options]])

(PHP 5> = 5.2.0, PHP 7)

Ver también: ¿Por qué es mejor usar filter_input ()?


Cuando tu dices:

$user = $_POST["username"];

Le está pidiendo al intérprete de PHP que asigne a $user el valor de la matriz $_POST que tiene una clave (o índice) de username de username . Si no existe, PHP lanza un ataque.

Use isset($_POST[''user'']) para verificar la existencia de esa variable:

if (isset($_POST[''user''])) { $user = $_POST["username"]; ...


En PHP, una variable o elemento de matriz que nunca se ha establecido es diferente de uno cuyo valor es null ; intentar acceder a dicho valor sin configurar es un error de tiempo de ejecución.

Eso es con lo que te estás encontrando: la matriz $_POST no tiene ningún elemento en el índice "username" , por lo que el intérprete aborta tu programa antes de que llegue a la prueba de nulidad.

Afortunadamente, puede probar la existencia de una variable o elemento de matriz sin intentar realmente acceder a ella; eso es lo que hace el operador especial isset :

if (isset($_POST["username"])) { $user = $_POST["username"]; echo $user; echo " is your username"; } else { $user = null; echo "no username supplied"; }

Parece que explotará exactamente de la misma manera que su código, cuando PHP intenta obtener el valor de $_POST["username"] para pasar como argumento a la función isset() . Sin embargo, isset() no es en realidad una función en absoluto, sino una sintaxis especial reconocida antes de la etapa de evaluación, por lo que el intérprete de PHP verifica la existencia del valor sin intentar realmente recuperarlo.

También vale la pena mencionar que, como van los errores de tiempo de ejecución, un índice de matriz faltante se considera de menor importancia (se le asigna el nivel E_NOTICE ). Si cambia el nivel de error_reporting para que los avisos se ignoren, su código original funcionará tal como está escrito, con el intento de acceso a la matriz devolviendo null . Pero eso se considera una mala práctica, especialmente para el código de producción.

Nota al margen: PHP realiza la interpolación de cadenas, por lo que las instrucciones de echo en el bloque if se pueden combinar en una sola:

echo "$user is your username";


En lugar de isset() puede usar algo más corto para obtener errores silenciados, es @$_POST[''field''] . Luego, si el campo no está configurado, no obtendrá ningún error impreso en una página.


Prueba esto:

Uso esto en todas partes donde hay una solicitud $ _POST.

$username=isset($_POST[''username'']) ? $_POST[''username''] : "";

Esto es solo un booleano de mano corta, si no, lo establecerá en $ _POST [''nombre de usuario'']; si no, lo configurará en una cadena vacía.

Ejemplo de uso:

if($username===""){ echo "Field is blank" } else { echo "Success" };


Sé que esta es una publicación anterior pero alguien puede ayudar:

function POST($index, $default=NULL){ if(isset($_POST[$index])) { if(!empty(trim($_POST[$index]))) return $_POST[$index]; } return $default; }

Este código de arriba es mi función POST básica que uso en cualquier lugar. Aquí puedes poner filtros, expresiones regulares, etc. Es más rápido y limpio. Mi función POST avanzada es más complicada para aceptar y verificar matrices, tipo de cadena, valores predeterminados, etc. Déjenos trabajar su imaginación aquí.

Puede verificar el nombre de usuario de esta manera:

$username = POST("username"); if($username!==null){ echo "{$username} is in the house."; }

También agregué $default cadena por $default que puede definir algún valor predeterminado si POST no está activo o el contenido no existe.

echo "<h1>".POST("title", "")."</h1>";

Juega con ello.


Su código asume la existencia de algo:

$user = $_POST["username"];

PHP le informa que no hay un "nombre de usuario" en la matriz $_POST . En este caso, sería más seguro verificar si el valor isset() antes de intentar acceder a él:

if ( isset( $_POST["username"] ) ) { /* ... proceed ... */ }

Alternativamente, puedes hojear el || operador para asignar un valor predeterminado:

$user = $_POST["username"] || "visitor" ;

Siempre que el nombre del usuario no sea falso , puede considerar que este método es bastante confiable. Una ruta mucho más segura a la asignación por defecto sería usar el operador ternario:

$user = isset( $_POST["username"] ) ? $_POST["username"] : "visitor" ;


Utilizar:

if (isset($_POST[''user''])) { //do something }

Pero probablemente deberías estar usando una validación más adecuada. Pruebe con una simple expresión regular o una implementación sólida de Zend Framework o Symfony.

http://framework.zend.com/manual/en/zend.validate.introduction.html

http://symfony.com/doc/current/book/validation.html

O incluso la extensión de filtro incorporada:

http://php.net/manual/en/function.filter-var.php

Nunca confíes en la entrada del usuario, sé inteligente. No confíes en nada Siempre asegúrate de que lo que recibas sea realmente lo que esperas. Si debe ser un número, asegúrese de que sea un número.

Código muy mejorado:

$user = filter_var($_POST[''user''], FILTER_SANITIZE_STRING); $isValid = filter_var($user, FILTER_VALIDATE_REGEXP, array(''options'' => array(''regexp'' => "/^[a-zA-Z0-9]+$/"))); if ($isValid) { // do something }

Sanitización y validación


tratar

if(isset($_POST[''username''])) echo $_POST[''username'']." is your username"; else echo "no username supplied";


Pregunta relacionada: ¿Cuál es la mejor manera de acceder a elementos de matriz desconocidos sin generar un aviso de PHP?

Con la respuesta de la pregunta anterior, puede obtener de manera segura un valor de $ _POST sin generar un aviso de PHP si la clave no existe.

echo _arr($_POST, ''username'', ''no username supplied''); // will print $_POST[''username''] or ''no username supplied''