Дефиниране на променливи и индекси в PHP5

Re: Дефиниране на променливи и индекси в PHP5

@vha зависи къде го правиш кастинга при всички случаи според мен е добре да се прави с is_numeric, защото е най -кратко и е най - гарантирано че е число.

иначе за най кратко може така :

PHP:
(isset($_GET['var']) && is_numeric($_GET['var'])) ? $alabala = $_GET['var'] : $alabala = 0;
 
Re: Дефиниране на променливи и индекси в PHP5

@vha зависи къде го правиш кастинга при всички случаи според мен е добре да се прави с is_numeric, защото е най -кратко и е най - гарантирано че е число.
Тук става вече въпрос за филтриране, и конкретна абстракция когато се предават числа.
Дори и в този случай обаче връщаната променлива от тейп кастинг към инт е число, т.е. безвредна за използване стойност.
Просто не си ползвал тейп кастинга към число явно, тъй като директно джагърташ третирайки като стрингове променливите през is_numeric функцията.

иначе за най кратко може така :
PHP:
(isset($_GET['var']) && is_numeric($_GET['var'])) ? $alabala = $_GET['var'] : $alabala = 0;
Напротив, особено в дълъг и сложен код , но това е въпрос по-скоро на личен стил на програмиране.
 
Re: Дефиниране на променливи и индекси в PHP5

Ако ще се ползва ternary operator-а по добре така:
PHP:
$alabala = (isset($_GET['var']) && is_numeric($_GET['var'])) ? $_GET['var'] : 0;
но като цяло, намирам ползването му за грешна практика.
Иначе typecast-a - вътре във if-a:
PHP:
$int_val = 0;
if(isset($_GET['int_val'])) {
    $int_val = (int)$_GET['int_val'];
}
Това е достатъчно да ми гарантира че $int_val ще съществува и винаги ще бъде int. (естествено ако кода е поставан в позиция където ще се изпълнява при всяко викане на скрипта)
 
Re: Дефиниране на променливи и индекси в PHP5

PHP:
$ingredient_id = 0; 
if(isset($_GET['ingredient_id'])){ 
 $ingredient_id = $_GET['ingredient_id']; 
}
Това, обаче, не решава проблема с недефинираните индекси.
 
Re: Дефиниране на променливи и индекси в PHP5

Това, обаче, не решава проблема с недефинираните индекси.
PHP:
$base_id = -1; /* или 0, каквото там предпочиташ за невалидно/default */
if(isset($_GET['base_id'])) {
   $base_id = $_GET['base_id'];
}
на мястото на
PHP:
$base_id = $_GET['base_id'];
И не би трябвало да създава проблеми. Можеш да добавиш и (int), както коментирахме по-горе.
Това което прави isset е да провери дали посочения аргумент съществува (независимо дали е елемент на масив, променлива и май member на клас). Подавайки масив със невалиден индекс просто трябва да върне false и да не влезе в if-a.

Едит (ПП):
Може и така, но на мен лично не ми харесва като вариант
PHP:
if(!isset($_GET['base_id'])) {
   $_GET['base_id'] = 0; /* or other default value */ 
}
 
Последно редактирано:
Re: Дефиниране на променливи и индекси в PHP5

@vha - готино е това.

@bgkulinar - така е не решава проблема защо не са дефинирани в GET масива, но поне няма да ти дава нотис, че се опитваш да достъпиш променлива която не е дефинирана.
 
Re: Дефиниране на променливи и индекси в PHP5

@bgkulinar - така е не решава проблема защо не са дефинирани в GET масива, но поне няма да ти дава нотис, че се опитваш да достъпиш променлива която не е дефинирана.
Да, но на мен нотисът за неиндексирани индекси ми пречи и пак повтарям, че не искам да изключвам ерор рипортинга.
 
Re: Дефиниране на променливи и индекси в PHP5

Да, но на мен нотисът за неиндексирани индекси ми пречи и пак повтарям, че не искам да изключвам ерор рипортинга.

