Я запутался в потоке переменных $ _POST [] и обычных переменных - PullRequest
1 голос
/ 25 декабря 2011

У меня есть простая форма, которую я создал, и в ней у меня есть следующий флажок:

<input type="checkbox" name="test">

Примечание: эта форма отправляется сама себе.

Над формой у меня есть следующий PHP:

if (empty($_POST['test'])) {
    $thevalue = 0;
} else {
    $thevalue = 1;
}
var_dump($thevalue);

Когда я обрабатываю форму, я получаю то, что ожидал.Если я установлю флажок и отправлю запрос, я получу int(1), если я оставлю его без проверки, я получу int(0).


В первой строке моего PHP-кода я хочу заменить $_POST['test'] нанекоторая простая переменная.

Поэтому я добавил следующую строку над моим кодом:

$simplevar = $_POST['test']

Затем я заменил условие в моем if statement на empty($simplevar)

Но когда я отправляю форму, я получаю "Notice: Undefined index:" сообщение об ошибке

  1. Почему это происходит?
  2. Предполагая, что можно достичь того, чего я добился (т.е. вставить $ _POST в $ simplevar), как мне это сделать?

Заранее спасибо за вашу помощь!

PS: У меня может быть продолжение этого вопроса, но я не хотел загромождать вещи, заталкивая их сюда.

Еще раз спасибо ... о, и счастливого Рождества!; -)

Ответы [ 5 ]

0 голосов
/ 25 декабря 2011

Во-первых, вы должны всегда проверять, что переменные в $ _POST, $ _REQUEST и $ _GET установлены, прежде чем пытаться их использовать.Всегда обрабатывайте условие, когда они не установлены, даже если вы просто выводите ошибку.

Поскольку ошибка является неопределенным индексом, кажется, что ошибка в тесте не устанавливается в $ _POST, хотя это не делаетмного смысла.Я бы добавил проверку, может быть, echo или var dump для проверки $ _POST.Если он установлен, другая проблема может быть проблемой с областью действия.$ _POST - это нечто суперглобальное, что делает его доступным в любой области.Переменные, которые вы устанавливаете, вам, возможно, потребуется сделать глобальными, определив их как таковые, если вы хотите получить к ним доступ через области.

0 голосов
/ 25 декабря 2011

Это ожидаемое поведение.Если вы присваиваете переменную следующим образом:

$simplevar = $_POST['test'];

, тогда переменная $ _POST может отсутствовать.Затем среда выполнения Zend назначает значение NULL, но дает полезную подсказку отладки, если это не то, что вы хотели.

Когда вы использовали empty() ранее, проверьтесуществование переменной было встроено. empty() является языковой конструкцией.Как и isset(), он часто используется, чтобы избегать таких уведомлений.Громоздкий синтаксис, имитирующий такое поведение языка:

$simplevar = empty($_POST['test']) ? NULL : $_POST['test'];

Встроенный язык для:

$simplevar = @( $_POST['test'] );

Теперь я буду жарен за упоминание этого.(Использование @ полезно, если вы хотите вернуть отладочные уведомления в какой-то момент, в то время как пустые и isset конструкции вечно их подавляют.)

0 голосов
/ 25 декабря 2011

Это происходит потому, что если вы не установите флажок, браузер не отправляет серверу никакого значения для этого элемента управления при отправке формы.Из-за этого $_POST['test'] не определено, и вы попытались использовать его без проверки того, существует ли он, поэтому вы получите предупреждение.Одна из проверок, которую выполняет empty(), состоит в том, чтобы видеть, установлено ли значение.Таким образом, когда вы используете $_POST ключи непосредственно в empty(), вы не получите сообщение об ошибке, но когда вы попытаетесь использовать его в назначении без этой проверки, вы получите ошибку.Вы можете делать примерно то, что хотите, вам просто нужно немного изменить логику.Если вы сделаете:

$simplevar = !empty($_POST['test']);
// You could also do
// $simplevar = isset($_POST['test']);

if ($simplevar) {
  // The box was checked
} else {
  // The box was not checked
}

... он сделает то, что вы хотите, без ошибки.При таком подходе $simplevar всегда содержит логическое значение, указывающее, был ли установлен флажок.

0 голосов
/ 25 декабря 2011

Значения флажка передаются, только если флажок установлен. Это означает, что непроверенные флажки не будут появляться в массиве $_POST.

Чтобы исключить уведомление от PHP, используйте ссылку вместо переменной:

$simplevar =& $_POST['test'];
if(empty($simplevar)) $thevalue = 1;
else $thevalue = 0;
0 голосов
/ 25 декабря 2011

Если флажок снят, он не добавляется в массив $_POST в качестве ключа, поэтому $simplevar = $_POST['test'] возвращает опубликованную вами ошибку.Использование empty() позволяет обойти эту проблему путем empty() лучшей обработки ошибок (ну, в любом случае, молча).

Вы не указали, получаете ли вы эту ошибку, когда флажок установлен или нет, но приведенное выше объяснение - единственное, что я могу дать.Если вы не уверены, попробуйте сделать print_r($_POST), чтобы увидеть, что на самом деле содержит $_POST.

Решением вашей проблемы было бы использование троичного выражения для обработки ошибки немного лучше:

$simplevar = isset($_POST['test']) ? 0 : 1;

Это назначит 0 для $simplevar, если $_POST['test'] не установлен (флажок не установлен), или 1 в противном случае.


Убедитесь, что всекод обработки вашей формы помещен внутрь

if(!empty($_POST)) {
    // Code
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...