Php mail () эхо показывает все время [дубликат]

Если вы не инициализировали ссылочный тип и хотите установить или прочитать одно из его свойств, он будет генерировать исключение NullReferenceException.

Пример:

Person p = null;
p.Name = "Harry"; // NullReferenceException occurs here.

Вы можно просто избежать этого, проверив, является ли переменная не нулевой:

Person p = null;
if (p!=null)
{
    p.Name = "Harry"; // Not going to run to this point
}

Чтобы полностью понять, почему выбрано исключение NullReferenceException, важно знать разницу между типами значений и ссылочные типы .

Итак, если вы имеете дело со типами значений, NullReferenceExceptions не может произойти. Хотя вам нужно поддерживать оповещение при работе со ссылочными типами!

Только ссылочные типы, как следует из названия, могут содержать ссылки или буквально буквально ничто (или «нуль»). Если типы значений всегда содержат значение.

Типы ссылок (эти должны быть проверены):

  • динамический
  • объект
  • string

Типы значений (вы можете просто игнорировать эти):

  • Числовые типы
  • Интегральные типы
  • Типы с плавающей запятой
  • decimal
  • bool
  • Пользовательские структуры

75
задан eliwedel 16 August 2010 в 21:15
поделиться

13 ответов

if( isset($_POST['fromPerson']) )
{
     $fromPerson = '+from%3A'.$_POST['fromPerson'];
     echo $fromPerson;
}
131
ответ дан ehmad 26 August 2018 в 08:19
поделиться
  • В этом случае использование метода isset не подходит.

Согласно документации PHP: http://php.net/manual/en/function .array-key-exists.php (см. пример # 2 array_key_exists () vs isset ()) Метод array_key_exists предназначен для проверки присутствия ключа в массиве.

Итак, код в вопрос может быть изменен следующим образом:

function fromPerson() {
   if (array_key_exists('fromPerson', $_POST) == FALSE) {
        return '';
   } else {
        return '+from%3A'.$_POST['fromPerson'];
   };
}

$newString = fromPerson();

  • Проверка наличия массива $ _POST не требуется, поскольку это глобальная переменная среды PHP с версии 4.1.0 (в настоящее время мы не встречаем более старые версии PHP).
8
ответ дан Bronek 26 August 2018 в 08:19
поделиться
  • 1
    Этот код отличается только поведением от решения isset, когда поле post задано, но содержит NULL. Это хорошая альтернатива , , если вы хотите разрешить NULL в ветви else. Однако , это ошибка, если требуется строка; в этой ситуации isset делает правильную вещь, но этот код этого не делает - он передаст значение NULL. Более поздний ответ Роберта демонстрирует разницу. – ToolmakerSteve 8 January 2017 в 04:03
if (is_array($_POST) && array_key_exists('fromPerson', $_POST)) {
    echo 'blah' . $_POST['fromPerson'];
}
2
ответ дан jezmck 26 August 2018 в 08:19
поделиться
  • 1
    Does is_array ($ _ POST) проверить, есть ли вообще значения в POST? В моем приложении я пытаюсь определить, было ли сообщение или нет, прежде чем делать что-либо еще. – jlafay 9 February 2011 в 03:49
  • 2
    См. Мое редактирование. is_array() проверяет, является ли это массивом, вторая часть проверяет, имеет ли он элемент с ключом 'fromPerson'. – jezmck 10 February 2011 в 10:07

Удивленный он не упоминался

