Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функции empty(), неожиданый результат работаы 
V
    Опции темы
krundetz
Дата 6.12.2007, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Доброго времени суток форумчане!
Есть следующий код.
Код

<?php
$d=0;
if(!empty($d))
{
    print "YES";
}
else
{
    print "NO";
}
?>

Затруднение мое в том что немогу понять почему в браузер выводится "NO", хотя в соответствие с описанием этой функции она проверяет переменную на предмет присвоения ей какого-либо значения отличного от NULL, а следовательно должно выводится "YES". Может кто разъяснить ситуацию?


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
bars80080
Дата 6.12.2007, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



чего тут объяснять, мануал -> читать

функция empty (в переводе: пустой) проверяет значение на пустоту,
то есть в твоём примере, NO будет если перенной не существует, и если она равна: false, "", 0

PM MAIL WWW   Вверх
skyboy
Дата 7.12.2007, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(krundetz @  6.12.2007,  15:19 Найти цитируемый пост)
она проверяет переменную на предмет присвоения

на предмет присвоения проверяет isset
PM MAIL   Вверх
krundetz
Дата 7.12.2007, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Да видимо мой мануал(РНР5 библия профессионала. Леон Аткинсон, Зеев Сураски) можно выкинуть на помойку.

Возникает вопрос как мне правильно проверит есть ли переменная и не присвоено ли ей пустое значение . Достаточно ли будет проверять только функцией isset() пришло ли значение в массив POST или GET если мне не важно какого оно типа(только не пустое), а потом я пропускаю его через фильтр чтобы избежать SQL-инекций.


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
bars80080
Дата 10.12.2007, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



тогда лучше isset($_REQUEST['perem'])

но я лично делаю наоборот,
вначале инициализирую все нужные переменные:
Код

if(!empty($_REQUEST['perem'])) $perem = $_REQUEST['perem']; else $perem = '';

а потом уже проверяю их на пустоту:

!empty($perem)
PM MAIL WWW   Вверх
DioNiR
Дата 10.12.2007, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 30.12.2006

Репутация: нет
Всего: нет



Читаем мануал:
Цитата

Возвращаемые значения

Returns FALSE if var has a non-empty and non-zero value. 

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


От сюда и делай вывод.
--------------------
Думали это конец? Ха, всё только начинается.
PM MAIL   Вверх
krundetz
Дата 10.12.2007, 17:51 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Цитата(bars80080 @ 10.12.2007,  10:59)
но я лично делаю наоборот,
вначале инициализирую все нужные переменные:
Код

if(!empty($_REQUEST['perem'])) $perem = $_REQUEST['perem']; else $perem = '';

а потом уже проверяю их на пустоту:

!empty($perem)

Тоесть вы два раза делаете одинаковую проверку одного значения? Я правильно понял? Если правильно то зачем?


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
bars80080
Дата 10.12.2007, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



всё зависит от подхода,
инициализация и проверка разные вещи
я просто подключаю библиотеку со своими функциями, где есть вот такая:
Код

function htmlSCC($mvelem, $useHSC='y') {
    for($i = 0; isset($mvelem[$i]); $i++) { 
        $a = $mvelem[$i]; global $$a;
        if(!isset($_REQUEST[$a])) { $$a = ''; }
        else {
            if($useHSC == 'y') { $$a = HtmlSpecialChars($_REQUEST[$a]); }
            elseif($useHSC == 'php') { $$a = str_replace('<?', '', $_REQUEST[$a]); $$a = str_replace('?'.'>', '', $$a); }
            else { $$a = $_REQUEST[$a]; }}}}

просто усложнённый вариант if(!empty($_REQUEST['perem'])) $perem = $_REQUEST['perem']; else $perem = '';
а в тексте самой страницы вначале задаю переменные:
Код

$mv = array('p_page', 'p_name', 'p_con', 'begin'); htmlSCC($mv);

в итоге я получаю нужные мне переменные, которые я ожидаю, с истриблёнными html-тэгами, php (если требуется)
или с пустыми значениями, но существующие
в дальнейшем их можно использовать в коде не заботясь, что php будет ругаться на несуществующие переменные
PM MAIL WWW   Вверх
krundetz
Дата 12.12.2007, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Спасибо за ответы. В результате пришел к следующему коду для проверке есть ли переменная и не пустая(т.е. переменная может быть чем угодно кроме пустой строки) ли она:
Код

