Php isset

Here are some handy wrappers to isset that I use when I need to do common evaluations like: this variable is set and has a length greater than 0, or: I want the variables value, or a blank, if not set.

/**
 * isset_echo()
 *
 * Accomplishes the following w/o warnings:
 *    echo $x;
 *    echo $x[$y];
 *    echo $x[$y][$z];
 *
 * FIXME: make this recursive so it works for N args?
 */
function isset_echo($x, $y=Null, $z=Null)
{
    if (is_array($x)) {
        if (array_key_exists($y, $x)) {
            if (is_array($x[$y])) {
                if (array_key_exists($z, $x[$y])) { echo $x[$y][$z]; }
            }
            else { echo $x[$y]; }
        }
    }
    else { echo $x; }
}


/**
 * isset_value()
 *
 * As above, but returns value instead of echoing
 */
function isset_value(&$x, $y=Null)
{
    if (is_array($x)) {
        if (array_key_exists($y, $x)) { return $x[$y]; }
    }
    else { return $x; }
}

/**
 * isset_and_equals()
 *
 * As above, but ...
 * Returns true if variable (or array member) is set and equaL to the first parameter
 */
function isset_equals($val, $w, $x=null, $y=null, $z=null) {
    if (is_array($w)) {
                if (array_key_exists($x, $w)) {
                if (is_array($w[$x])) {
                        if (array_key_exists($y, $w[$x])) {
                                    if (is_array($w[$x][$y])) {
                        .
;                                } else {
                                        return ($w[$x][$y] == $val) ? true : false;
                                    }
                            }
                    } else {
                        return ($w[$x] == $val) ? true : false;
                    }
        }
    } else {
                return ($w == $val) ? true : false;
        }
}

/**
 * isset_gt0()
 *
 * As above, but returns true only if var is set and it's length is > 0
 */
function isset_gt0(&$x)
{
    if (isset($x) && strlen($x) > 0) { return true; }
    else { return false; }
}

www.theserverpages.com

php_self-isset-уроки-phpДоброго времени суток.
Немножко изменить уроки. Начиная с этого урока я буду составлять план урока, так, как это делают в учебных заведениях.

План урока:
1. Объединение HTML файла и PHP обработчика и применение функции isset();
2. Повторный вывод HTML формы, если в ней есть незаполненные поля;
3. Повторный вывод HTML формы и запоминание ранее ведённых данных. PHP_SELF;
4. Вывод ошибок под полями формы;
5. Заключение и несколько слов о следующем уроке.

1. Объединение HTML файла и PHP обработчика.

На примере страницы add_mailer.php. Когда мы уводим данные и забываем заполнить одно из полей, мы видим ошибку и что бы ее исправить, мы возвращаемся средствами браузера назад и вынуждены заполнять все поля заново. А что если мы выведем ошибку и форму в одном файле? Конечно, это не сбережет ранее веденные данные, но уже нам не нужно будет делать лишнюю манипуляцию возврата.
Давайте объединим файл HTML и PHP в один файл PHP:


php_self-isset-уроки-php_Error01
Теперь давайте откроем наш файл: http://my.domain/add_mailer.php. И нам сразу выдало ошибку. Почемe выводится ошибка, если мы не нажимали на отправку формы? Вот тут нам и пригодится isset(). PHP не знает, открыли вы эту страницу впервые или после нажатия на кнопку «ОТПРАВИТЬ». Напишем код, который будет сообщать PHP о том, была ли форма отравлена при помощи кнопки «ОТПРАВИТЬ»:

Теперь PHP знает, когда страница http://my.domain/add_mailer.php была открыта впервые и данные формы проверять не нужно, а когда форма была отправлена кнопкой «ОТПРАВИТЬ» – данные уже проверять нужно.

2. Повторный вывод HTML формы, если в ней есть незаполненные поля;

Сейчас у нас форма выводится всегда, независимо от того, была ошибка или нет. Это хорошо, если у формы были ошибки, но если форма была заполнена правильно, и данные были успешно добавленные в базу данных, повторный вывод формы может ввести в заблуждение пользователя, который хочет подписаться на вашу рассылку. Нам нужно уведомить PHP, когда нужно выводить HTML форму, а когда нет. Для этого используем простой способ:


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

Получается, если есть ошибка – вывести форму и саму ошибку. Если ошибки нет – отправить данные в БД, вывести сообщение об успешном добавлении подписчика в БД и форму выводит не нужно. Что бы не увеличивать длину страницы, скачайте внизу страницы файлы урока, и посмотрите, как это работает.

3. Повторный вывод HTML формы и запоминание ранее ведённых данных;