да, аз не те съветвам да ги излючиш. просто ако ползваш isset няма да ги има нотисите.
 
Re: Дефиниране на променливи и индекси в PHP5

PHP:
$recipe_id = 0;
if(isset($_GET['recipe_id'])){
 $recipe_id = $_GET['recipe_id'];
}
Така го ползвам и пак ми плюе индекс нотисите, не разбирам какво друго имаш предвид.
 
Re: Дефиниране на променливи и индекси в PHP5

PHP:
$recipe_id = 0;
if(isset($_GET['recipe_id'])){
 $recipe_id = $_GET['recipe_id'];
}
Така го ползвам и пак ми плюе индекс нотисите, не разбирам какво друго имаш предвид.
Това е защото някъде другаде ползваш директно $_GET['recipie_id'], което не съществува.
Или подмени навсякъде $_GET['xxx'] със $xxx след като си сложил горния код за всяка променлива
или ползвай quick & dirty решението от горния ми пост (това във edit-a, което при липса на индекса го създава с някаква default стойност)
 
Re: Дефиниране на променливи и индекси в PHP5

Тук става вече въпрос за филтриране, и конкретна абстракция когато се предават числа.
Дори и в този случай обаче връщаната променлива от тейп кастинг към инт е число, т.е. безвредна за използване стойност.
Всъщност, is_numeric е доста по-добър вариант от (int), ако го погледнем така:

Код:
if (is_numeric($var))
   // и тука редим някво query или куп бесни функции
Ако го кастнеш, винаги ще мине if-a (всъщност може и да няма if), а предвид, че не ти идва правилната променлива (щом се налага да я кастваш..), това е излишно и е неправилно да продължаваш нататък.

Напротив, особено в дълъг и сложен код , но това е въпрос по-скоро на личен стил на програмиране.
Нито е дълъг, нито е сложен, аз все пак бих гонаписал така:

PHP:
$alabala = (isset($_GET['var']) && is_numeric($_GET['var'])) ? $_GET['var'] : 0;

Къде по-кратък вариант от IF + ELSE, че и четим...
 
Re: Дефиниране на променливи и индекси в PHP5

Всъщност, is_numeric е доста по-добър вариант от (int), ако го погледнем така:

Код:
if (is_numeric($var))
   // и тука редим някво query или куп бесни функции
Ако го кастнеш, винаги ще мине if-a (всъщност може и да няма if), а предвид, че не ти идва правилната променлива (щом се налага да я кастваш..), това е излишно и е неправилно да продължаваш нататък.

Искаш да кажеш, че примерно за sql заявка по айди трябва да добавям if-ове,
is_numeric и други глупости, вместо да го кастна като безопасно число и ползвам директно ?
Не мисля така... 😉

Относно краткия тип иф...
С една променлива лесно, като се навъдят хиляда в сложно приложение
пожелавам успех на който му се наложи да отстранява евентуални бъгове в тази насока.
Въпрос на стил, въпрос на вкус... ;D
 
Re: Дефиниране на променливи и индекси в PHP5

Искаш да кажеш, че примерно за sql заявка по айди трябва да добавям if-ове,
is_numeric и други глупости, вместо да го кастна като безопасно число и ползвам директно ?
Не мисля така... 😉
Не.
Искам да кажа, че ако очакваш данни от тип INT, то въобще не би трябвало да ти се изпълняват заявките или методите, ако ГЕТ променливата в случая не е numeric.
Това, че я кастваш, значи просто, че въпреки невалидния тип данни, ти изпълняваш останалия скрипт.
Относно краткия тип иф...
С една променлива лесно, като се навъдят хиляда в сложно приложение
пожелавам успех на който му се наложи да отстранява евентуални бъгове в тази насока.
Въпрос на стил, въпрос на вкус... ;D
Къде в примера видя нещо сложно?
Eстествено, че за прости примери говорим, вместо да пишем 4 (поне) реда, го правим на един и е достатъчно четим. 🙂
 
Re: Дефиниране на променливи и индекси в PHP5