<?php
//Проверяю пришла ли переменная 'a'
if(isset($_GET['a']))
{
    $a = $_GET['a'];
    //есле пришла то проверяю её на пустату
    if($a != "")
    {
        echo "Переменная не пуста и ее можно обрабатывать далее";
    }
    else
    {
        echo "Пременная пуста";
    }
}
?>
<a href="http://t/r.php?a">r</a><br/>
<a href="http://t/r.php?a=">r</a><br/>
<a href="http://t/r.php?a=1">r</a><br/>

Является ли данный код достаточным и не избыточным?

bars80080 Отдельное спасибо вам.
Не совсем понял про инициализацию и проверку какие бывают подходы? Вроде всегда сначала проверяем пришедшее значение на пригодность а потом в случае соответствия определенным критерия проводим инициализацию.


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
SelenIT
Дата 12.12.2007, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 32
Всего: 401



Цитата(krundetz @  12.12.2007,  10:49 Найти цитируемый пост)
Является ли данный код достаточным и не избыточным?

Смотря для какой цели. Для заявленной - имхо, вполне...

Цитата(krundetz @  12.12.2007,  10:49 Найти цитируемый пост)
Вроде всегда сначала проверяем пришедшее значение на пригодность а потом в случае соответствия определенным критерия проводим инициализацию.

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


Это сообщение отредактировал(а) SelenIT - 12.12.2007, 11:01


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
bars80080
Дата 12.12.2007, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



всё зависит от целей и привычных приёмов работы, мне легче объявить все переменные изначально (заметьте с устранёнными злонамеренными тэгами и т.п.), а потом уже использовать их

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

код достаточен,
а избыточен или нет зависит от того, что вы хотите

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

PM MAIL WWW   Вверх
Feldmarschall
Дата 12.12.2007, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 22
Всего: 32



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

Непонятно только, что будет происходить, если проверка вернет ложь. То есть, что будет делать реальный скрипт вместо "echo "Пременная пуста";" в тестовом. Если все равно создавать $a, то зачем такие телодвижения с проверкой на пустоту. Если она дальше будет использоваться, то наверняка будут и другие проверки на допустимость, а значит, среди них можно и пустоту проверить.
PM   Вверх
krundetz
Дата 12.12.2007, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Цитата

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

Конечно да. Далее она обрабатывается фильтром для зашиты от инекций и помещается в базу данных.
Цитата
Непонятно только, что будет происходить, если проверка вернет ложь. То есть, что будет делать реальный скрипт вместо "echo "Пременная пуста";" в тестовом. 

В этом случае пользователю выводится сообщение что его действия некорректны.


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
Feldmarschall
Дата 12.12.2007, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 22
Всего: 32



Цитата(krundetz @  12.12.2007,  11:23 Найти цитируемый пост)
Далее она обрабатывается фильтром для зашиты от инекций 

какое красивое название для одной-единственной функции mysql_real_escape_string smile

Цитата(krundetz @  12.12.2007,  11:23 Найти цитируемый пост)
и помещается в базу данных.

Если она помещается в базу данных, значит запрос приходит методом POST. Если запрос приходит методом POST, то текстовые переменные не имеет смысла проверять на наличие по отдельности. Вполне достаточно проверить наличие только самого запроса POST.

Так что, код является избыточным.

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

Я думаю, в твоем случае надо эти проверки разнести. 
PM   Вверх
krundetz
Дата 12.12.2007, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Цитата

Если она помещается в базу данных, значит запрос приходит методом POST.

Да у меня метод POST. Только почему вы так однозначно уверены в том что метод GET не используется для занесения в БД. Простейшей пример при заходе на страницу увеличение счетчика ее просмотров.
Цитата

какое красивое название для одной-единственной функции mysql_real_escape_string

Не одной единственной. Не забывайте что что на сервере могут быть включены волшебные кавычки и то что mysql_real_escape_string не экранирует % и _
Цитата

Если запрос приходит методом POST, то текстовые переменные не имеет смысла проверять на наличие по отдельности. Вполне достаточно проверить наличие только самого запроса POST.

И к чему это приведет если кто-то захочет поэксперементировать с тем как мои скрипты обрабатывают данные пришедшие методом POST
Цитата

Я думаю, в твоем случае надо эти проверки разнести. 

 smile 


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0992 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.