Конечно, у нас уже и форма выводится и ошибки показываются, когда нужно. Но форма всегда обновляется и выводится пустая. А что если сделать так, при условии вывода ошибки, форма будет запоминать ранее заполненные данные? Хорошая идея, что упростить нам жизнь. HTML сам по себе не умеет сохранять данные. Первый момент который нужно знать – это куда отправляет данные форма action=»add_mailer.php». Оно хорошо работает, но если вы случайный образом или специальным переименуете этот файл, оно уже работать не будет. Для того, что бы уменьшить проблемы в будущем, мы будем используем суперглобальную переменную $_SERVER[‘PHP_SELF’]. Эта переменная PHP, которая отправляет данные формы сама на себя. Используем это в нашем скрипту:


И проверим работоспособность нашего кода. Не работает! Посмотрите внимательно, почему не работает. $_SERVER[‘PHP_SELF’]. – суперглобальная переменная PHP, а мы ее вставили как обычный код HTML, а нам нужно, что бы его распознавал PHP:

А вот теперь все работает так, как нужно! Это не супер новация, но это будет считаться хорошим кодом. Теперь перейдем к тому, как сделать форму интеллектуальной. В каждой поле input можно присвоить стандартный текст свойством value. Например:

php_self-isset-уроки-php_01

Результат этого кода вы можете смотреть на скриншоте. Что бы форма выводила текст, данные, которые были введены до нажатия кнопки «ОТПРАВИТЬ», нужно создать переменные, которые будут содержать данные конкретного поля формы и выводить их содержание в форме value. Например:

Что тут происходит: при захождении на форму, страницу формы в первый раз, наши переменные пустые, и в полях ничего не будет. Как только в поле формы было что вписано и была нажата кнопка «ОТПРАВИТЬ», уже в дело вступает PHP код проверки, иными словами – код валидации формы. Первое что у нас происходит – это получение и заполнение переменных с $_POST.

$_POST – может принимать вид $_GET, если в передачи формы используется метод GET, а не POST: method=»post».


Далее у нас идет проверка на заполнение форм, но нам это уже не интересно. Получается, что у нас уже есть возможность вывести данные формы, которые были отправленные нажатием кнопки «ОТПРАВИТЬ».

4. Вывод ошибок под полями формы.

Форма умеет запоминать данные, ошибка выводится и это только после нажатия кнопки «ОТПРАВИТЬ». Можно и выводит ошибки и сверху формы, так как оно есть сейчас, но я думаю, что лучше выводить ошибки под конкретным полем, что бы человек знал, где конкретно нужно править. И так, начнем:

Вставил весь код. Всмотритесь в него. Что тут происходит: если сохраняется какое-то условие, например когда мы забыли указать имя подписчика, у нас присваивается переменной $error_firstname соответствующий текст ошибки. И так у всех остальных случаях. Для того, что бы эти ошибки выводились, нужно написать что-то подобное:

php_self-isset-уроки-php_Error02

Как видно с кода, мы выводим данные переменных, если они существуют и не пустыне под каждым полем формы. Обратите внимание, что вывод данных переменных написано через конструкцию if(), что есть хорошим методом написания кода. Чуть не забыл о стилях, внесите в конец файла style.css:


5. Заключение и несколько слов о следующем уроке.

Как обещал в этом уроке я написал урок, где мы будем применять функцию isset(). Думаю писать плюсы о объединении файла HTML с PHP нет нужды, вы сами можете увидеть их в самом уроке. Сегодня узнали о новой суперглобальной переменной PHP_SELF, в контексте $_SERVER[‘PHP_SELF’]. Научились делать «умную форму», выводит ошибки в местах ошибок, что предает плюсу к юзабилити нашей мини CMS.В следующем уроке поговорим о проблемах дублей E-mail адресов, как их можно удалить из базы данных и узнаем что такое уникальный идентификатор записей в таблице БД.

С наилучшими намерениями, ProIN!

Скачать файлы урока:
lesson_files

www.glogla.net

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


Еще больше меня «порадовали» комментарии одного «незнакомого» знакомого, который удивился моему негодованию. Как оказалось, о существовании функции array_key_exists() он что-то слышал, но сам никогда ею не пользовался. Более того, где-то читал, что ее лучше заменять на isset(), так как последняя работает быстрее.

Собственно, об уровне квалификации PHP программистов сказано немало и добавить к этому нечего.

Инициализация и удаление переменной в PHP

В PHP переменная инициализируется в момент присваивания ей значения. Неинициализированной переменная считается в двух случаях:

  • ей не присваивалось никакого значения;
  • ей было присвоено значение типа NULL или она была передана функции unset().

