Index non défini avec $ POST [dupliquer]

cette question a déjà une réponse ici:

  • "notice: Undefined variable", "notice: Undefined index", et "notice: Undefined offset" à l'aide de PHP 27 Réponses

j'essaye de réapprendre quelques bases de PHP pour faire un script de connexion simple, cependant je reçois une erreur que je n'ai pas j'ai fait le même script il y a un peu plus d'un an et je n'ai jamais eu cette erreur. J'ai simplifié le code autant que j'ai pu pour tester pour voir quelle zone était problématique et voici la question:

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

maintenant ce code fonctionne très bien quand j'envoie une variable au script, mais quand Aucune variable n'est fournie il crache une erreur. En théorie, ce sera très bien car si aucun nom d'utilisateur/pass n'est fourni alors une erreur est attendue. Je vérifierai pour être sûr de cela avant le code est envoyé au script, mais je crains qu'une chaîne vide ne sorte et ne recrache une erreur inconnue. Voici l'erreur que j'ai:

( ! ) Notice: Undefined index: username in C:wampwwwverify_login.php on line 2

Call Stack

    Time    Memory  Function    Location
1   0.0003  668576  {main}( )   ..verify_login.php:0

pas de nom d'utilisateur fourni

comme vous pouvez voir le code enregistre qu'Aucune variable n'a été fournie, mais il donne et l'erreur que je suppose signifie qu'une variable n'a pas été trouvée où une était prévue ou quelque chose comme ça. Est-ce que quelqu'un peut clarifier ça pour moi?

35
demandé sur Xander Luciano 2012-05-30 08:19:50

10 réponses

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 désactiver est une erreur d'exécution.

C'est ce que vous rencontrez: le tableau $_POST n'a pas d'élément à l'index "username" , donc l'interpréteur annule votre programme avant qu'il n'arrive au test de nullité.

Heureusement, vous pouvez tester l'existence d'une variable ou un élément de tableau sans vraiment essayer d'y accéder; c'est ce que 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";
}

on dirait qu'il va exploser exactement de la même manière que votre code, lorsque PHP essaie d'obtenir la valeur de $_POST["username"] pour passer en argument à la fonction isset() . Cependant, isset() n'est pas vraiment une fonction du tout, mais une syntaxe spéciale reconnue avant l'étape d'évaluation, donc l'interpréteur PHP vérifie pour l'existence de la valeur sans essayer de le récupérer.

il est également intéressant de mentionner que, comme les erreurs d'exécution vont, un index de tableau manquant est considéré comme un mineur (assigné le niveau E_NOTICE ). Si vous changez le niveau error_reporting de sorte que les notices soient ignorées, votre code original fonctionnera réellement comme écrit, avec l'accès au tableau essayé retournant null . Mais c'est considéré comme une mauvaise pratique, surtout pour le code de production.

note latérale: PHP fait une interpolation de chaîne de caractères, de sorte que les déclarations echo dans le bloc if peuvent être combinées en une seule:

echo "$user is your username";
44
répondu Mark Reed 2016-11-28 16:41:04

utiliser:

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

mais vous devriez probablement utiliser une validation plus correcte. Essayez un regex simple ou une implémentation rock-solid de Zend Framework ou 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 à l'utilisateur, soyez intelligent. Ne fais confiance à rien. Assurez-vous toujours que ce que vous recevez est vraiment ce que vous attendez. Si c'est un nombre, assurez-vous que c'est un nombre.

Beaucoup à l'amélioration du code:

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

assainissement et validation.

6
répondu vinnylinux 2012-05-30 04:27:56

votre code suppose l'existence de quelque chose:

$user = $_POST["username"];

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

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

alternativement, vous pouvez brancher l'opérateur || pour assigner un défaut:

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

aussi longtemps que le nom de l'utilisateur n'est pas une valeur falsy , vous pouvez considérer cette méthode assez fiable. Une voie beaucoup plus sûre vers l'assignation par défaut serait d'utiliser l'opérateur ternaire:

$user = isset( $_POST["username"] ) ? $_POST["username"] : "visitor" ;
3
répondu Sampson 2012-05-30 04:25:08

Avant PHP 5.2.0 et au-dessus, vous devez utiliser filter_input() qui est spécialement créé pour cela pour obtenir un utilisateur externe spécifique entrées telles que get, post ou des variables cookie par nom et filtre en option pour éviter toute attaque XSS/Injection sur votre site. Par exemple:

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

vous pouvez utiliser un de INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, ou INPUT_ENV.

en utilisant le 3ème argument optionnel, vous peut l'étendre par une variété de filtres (pour validation , assainissement , filtrage ou autre ), p.ex. 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:

mixte filter_input ( int $type , string $nom_variable [, int $filtre = FILTER_DEFAULT [, mixed $ options ]])

(PHP 5 >= 5.2.0, PHP 7)

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

2
répondu kenorb 2017-05-23 11:46:59

quand vous dites:

$user = $_POST["username"];

vous demandez à L'interpréteur PHP d'attribuer à $user la valeur du tableau $_POST qui a une clé (ou un index) de username . S'il n'existe pas, PHP fait une crise.

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

if (isset($_POST['user'])) {
  $user = $_POST["username"];
  ...
1
répondu Blender 2012-05-30 04:23:52

au lieu de isset() vous pouvez utiliser quelque chose de plus court pour réduire les erreurs, c'est @$_POST['field'] . Ensuite, si le champ n'est pas défini, vous n'obtiendrez aucune erreur imprimée sur une page.

1
répondu Damian Czapiewski 2014-12-23 22:29:47

essayez ceci:

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

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

ce n'est qu'un petit booléen de la main, si isset le définit à $_POST['username'], sinon il le définira à une chaîne vide.

exemple d'utilisation:

if($username===""){ echo "Field is blank" } else { echo "Success" };
1
répondu user3284463 2015-10-04 09:42:24

essayer

if(isset($_POST['username']))
    echo $_POST['username']." is your username";
else
    echo "no username supplied";
0
répondu white-shy-guy 2012-05-30 04:25:15

je sais que c'est un ancien poste mais quelqu'un peut aider:

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

ce code ci-dessus sont ma fonction de poste de base ce que j'utilise n'importe où. Ici vous pouvez mettre des filtres, des expressions régulières, etc. Est plus rapide et propre. Ma fonction de POST avancé est plus compliquée pour 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.";
}

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

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

joue avec.

0
répondu Ivijan Stefan Stipić 2016-03-23 16:10:37

question connexe: Quelle est la meilleure façon d'accéder aux éléments de réseau inconnus sans générer de notice PHP?

en utilisant la réponse de la question ci-dessus, vous pouvez obtenir en toute sécurité une valeur de $_POST sans générer de notice PHP si la clé n'existe pas.

echo _arr($_POST, 'username', 'no username supplied');  
// will print $_POST['username'] or 'no username supplied'
-2
répondu flowfree 2017-05-23 11:54:34