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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как упростить выражение, $a=isset($_GET['a'])?$_GET['a']:false  
:(
    Опции темы
BuShaRt
Дата 3.5.2007, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1391
Регистрация: 29.6.2006

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



А вот и наглядный пример, того как нельзя использовать @
 smile 
PM MAIL   Вверх
GZep
Дата 3.5.2007, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


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

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



BuShaRt, а почему же нельзя?


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
BuShaRt
Дата 3.5.2007, 17:13 (ссылка) |   (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1391
Регистрация: 29.6.2006

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



GZep
Все ошибки и нотейсы должны выводиться пре откладке 
и
полностью скрываться на уровне конфигурации PHP пре использование движка.

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

Если копать глубже, то конструкция
Код

$a=isset($_GET['a'])?$_GET['a']:false; 

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

if (@$_GET['a'])
   print "переменная пришла";


т.е. по суте ты предлагаешь вернуться к старым, непродуманным методам кодирования, когда есть методы более современные и поддержанные видущими программистами...
PM MAIL   Вверх
mishaSL
Дата 3.5.2007, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1046
Регистрация: 10.1.2007
Где: Санкт-Петербург

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



Цитата(sergejzr @  3.5.2007,  13:20 Найти цитируемый пост)
хотелось бы чтото вроде:

$а=ifset($_GET['a'],false);


Если хочется так, то не пойму в чем проблема:
Код

<?php
error_reporting(E_ALL);

function ifset(& $variable, $whatReturn = false)
{
    return (isset($variable) ? $variable : $whatReturn);
}

$_POST['a'] = 'переменная "а" в массиве POST';
var_dump(ifset($_GET['a'],false));
var_dump(ifset($_POST['a'],'нет'));
var_dump(ifset($var,'нет'));

?>


Или я что-то упустил? Никак не могу понять в чем проблема написания данной функции?



--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
SelenIT
Дата 3.5.2007, 19:51 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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


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


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


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

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



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

а лично я вижу в этом подходе только преимущества в сравнении с "раздельным хранением":
1) ортодоксальный алгоритм загрузки и перекрытия дефолтных значений(не "сколько переменных - столько и вызовов функций", а один foreach)
2) данные, которые могут прийти из форм, собраны в одной переменной - массиве: так что внешние связи отделены от внутренних. Удобно и компактно для изменения.
3) (скорее, камень в огород "раздельнохранимости") очень часто надо инициировать переменные, хранящие значения из форм, дефолтными значениями на случай отсутсвия данных.
При раздельном хранении будет дополнительно ещё куча строк с присвоением. В случае массива - одна строка инициализации массива smile
PM MAIL   Вверх
GZep
Дата 3.5.2007, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


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

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



Цитата(BuShaRt @  3.5.2007,  17:13 Найти цитируемый пост)
    
$a=isset($_GET['a'])?$_GET['a']:false; 

никакой ошибки isset не генерирует!
Цитата(BuShaRt @  3.5.2007,  17:13 Найти цитируемый пост)
if (@$_GET['a'])
   print "переменная пришла";

и тут тоже никакой ошибки не генерируется!
Цитата(BuShaRt @  3.5.2007,  17:13 Найти цитируемый пост)
Все ошибки и нотейсы должны выводиться пре откладке 

не в этом случае. Тут просто проверяем существование переменной и все.

if (@...) - абсолютно не старый способ и его как раз ведущие программисты и используют. А ваш isset будет пропускать все значения кроме null, поэтому его надо использывать в связке с empty => слишком громоздкая конструкция - ниодин "ведущий" программист так писАть не будет.


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
BuShaRt
Дата 4.5.2007, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1391
Регистрация: 29.6.2006

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



GZep
я понял в чем проблема, ты просто не знаешь значение оператора @.
Это вовсе не сокращенная форма isset, а сокрытие ошибок...

Удостоверься
Код

var_dump(isset($_GET['a']));
var_dump(@$_GET['a']);



mishaSL
А что в данном случае означает оператор & ?
PM MAIL   Вверх
mishaSL
Дата 4.5.2007, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1046
Регистрация: 10.1.2007
Где: Санкт-Петербург

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



Цитата(BuShaRt @  4.5.2007,  12:26 Найти цитируемый пост)
mishaSL, 
А что в данном случае означает оператор & ? 

Передача аргумента в функцию по ссылке.


--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
BuShaRt
Дата 4.5.2007, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1391
Регистрация: 29.6.2006

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



mishaSL
Что то знакомое, но вспомнить не могу, можно  чуть поподробние?
PM MAIL   Вверх
Kallisto
Дата 4.5.2007, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: -3
Всего: -1



Уважаемые, конструкция: $a= isset($_GET["a"])?$_GET["a"]:false;
неправильная, хотя бы потому, что если вы дальше будете использовать конструкцию: if(!$a) {если нету} то эта конструкция будет выполняться также и если а установлена и равна 0. ;)

Для упрощения работы с формамы я использую (если количество переменных динамическое значение) масивы переменных.
то есть 
Код

<input ... name=a[0]> 
<input ... name=a[1]>
...
<input ... name=a[n]>

Очень удобно потом проверять ;)
если устанолвена A, то проверяем их количество, если не совпало - форма пришла левая.
Если совпало, проверили на SQL баги, и удобно делать проверки с помощью циклов.

надеюсь вам помог )

Добавлено через 3 минуты и 5 секунд
BuShaRt, это значит что передается не значение переменной, а ее ссылка.
то есть:
Код

$a=1;

function change_a(& $some)
{
$some=2;
}

echo $a;
change_a($a);
echo $a;

PM MAIL   Вверх
CyClon
Дата 4.5.2007, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код
<?php