Присваивание NULL значения удаляет переменную, аналогично функции unset(), то есть делает ее неинициализированной.

Если попытаться использовать переменную, которая была удалена с помощью unset(), будет сгенерирована ошибка уровня E_NOTICE. С переменной, приведенной к NULL, такого не произойдет.

Функция isset()

Функция проверяет факт инициализации переменной. isset() вернет false, если передать ей в качестве параметра неинициализированную переменную. Тоже самое произойдет и с ключом массива, который имеет NULL значение. Для ключей массива действуют такие же правила приведения к NULL, как и для переменных.

$nullVar = null;    var_dump($nullVar);    $array = array(   'key_str' => 'foo',   'key_null' => null,   'key_int' => 1  );    var_dump($array);    

Результат:

  null    array   'key_str' => string 'foo' (length=3)   'key_null' => null   'key_int' => int 1  

Функция array_key_exists()

Работа функции array_key_exists() похожа на isset(), но с той лишь разницей, что даже для ключа с NULL значением будет возвращено TRUE.

$array = array(   'key_str' => 'foo',   'key_null' => null,   'key_int' => 1  );    var_dump(array_key_exists('key_null', $array)); // Вернет boolean true

Чтобы полностью удалить пару ключ-значение необходимо использовать unset().

Для массива использование NULL значения ключа удобно, если наличие ключа требуется сохранить. Можно будет рассчитывать на контекст, в котором данный ключ будет использован. Например, это удобно при заполнении полей формы дефолтными значениями. Например, при использовании конструкции echo, NULL значение будет приведено к пустой строке.

То, к чему я клоню, мне кажется очевидным. Если вы работаете с ключами массива, то используйте именно ту функцию, которая для этого предназначена. Ко всему прочему, использование array_key_exists() позволяет точно понять логику приложения. Никакой двусмысленности не возникает.

Скорость работы isset() и array_key_exists()

О том, что array_key_exists() работает медленнее isset() пишут даже в комментариях к соответствующей странице PHP мануала. Жалуются на то, что более медленная работа array_key_exists() заметна на массивах с количеством пар ключ-значение, превышающих 200.

Ничего не остается, как прогнать банальный тест:

$testArray = array(   883209 => 568420,   553314 => 266114,   133088 => 367615,   // ...  );    $timerStart = microtime();    for ($i = 0; $i < 100000; $i++) {   //if (isset($testArray[rand(1, 99999)]));   if (array_key_exists(rand(1, 99999), $testArray));  };    $timerEnd = microtime();    echo $timerEnd - $timerStart;  

Ассоциативный массив $testArray содержит 10 000 элементов. Это несколько больше, чем упомянутые 200.

Далее прогоняем цикл с количеством итераций 100 000. В теле цикла, по очереди, сначала делаем проверку с помощью isset(), затем с помощью array_key_exists(). Ключ, наличие которого проверяем, генерируется случайным образом, чтобы свести к минимуму вероятность его существования в массиве.

isset() array_key_exists()
0.687027 0.728652

Тест, безусловно, очень простой и достаточно субъективный. Было бы неплохо сделать замеры используемой памяти, например. Но глядя на результаты этого теста, у меня нет никакого желания продолжать заниматься мышиной возней. Очевидно, что выигрыша в скорости попросту нет.

Функция isset() и свойства объекта

Совсем клиническим случаем можно считать использование isset() для проверки существования свойства у объекта.

Не так часто, как в случае с массивами, но доводится встречать подобные условия:

class Foo  {   public $property = null;     public function __construct() {      }  }    $object = new Foo();    if (!isset($object->property)) {   echo 'property not exists';  }

Случай вопиющий, так как использование NULL в качестве дефолтного значения свойств – очень распространенная практика. И проверять наличие свойства объекта через isset() просто недопустимо.

Для проверки существования свойства у объекта в PHP существует функция property_exists(). Как и array_key_exists(), property_exists() вернет TRUE даже в том случае, если значение свойства приведено к NULL.

Также замечу, что для использования property_exists() не требуется наличие объекта класса. Проверку можно произвести по имени класса и имени свойства.

class Foo  {   public $property = null;     public function __construct() {      }  }    var_dump(property_exists('Foo', 'property')); // Вернет true

Такое вот занимательное программирование.

omurashov.ru

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

Один вот нюанс я заметил, что часто встречается у разработчиков на PHP это люди путают назначение функций empty и isset.

Вот вам пример, как вам кажется этот код хорош или нет?

if(isset($params['alias'])) $where[] = 'alias = "'.addslashes($params['alias']).'"';

я даже не буду ничего говорить про addslashes без проверки magic_quotes* если вы не новичок вам и так понятно, да и всё же дальше используется dibi библиотека в которой есть гибкий и очень удобный конструктор запросов и плэйсхолдер по умолчанию. Что люди не используют всех возможностей библиотек и так ясно, это просто лень почитать одностраничный ман.

Речь не об этом, речь об isset и empty.

Что мы знаем об empty? Это на самом деле простая директива или конструкция языка, которая проверяет переменную на пустоту и не выдаёт предупреждения, если даже переменная не определена, то есть она совмещает в себе функцию isset

empty() is the opposite of (boolean) var, except that no warning is generated when the variable is not set.)