Не.
Искам да кажа, че ако очакваш данни от тип INT, то въобще не би трябвало да ти се изпълняват заявките или методите, ако ГЕТ променливата в случая не е numeric.
Това, че я кастваш, значи просто, че въпреки невалидния тип данни, ти изпълняваш останалия скрипт.
Тейпкастинга към инт единствено лесно и бързо обезврежда входните данни.

И да имаш проверка дали е нумерик или не, като подавам несъществуващо айди, няма да изпълни sql заявката ли...

Ще я изпълни, че й хоро ще играе! ;D

Къде в примера видя нещо сложно?
Eстествено, че за прости примери говорим, вместо да пишем 4 (поне) реда, го правим на един и е достатъчно четим. 🙂

PHP:
if ( isset($_GET['var']) ) $_GET['var'] = (int)$_GET['var']; else $_GET['var'] = 0;
Много по дълго а.... 😉
Същия размер, доста по-разбрано като код,
спестяващо алабала променливата и неутрализиращо notice съобщенията, като задава и типа на променливата като бонус.

Проверката is_numeric въобще нямам намерение да я ползвам, освен в конкретни случай когато наистина се окаже нужна.
По-горе съм писал защо тя не може да бъде мерило за валидност на входните данни, а и моя скрипт освен, че решава проблема сетва и типа на променливата.
 
Последно редактирано:
Re: Дефиниране на променливи и индекси в PHP5

Тейпкастинга към инт единствено лесно и бързо обезврежда входните данни.

И да имаш проверка дали е нумерик или не, като подавам несъществуващо айди, няма да изпълни sql заявката ли...

Ще я изпълни, че й хоро ще играе! ;D

Вземи си прочети подписа, после прочети пак моя пост...

За трети (и последен) път ще се опитам:

Ако кастваш към int, вместо да проверяваш с is_numeric, то в такъв случай, без значение от типа данни, които ти идват от GET, винаги ще изпълниш кода по-надолу, което е неправилно както и да го погледнеш.
След като очакваш $_GET['id'] да ти е int, то за какъв чеп ще го кастваш, че и ще му пускаш рекуест, след като или някой си играе с гет параметрите или ти е просто грешен УРЛ-а?

Иначе си ползвай каквото искаш. Факт обаче, че IF-а както си го написал на 1 ред е доста по-нечетим от всякакви други варианти.
И for-овете ли ги пишеш на 1 ред?
А така, как мислиш? Огледай пак твоя код и кажи че е по-разбран и спирам да споря. 😀
Код:
$_GET['var'] = isset($_GET['var']) ? (int)$_GET['var'] : 0;

Това, че не си свикнал на синтаксиса ?: говори само за липса на практика.
 
Последно редактирано:
Re: Дефиниране на променливи и индекси в PHP5

Това е защото някъде другаде ползваш директно $_GET['recipie_id'], което не съществува.
Или подмени навсякъде $_GET['xxx'] със $xxx след като си сложил горния код за всяка променлива
или ползвай quick & dirty решението от горния ми пост (това във edit-a, което при липса на индекса го създава с някаква default стойност)
Ползвах варинта в едита ти и проблемът с индексите изчезна, но продължава да "реве". за част от променливите, че не са дефинирани. Например тук:
Код:
http://recipes.kulinar.bg/recipe-OLDFASHIONED+FISH+CHOWDER-10785
плюе Undefined variable: ingredient_id. Гарантирам ти, че няма друг файл, който участва в генерирането на страницата и в който да се ползва $_GET['ingredient_id'] или $ingredient_id.
 
Re: Дефиниране на променливи и индекси в PHP5

Вземи си прочети подписа, после прочети пак моя пост...

За трети (и последен) път ще се опитам:

Ако кастваш към int, вместо да проверяваш с is_numeric, то в такъв случай, без значение от типа данни, които ти идват от GET, винаги ще изпълниш кода по-надолу, което е неправилно както и да го погледнеш.
След като очакваш $_GET['id'] да ти е int, то за какъв чеп ще го кастваш, че и ще му пускаш рекуест, след като или някой си играе с гет параметрите или ти е просто грешен УРЛ-а?