// Функиця для ручной проверки
function varCheck(&$var, $default = '')
{
    return (isset($var)) ? $var : $default;
}

// Использование
$_GET['a'] = varCheck($_GET['a'], false);

?>


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

Добавлено через 2 минуты и 16 секунд
ЗЫ: Оказалось парня успел поправить уже mishaSL )

Это сообщение отредактировал(а) CyClon - 4.5.2007, 14:32


--------------------
user posted image
PM   Вверх
BuShaRt
Дата 4.5.2007, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1391
Регистрация: 29.6.2006

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



Kallisto
Очень правильная конструкция, просто ее использоваь надо с умом, а не пихать куда попало smile
По большей часте ею проверяються GET-запросы, причем не с форм...

Вот пример:
Код

$action = isset($_REQUEST['a'])? $_REQUEST['a'] : 'viewpage';
$page = isset($_REQUEST['p'])? $_REQUEST['p'] : 'price';

Т.е. мы можем далее смело использовать переменные $action и $page
Код

if ($action == 'del_user'){

}

if ($action == 'del_download'){

}

if ($action == 'save_img'){
    
}


*Смело, если конечно не передаем эти данные в уязвимые места кода... но это другая история...


Всем
Спасибо, что открыли мне оператор &.

Добавлено через 6 минут и 24 секунды
Выдержка из стать: Осторожно, данные!
Автор: Кузьма Феськов

Первое правило безопасности
Первое, что вы должны научиться делать, это принимать данные из правильных источников.
Основные источники данных в PHP – это суперглобальные массивы, в частности $_GET и
$_POST. Приучайте себя брать данные именно из этих массивов. Также не лишним будет
отметить, и тот факт, что параметр php.ini register_globbals должен быть off.
Немного поясню последнее замечание о register_globbals. Ни раз мною замечалось – до сих пор
многие программисты не понимаю почему этот параметр важно устанавливать в значение off.
Многим кажется удобным, что переменные, переданные в скрипт методом POST или GET сразу
появляются в пространстве скрипта и готовы к использованию. Однако, это удобство крайне
обманчиво. Во-первых, если вы используете в своем скрипте какую-то переменную и заранее не
позаботились об инициализации ее значения, то, дописав в URL ее название, я легко могу
переопределить ее значение на нужное мне, в результате ваш скрипт этого даже не заметит. Во-
вторых, вы никогда не будете знать точно, каким именно образом вам передана та или иная
переменная. Есть и другие менее значимые факторы. Исходя из всех этих замечаний, легко
понять, что опасность подобного подхода весьма велика и он прямо ставит под угрозу написанные
вами скрипты.
PHP Inside'18 >> Идеи >> Осторожно, данные!
После небольшого отступления, давайте перейдем к практике. Итак, к нам поступила (или не
поступила) переменная методом GET:
Код

1.URL:/index.php?variable=10

О переменной мы заранее знаем, что она придет методом GET, будет содержать целое число.
Первым делом, мы присваиваем значение локальной переменной. Естественно, многие сделали
это следующим способом:
Код

<?php
    $variable = $_GET['variable'];
?>

Однако, что произойдет в том случае, если переменная не пришла (возможно кто-то пытался
испытать ваш скрипт на прочность и стер ее из URL)? Правильно – вы получите сообщение об
ошибке (NOTICE мы договорились считать ошибкой). Чтобы этого не произошло, необходимо
изменить наш код следующим образом:
Код

<?php
 $variable = isset($_GET['variable']) : (int)$_GET['variable'] : 0;
?>

Для простоты кода и удобства, я применил в данном случае так называемую короткую нотацию
оператора if. В обычном виде скрипт выглядел бы так:
Код

<?php
if (isset($_GET['variable'])) {
    $variable = (int)$_GET['variable'];
} else {
    $variable = 0;
}
?>

Но, согласитесь, эта запись слишком громоздка.
Давайте вернемся к нашему коду. Мы с вами использовали команду isset, которая проверяет
наличие переменной или индекса в массиве, и возвращает false если такого элемента нет, и true,
если он есть. Что позволяет нам избежать обращения к несуществующему элементу. Поскольку
мы заранее знаем, что эта переменная может содержать только целые числа, то, не анализируя ее
содержимое, мы приводим его к целому числу. В данном случае мы применили короткую команду
(int), которая эквивалентна intval(). Даже если вам передадут в этой переменной вместо числа
строку, данная команда приведет ее к числу 0, что является целым числом и вполне удовлетворяет
нашему требованию.
Это, безусловно, очень простой пример, но он способен показать все хитросплетения и повороты,
которые подстерегают нас на пути написания скрипта.
Итак, первое правило: Всегда берите значения там, откуда они должны придти в скрипт.
Всегда проверяйте переменные и индексы массивов на существование перед их
использованием. Всегда инициализируйте значения переменных перед их использованием.
PM MAIL   Вверх
GZep
Дата 4.5.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


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

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



BuShaRt
Цитата(BuShaRt @  4.5.2007,  12:26 Найти цитируемый пост)
я понял в чем проблема, ты просто не знаешь значение оператора @.
Это вовсе не сокращенная форма isset, а сокрытие ошибок...

Вы не правы. Я прекрасно знаю, что делает @ и & и так далее... Прочитайте труд Дмитри Котерова "PHP5 В подлиннике" и убедитесь сами, что в подобных случаях использование @ куда более грамотно чем isset/empty. С г-ном Д. Котеровым не поспоришь... smile 


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
WolfON
Дата 4.5.2007, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А не проще-ли, для сокрытия ошибок от конечного пользователя просто отключить их отображение в интерпретаторе? )
PM MAIL ICQ   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

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

Важно:

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

Внимание:

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

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

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


 




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


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

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