Второе, что такое пустота для PHP. Именно за такие вещи многие не любят PHP или многие не любят после PHP другие языки, когда пустота в них имеет определенное значение например nil (Ruby, puts nil.class) или undefined (JS).

В PHP пустота это 0, "", array(), 0.0, FALSE, Null или просто даже без значения определенная переменная:

The following things are considered to be empty:
"" (an empty string)
0 (0 as an integer)
0.0 (0 as a float)
«0» (0 as a string)
NULL
FALSE
array() (an empty array)
var $var; (a variable declared, but without a value in a class)

История с isset вообще проще, это так же конструкция языка, которая проверяет только две вещи: объявлена ли переменная ($var; например) и не является ли она NULL!
Всё!

То есть получается, что вот код.

$name = '';  if( isset($name) ) echo "Hello {$name}n";  if( !empty($name) ) echo "Good night {$name}n";

Выдаст всё же не тот что нам как бы нужен:
> Hello

Так и выше код соберётся с ненужным условием и даже скорее неправильным (!!!) условием, когда было происходит сбор параметров

   $params['alias'] = $_GET['alias'];  ...  // сбор sql запроса, для PHP переменная $params['alias'] всё же объявлена, НО ПУСТАЯ!  if(isset($params['alias'])) $where[] = 'alias = "'.addslashes($params['alias']).'"';  

ваш SQL запрос получится смешного вида alias = '', хотя я уверен вам бы хотелось видеть его совсем иного вида.

Поэтому я всё же правильнее понимать отличия где и когда использовать isset и empty.

Удачи, оставайтесь на стороне разума!

ufacode.ru

Всем доброго времени суток. На связи Алексей Гулынин. В прошлой статье мы разобрали типы переменных в php. В данной короткой статье я хотел бы отдельное внимание уделить операторам isset() и unset(). Это одни из самых важных операторов в языке PHP. Используются они везде. Оператор isset() служит для определения того, существует (инициализирована) переменная или нет. Проверить это можно так:

  <?php  if (isset($myvar))   	echo "Переменная существует"; else echo "Переменной не существует";  ?>  

В данной программе мы использовали конструкцию if (условие) Выражение1; else Выражение2, о которой раньше не говорили. Эта конструкция называется условным оператором и, простым языком, означает "если условие выполняется — делай так, если нет — делай по-другому". Об условном операторе поговорим в следующих статьях.

Если переменной в данный момент не существует, или она была удалена из программы вручную, или с помощью оператора unset(), то данная конструкция (имеется ввиду isset($myvar)) вернет значение "Ложь". Если переменная существует, то вернется значение "Истина".
По-хорошему говоря, в программе лучше не использовать неинициализированных переменных, так как будут появляться предупреждения от интерпретатора. Однако, предупреждения можно выключить, и тогда все неинициализированные переменные будут полагаться равными пустой строке. Моё мнение, что лучше этого избегать, чтобы в дальнейшем не пришлось отлавливать различные трудноуловимые ошибки.

Уничтожение переменной выполняется оператором unset().

После выполнения действия этого оператора переменная удаляется из внутренних таблиц интерпретатора. Программа начинает работать так, как будто данная переменная ещё не была инициализирована.
Применение unset() для работы с обычными переменными редко бывает необходимо, данный оператор лучше использовать, например, для удаления элемента из ассоциативного массива. Пусть нам необходимо удалить элемента массива $massiv с ключом del. Это можно сделать следующим образом: unset($massiv["del"]). Теперь элемент del не просто стал пустым, он именно удалился. Если теперь перебрать массив, то данный элемент не будет обнаружен.
На многих сайтах есть авторизация. После того, как вы авторизовались, обычно становится доступна кнопка "Выход". Так знайте, обычно функция выхода реализована с помощью оператора unset().

На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.


alekseygulynin.ru


You May Also Like

About the Author: admind

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

Adblock
detector