Ти го прочети...
Бааавно прочети какво съм написал и ми отговори ако задам несъществуващо айди на твоя is_numeric,
ще ми изкара ли валиден запис и ще изпълни ли кода нататък... ;D


Иначе си ползвай каквото искаш. Факт обаче, че IF-а както си го написал на 1 ред е доста по-нечетим от всякакви други варианти.
И for-овете ли ги пишеш на 1 ред?
А така, как мислиш? Огледай пак твоя код и кажи че е по-разбран и спирам да споря. 😀
Код:
$_GET['var'] = isset($_GET['var']) ? (int)$_GET['var'] : 0;

Това, че не си свикнал на синтаксиса ?: говори само за липса на практика.

Наблъсках ти го на един ред за да видиш, че размера е същия, а ти този път си дал и още по-къс вариант с краткия if.
Лично аз бих ползвал този вариант, тъй като наистина е по-четим от дву километровия код който беше дал горе... 😉

Ползвах варинта в едита ти и проблемът с индексите изчезна, но продължава да "реве". за част от променливите, че не са дефинирани. Например тук:
Код:
http://recipes.kulinar.bg/recipe-OLDFASHIONED+FISH+CHOWDER-10785
плюе Undefined variable: ingredient_id. Гарантирам ти, че няма друг файл, който участва в генерирането на страницата и в който да се ползва $_GET['ingredient_id'] или $ingredient_id.

Не е задължително да е в $_GET, предполагам имаш нормална променлива $ingredient_id която директно се ползва без да е зададена предварително.
 
Re: Дефиниране на променливи и индекси в PHP5

Ти го прочети...
Бааавно прочети какво съм написал и ми отговори ако задам несъществуващо айди на твоя is_numeric,
ще ми изкара ли валиден запис и ще изпълни ли кода нататък... ;D

Ще го кажа така:
1. Имаш параметър INT - вадиш запис.
2. Имаш параметър (някакъв), кастваш към инт - вадиш запис.

В първия вариант, дори да е несъществуващо айди, може да го е имало и да е изтрит записа.. нормално, ще провери в базата естествено.

Във втория обаче, имаш явен сгрешен параметър, но ти въпреки всичко кастваш и проверяваш... Защо?
Наблъсках ти го на един ред за да видиш, че размера е същия, а ти този път си дал и още по-къс вариант с краткия if.
Лично аз бих ползвал този вариант, тъй като наистина е по-четим от дву километровия код който беше дал горе... 😉
Нито е същия като четимост, нито е по-кратък.
А километровия вече за четвърти път ти обяснявам защо е по-дълъг и защо може да се ползва проверката.
Виждам също, че просто си пишеш. Така че аз спирам в тази тема. 🙂
 
Re: Дефиниране на променливи и индекси в PHP5

Ще го кажа така:
1. Имаш параметър INT - вадиш запис.
2. Имаш параметър (някакъв), кастваш към инт - вадиш запис.

В първия вариант, дори да е несъществуващо айди, може да го е имало и да е изтрит записа.. нормално, ще провери в базата естествено.

Във втория обаче, имаш явен сгрешен параметър, но ти въпреки всичко кастваш и проверяваш... Защо?
Исках отговор с да или не, а не да ми увърташ...
Теоретично погледнато, преди да изважда записа и да изпълнява скрипта нататък трябва и да провери първо в базата данни дали съществува нали? 😀

Когато ми се изпращат данни за айди аз знам и съм сигурен че трябва да представляват число,
това дали е въведен стринг, или е въведен запис 1000 при положение, че има само 500 записа въобще не ме интересува!

А километровия вече за четвърти път ти обяснявам защо е по-дълъг и защо може да се ползва проверката.
Каква проверка ми правиш ти, като мога да шибна несъществуващо айди и пак ще си ти изпълни прехваления скрипт бе ?
 

Back
Горе