web-dev-qa-db-fra.com

Index non défini avec $ _POST

J'essaie de réapprendre quelques PHP notions de base pour la création d'un script de connexion simple, mais j'obtiens une erreur que je n'ai pas reçue auparavant (j'ai créé le même script il y a un peu plus d'un an et je ne l'avais jamais J'ai simplifié le code autant que je pouvais pour tester pour voir quel domaine était problématique et voici le problème:

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

Maintenant, ce code fonctionne bien lorsque j'envoie une variable au script, mais lorsqu'aucune variable n'est fournie, cela génère une erreur. En théorie, cela ira, car si aucun nom d'utilisateur/mot de passe n'est fourni, une erreur est attendue. Je vérifierai pour m'assurer de cela avant que le code ne soit envoyé au script, mais je crains qu'une chaîne vide ne puisse pénétrer et cracher une erreur inconnue. Voici l'erreur que je reçois:

( ! ) 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

aucun nom d'utilisateur fourni

comme vous pouvez le constater, aucune variable n’a été fournie dans les registres de code, mais il y a une erreur qui, je suppose, signifie qu’une variable n’a pas été trouvée si elle était attendue ou quelque chose du genre. Quelqu'un peut-il s'il vous plaît clarifier cela pour moi?

37
Xander Luciano

En PHP, une variable ou un élément de tableau qui n'a jamais été défini est différent de celui dont la valeur est null; tenter d'accéder à une telle valeur non définie est une erreur d'exécution.

C'est ce que vous rencontrez: le tableau $_POST Ne contient aucun élément à la clé "username", Aussi l'interpréteur abandonne-t-il votre programme avant même qu'il ne passe au test de nullité.

Heureusement, vous pouvez tester l'existence d'une variable ou d'un élément de tableau sans essayer réellement d'y accéder. c'est ce que fait l'opérateur spécial isset:

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

Cela ressemble à une explosion de la même manière que votre code, lorsque PHP tente d'obtenir la valeur de $_POST["username"] À transmettre en tant qu'argument à la fonction isset(). Cependant, isset() n’est pas vraiment une fonction, mais une syntaxe spéciale reconnue avant l’étape de l’évaluation, donc l’interprète PHP vérifie l’existence du valeur sans réellement essayer de la récupérer.

Il convient également de noter que, si les erreurs d’exécution disparaissent, un élément de tableau manquant est considéré comme mineur (affecté du niveau E_NOTICE). Si vous modifiez le niveau error_reporting De sorte que les notifications soient ignorées, votre code d'origine fonctionnera tel quel, avec la tentative d'accès au tableau renvoyée renvoyant null. Mais cela est considéré comme une mauvaise pratique, en particulier pour le code de production.

Note latérale: PHP effectue une interpolation de chaîne. Ainsi, les instructions echo du bloc if peuvent être combinées en une seule:

echo "$user is your username";
50
Mark Reed

Utilisation:

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

Mais vous devriez probablement utiliser une validation plus appropriée. Essayez une expression rationnelle simple ou une implémentation solide comme celle de Zend Framework ou de Symfony.

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

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

Ou même l'extension de filtre intégrée:

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

Ne faites jamais confiance aux entrées des utilisateurs, soyez intelligent. Ne fais confiance à rien. Assurez-vous toujours que ce que vous recevez correspond vraiment à vos attentes. Si ce doit être un nombre, assurez-vous que c'est un nombre.

Code grandement amélioré:

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

Désinfection et validation.

6
vinnylinux

Votre code suppose l'existence de quelque chose:

$user = $_POST["username"];

PHP vous informe qu'il n'y a pas de "nom d'utilisateur" dans le tableau $_POST. Dans ce cas, il serait plus sûr de vérifier si la valeur isset() avant d'essayer d'y accéder:

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

Alternativement, vous pouvez hi-jack l'opérateur || Pour lui attribuer un défaut:

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

Tant que le nom de l'utilisateur n'est pas une valeur falsy, vous pouvez considérer cette méthode comme relativement fiable. L’utilisation de l’opérateur ternaire serait une solution beaucoup plus sûre pour l’affectation par défaut:

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

Avant PHP 5.2.0 et supérieur, vous devriez utiliser filter_input() ], spécialement créé pour cela afin de permettre à un utilisateur externe spécifique d'entrer tel que get , postez ou modifiez les variables de cookies par leur nom et éventuellement les filtre pour éviter toute attaque XSS/Injection sur votre site.

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

Vous pouvez utiliser INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER ou INPUT_ENV.

En utilisant le 3ème argument optionnel, vous pouvez l’étendre par une variété de filtres (pour validation , désinfection , filtrage ou autre ), par exemple FILTER_SANITIZE_SPECIAL_CHARS, FILTER_SANITIZE_ENCODED, etc.

Par exemple:

<?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 syntaxe est la suivante:

mixte filter_input (int $ type, chaîne $ nom_variable [ int $ filtre = FILTER_DEFAULT [ options mixtes $]])

(PHP 5> = 5.2.0, PHP 7)

Voir aussi: Pourquoi est-il préférable d'utiliser filter_input ()?

2
kenorb

Au lieu de isset(), vous pouvez utiliser quelque chose de plus court pour obtenir des erreurs en sourdine, c’est @$_POST['field']. Ensuite, si le champ n'est pas défini, aucune erreur ne sera imprimée sur une page.

2
Damian Czapiewski

Essaye ça:

J'utilise ceci partout où il y a une requête $ _POST.

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

Ceci est juste un booléen, si isset il le définira à $ _POST ['nom d'utilisateur'], sinon il le définira à une chaîne vide.

Exemple d'utilisation:

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

Quand tu dis:

$user = $_POST["username"];

Vous demandez à l’interprète PHP d’attribuer à $user La valeur du tableau $_POST Comportant une clé (ou un index) de username S'il n'existe pas, PHP réussit un coup.

Utilisez isset($_POST['user']) pour vérifier l'existence de cette variable:

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

Je sais qu'il s'agit d'un ancien message, mais quelqu'un peut vous aider:

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

Ce code ci-dessus correspond à ma base POST, fonction que j’utilise n'importe où. Vous pouvez y mettre des filtres, des expressions rationnelles, etc. Est plus rapide et propre. Mon avancé POST La fonction est plus compliquée à accepter et à vérifier les tableaux, le type de chaîne, les valeurs par défaut, etc. Laissez votre imagination travailler ici.

Vous pouvez facilement vérifier le nom d'utilisateur comme ceci:

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

J'ai aussi ajouté $default chaîne que vous pouvez définir une valeur par défaut si POST) n'est pas actif ou le contenu n'existe pas.

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

Joue avec.

1

essayer

if(isset($_POST['username']))
    echo $_POST['username']." is your username";
else
    echo "no username supplied";
0
white-shy-guy