Подтвердить что ты не робот

Undefined индекс с $_POST

Я пытаюсь переучивать некоторые основы PHP для создания простого входа script, однако я получаю сообщение об ошибке, которое я еще не получил (я сделал тот же самый script чуть больше года назад и никогда не имел этой ошибки. Я упростил код настолько, насколько мог, чтобы проверить, какая область была проблематичной, и вот в чем проблема:

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

Теперь этот код отлично работает, когда я отправляю переменную в script, но когда никакая переменная не указана, она выплевывает ошибку. Теоретически это будет хорошо, потому что если имя пользователя/пароль не указано, ожидается ошибка. Я буду проверять, чтобы убедиться в этом, прежде чем код будет отправлен на script, однако я боюсь, что какая-то пустая строка может просочиться и выплеснуть какую-то неизвестную ошибку. Вот ошибка, которую я получаю:

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

не указано имя пользователя

поскольку вы можете видеть регистры кода, что никакая переменная не была предоставлена, но она выдаёт и ошибка, которую я предполагаю, означает, что переменная не была найдена, ожидалось или что-то вроде этого. Может кто-нибудь прокомментировать это для меня?

4b9b3361

Ответ 1

В PHP элемент переменной или массива, который никогда не был установлен, отличается от значения, значение которого null; попытка получить доступ к этому неустановленному значению - это ошибка времени выполнения.

Это то, над чем вы работаете: массив $_POST не имеет никакого элемента в индексе "username", поэтому интерпретатор прерывает вашу программу до того, как она когда-либо попадет в тест нечетности.

К счастью, вы можете проверить наличие элемента переменной или массива без фактического доступа к нему; что делает специальный оператор isset:

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

Похоже, что он взорвется точно так же, как ваш код, когда PHP пытается получить значение $_POST["username"] для передачи в качестве аргумента функции isset(). Тем не менее, isset() на самом деле не является функцией вообще, но специальный синтаксис, распознанный до этапа оценки, поэтому интерпретатор PHP проверяет существование значения, не пытаясь его извлечь.

Также стоит упомянуть, что по мере того как ошибки времени выполнения идут, недостающий индекс массива считается второстепенным (назначается уровень E_NOTICE). Если вы измените уровень error_reporting, чтобы уведомления были проигнорированы, ваш исходный код действительно будет работать как написанный, а попытка доступа к массиву вернется null. Но это считается плохой практикой, особенно для производственного кода.

Примечание: PHP интерпретирует строку, поэтому операторы echo в блоке if могут быть объединены в один:

echo "$user is your username";

Ответ 2

Использование:

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

Но вы, вероятно, должны использовать более правильную проверку. Попробуйте простое регулярное выражение или реалистичную реализацию из Zend Framework или Symfony.

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

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

Или даже встроенное расширение фильтра:

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

Никогда не доверяйте пользовательским вводам, будьте умны. Не верьте никому. Всегда следите за тем, что вы получаете, это то, что вы ожидаете. Если он должен быть числом, сделайте УЛУЧШЕНЬ его числом.

Значительно улучшенный код:

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

Санитария и валидация.

Ответ 3

Ваш код предполагает существование чего-то:

$user = $_POST["username"];

PHP дает вам знать, что в массиве $_POST нет "имени пользователя". В этом случае вам будет безопаснее проверять, есть ли значение isset(), прежде чем пытаться получить к нему доступ:

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

В качестве альтернативы вы можете приветствовать оператора || для назначения по умолчанию:

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

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

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

Ответ 4

Когда вы говорите:

$user = $_POST["username"];

Вы попросите интерпретатора PHP присвоить $user значение массива $_POST, у которого есть ключ (или индекс) username. Если он не существует, PHP выдает подгонку.

Используйте isset($_POST['user']) для проверки наличия этой переменной:

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

Ответ 5

Вместо isset() вы можете использовать что-то более короткое, приглушение ошибок, это @$_POST['field']. Затем, если поле не установлено, вы не получите сообщение об ошибке на странице.

Ответ 6

Попробуйте следующее:

Я использую это везде, где есть запрос $_POST.

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

Это всего лишь короткая ручная логическая операция, если isset установит ее в $_POST ['username'], если нет, то она установит ее в пустую строку.

Пример использования:

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

Ответ 7

До PHP 5.2.0 и выше вы должны использовать filter_input(), который специально создан для этого, чтобы получить определенные внешние пользовательские входы такие как переменные get, post или cookie по имени и, возможно, фильтрует его, чтобы избежать атак XSS/Injection на вашем сайте. Например:

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

Вы можете использовать один из INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER или INPUT_ENV.

Используя необязательный третий аргумент, вы можете расширить его с помощью filters (для проверка, дезинфекция, фильтрация или прочее), например FILTER_SANITIZE_SPECIAL_CHARS, FILTER_SANITIZE_ENCODED и т.д.

Например:

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

Синтаксис:

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

(PHP 5 >= 5.2.0, PHP 7)

Смотрите также: Почему лучше использовать filter_input()?

Ответ 8

попробовать

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

Ответ 9

Я знаю, что это старый пост, но кто-то может помочь:

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

Этот код выше - моя основная функция POST, которую я использую в любом месте. Здесь вы можете поместить фильтры, регулярные выражения и т.д. Быстрее и чисты. Моя расширенная функция POST более сложна для принятия и проверки массивов, типа строк, значений по умолчанию и т.д. Пусть ваше воображение работает здесь.

Вы легко можете проверить имя пользователя следующим образом:

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

Также я добавил строку $default, которую вы можете определить по умолчанию, если POST не активен или контент не существует.

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

Играйте с ним.

Ответ 10

Связанный вопрос: Каков наилучший способ доступа к неизвестным элементам массива без уведомления PHP?

Используя ответ из вышеизложенного вопроса, вы можете безопасно получить значение из $_POST без генерации уведомления PHP, если ключ не существует.

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