Intereting Posts

Неопределенный индекс с $ _POST

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

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

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

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

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

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

Solutions Collecting From Web of "Неопределенный индекс с $ _POST"

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

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

 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

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

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

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

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

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

 $user = $_POST["username"]; 

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

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

В качестве альтернативы, вы могли бы hi-jack || оператора для назначения значения по умолчанию:

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

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

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

Когда ты говоришь:

 $user = $_POST["username"]; 

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

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

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

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

Попробуй это:

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

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

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

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

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

До 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.

Используя необязательный третий аргумент, вы можете расширить его различными фильтрами (для проверки , дезинфекции , фильтрации или других ), например 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 ()?

пытаться

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

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

 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 string, что вы можете определить какое-то значение по умолчанию, если POST не активен или контент не существует.

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

Играть с этим.

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

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

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