if($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['fromPerson'])){
23
ответ дан John Magnolia 26 August 2018 в 08:19
поделиться
  • 1
    Зачем? Если метод сервера не является POST, тогда переменная POST не будет установлена, поэтому вторая половина - это все, что необходимо. Я ошибаюсь? – ToolmakerSteve 4 November 2015 в 18:04
  • 2
    @ToolmakerSteve да в большинстве случаев это достаточно, но не всегда мой ответ должен был показать другой способ, которым это можно было бы сделать. – John Magnolia 13 December 2015 в 11:11
  • 3
    Он также будет работать, если у вас есть форма с флажками и отправьте без имени. – John Magnolia 6 March 2016 в 21:56
  • 4
    Опишите ситуацию, когда isset($_POST['fromPerson'] - true, хотя if($_SERVER['REQUEST_METHOD'] == 'POST' - false. Если не существует такой ситуации, все, что необходимо, это часть isset.... – ToolmakerSteve 8 January 2017 в 03:13

Все методы на самом деле обескуражены, это предупреждение в Netbeans 7.4, и, безусловно, хорошей практикой является не прямой доступ к сверхглобальным переменным, вместо этого используйте фильтр

$fromPerson = filter_input(INPUT_POST, 'fromPerson', FILTER_DEFAULT);
if($fromPerson === NULL) { /*$fromPerson is not present*/ }
else{ /*present*/ }
var_dump($fromPerson);exit(0);
5
ответ дан linuxatico 26 August 2018 в 08:19
поделиться
  • 1
    С другой стороны, важна также ЧИСЛЕННОСТЬ кода. IMHO, isset намного читабельнее, чем выражение фильтра. Но спасибо, что указали это; это полезный вариант для рассмотрения. – ToolmakerSteve 4 November 2015 в 18:13
  • 2
    ну, вы можете написать свой собственный метод myIsset / 2 wrapper, который использует фильтры, но имеет поведение isset / 2 – linuxatico 5 November 2015 в 09:28
  • 3
    «Все методы фактически обескуражены». - это сильное утверждение (даже если NetBeans отмечает как предупреждение). У вас есть ссылка на авторитетный источник , который запрещает прямые ссылки на $ _POST? (Существует лот о php, который предназначен для удобства кодирования, а не строгости - посмотрите, сколько людей в ответах на этот вопрос неправильно используют empty, сработали неуправляемым типом php, его жесткий что доступ к $ _POST будет считаться плохим стилем.) – ToolmakerSteve 8 January 2017 в 03:55

Простой. У вас есть два варианта:

1. Проверьте, есть ли вообще какие-либо данные о записи

//Note: This resolves as true even if all $_POST values are empty strings
if (!empty($_POST))
{
    // handle post data
    $fromPerson = '+from%3A'.$_POST['fromPerson'];
    echo $fromPerson;
}

(OR)

2. Проверяйте, доступен ли только ОПЫТЫЙ ключ в почтовых данных

if (isset($_POST['fromPerson']) )
{
    $fromPerson = '+from%3A'.$_POST['fromPerson'];
    echo $fromPerson;
}
43
ответ дан Molimo 26 August 2018 в 08:19
поделиться
  • 1
    Согласно комментарию Ши на ответе Августа Фрэнсиса , empty() является не правильным для выбора # 1, потому что в php строка '0' эквивалентна false - и empty() возвращает true для все значения, эквивалентные false . Поэтому, используя empty, код будет пропускать печать, если значение было '0'. Если вы хотите исключить пустую строку, см. Ответ Августа. – ToolmakerSteve 8 January 2017 в 03:38

if( isset($_POST['fromPerson']) ) прав.

Вы можете использовать функцию и вернуться, а затем направлять эхо.

1
ответ дан Moslem Ben Dhaou 26 August 2018 в 08:19
поделиться
  • 1
    Этот ответ ничего не добавляет к обсуждению, о котором ранее не говорилось в других ответах years . – ToolmakerSteve 8 January 2017 в 03:34

Мне нравится проверять, является ли он iset и если он пуст в тройном операторе.

// POST variable check
$userID  = (isset( $_POST['userID'] )    && !empty( $_POST['userID'] ))   ? $_POST['userID']   :  null;
$line    = (isset( $_POST['line'] )      && !empty( $_POST['line'] ))     ? $_POST['line']     :  null;
$message = (isset( $_POST['message'] )   && !empty( $_POST['message'] ))  ? $_POST['message']  :  null;
$source  = (isset( $_POST['source'] )    && !empty( $_POST['source'] ))   ? $_POST['source']   :  null;
$version = (isset( $_POST['version'] )   && !empty( $_POST['version'] ))  ? $_POST['version']  :  null;
$release = (isset( $_POST['release'] )   && !empty( $_POST['release'] ))  ? $_POST['release']  :  null;
0
ответ дан Raymondim 26 August 2018 в 08:19
поделиться
  • 1
    empty('0') - true. Поэтому лучше не иметь version 0 или userID 0 и т. Д. – Shi 8 January 2017 в 02:55

Правильный способ проверки наличия ключа массива - это функция array_key_exists()

. Разница в том, что когда вы имеете $_POST['variable'] = null, это означает, что ключ существует и отправляется, но значение равно null

Другим вариантом является isset(), который будет проверять, существует ли ключ массива, и если он был установлен

Последний параметр - использовать empty(), который будет проверять, существует ли ключ массива, если он установлен и если значение не считается пустым.

Примеры:

$arr = [
  'a' => null,
  'b' => '',
  'c' => 1
];

array_key_exists('a', $arr); // true
isset($arr['a']); // false
empty($arr['a']); // true


array_key_exists('b', $arr); // true
isset($arr['b']); // true
empty($arr['b']); // true


array_key_exists('c', $arr); // true
isset($arr['c']); // true
empty($arr['c']); // false

Что касается вашего вопроса

Правильный способ проверить, было ли отправлено значение, это использовать array_key_exists ( ) с проверкой метода запроса

if ($_SERVER['REQUEST_METHOD'] == 'POST' && array_key_exists('fromPerson', $_POST)    
{
   // logic
}

Но есть некоторые случаи, зависящие от вашей логики, где isset() и empty() также могут быть хорошими.

8
ответ дан Robert 26 August 2018 в 08:19
поделиться
  • 1
    Фантастический ответ, за исключением предложения использовать empty. Согласно замечанию Ши на ответе Августа Фрэнсиса , empty() является не правильным в качестве альтернативного выбора, потому что в php строка '0' эквивалентна false - и empty() возвращает true для всех значений, эквивалентных false . Поэтому, используя empty, код будет пропускать печать, если значение было '0'. Если вы хотите исключить пустую строку, см. Ответ Августа. – ToolmakerSteve 8 January 2017 в 03:45
isset($_POST['fromPerson']) 
17
ответ дан Robert Harvey 26 August 2018 в 08:19
поделиться

Попробуйте isset ($_POST['fromPerson'])?

2
ответ дан strager 26 August 2018 в 08:19
поделиться

Все говорят использовать isset () - что, вероятно, будет работать для вас.

Однако важно понимать разницу между

$_POST['x'] = NULL; и $_POST['x'] = '';

isset($_POST['x']) вернет false в первом примере, но вернет true на второй, даже если вы попытаетесь распечатать один из них, оба возвращают пустое значение.

Если ваш $_POST поступает из введенного пользователем поля / формы и остается пустым, я ВЕРЮ (я не на 100% уверен в этом), что значение будет «", но NOT NULL.

Даже если это предположение неверно (кто-то, пожалуйста, поправьте меня, если я ошибаюсь!) выше все еще полезно знать для будущего использования.

30
ответ дан takrl 26 August 2018 в 08:19
поделиться
  • 1
    это тоже помогло! благодаря – eliwedel 17 August 2010 в 00:19
  • 2
    empty () проверяет существование переменной и непустое значение, поэтому это функция, которую следует использовать, когда пустая строка должна возвращать false. – Han Dijk 30 July 2013 в 14:11
  • 3
    @HanDijk - согласно комментарию Shi на ответе Августа Фрэнсиса , empty() здесь не здесь, потому что в php строка '0' эквивалентна false - и empty() возвращает true для все значения, эквивалентные false . Поэтому, используя empty, код будет пропускать печать, если значение было '0'. – ToolmakerSteve 8 January 2017 в 03:23

Попробуйте

if (isset($_POST['fromPerson']) && $_POST['fromPerson'] != "") {
    echo "Cool";
}
3
ответ дан user 26 August 2018 в 08:19
поделиться
  • 1
    неправильные кривые: $ _POST ('fromPerson') = & gt; $ _POST [ 'fromPerson'] – paka 3 December 2013 в 15:50
  • 2
    Комментарий Пер Хан Дийка к ответу Рафаэля empty($_POST['fromPerson']) делает этот комбинированный тест. Легче читать и печатать :) – ToolmakerSteve 4 November 2015 в 18:19
  • 3
    @ToolmakerSteve: empty('0') возвращает true. Так что это не то же самое. – Shi 8 January 2017 в 02:53
  • 4
    @Shi - да, вы правы; что я сказал не так! Кажется, нет более простого решения, чем приведенный здесь код. – ToolmakerSteve 8 January 2017 в 03:19
Другие вопросы по тегам:

Похожие вопросы: