2009-08-08 13 views
18

To poniżej nie wydają się działać jak bym go oczekiwać, wydarzenie chociaż $ _GET [ 'friendid'] = 55 to wraca NULLProste PHP isset Test

<?PHP 

$_GET['friendid'] = 55; 

$friendid = (!isset($_GET['friendid'])) ? $_GET['friendid'] : 'empty'; 

echo $friendid; 
exit; 

?> 
+5

Należy echo „pusty”, bo trzeba wyrażenia w trójskładnikowego operator do tyłu. –

Odpowiedz

36

Zdjąć !. Nie chcesz negować wyrażenia.

$friendid = isset($_GET['friendid']) ? $_GET['friendid'] : 'empty'; 
+0

Dobrze działa, ale nie rozumiem, dlaczego tak się dzieje, $ _GET ['friendid'] = ''; nie wyświetla pustego, czy nie powinno to być traktowane jako wartość pusta? – JasonDavis

+0

'' jest pustym ciągiem, ale zmienna jest nadal ustawiona. –

+4

To nie ma nic wspólnego z ssaniem, ale z tym, że można zadeklarować zmienną ($ var) lub zainicjować ($ var = 'bla'). niezadeklarowana zmienna i zmienna zadeklarowana i zainicjowana jako pusty ciąg nie jest taka sama. –

0

jeśli friendid jest NIE zestaw, friendid = friendid inaczej friendid = pusty

1

Od odpowiedź do Filipa I że trzeba spojrzeć na różnice między empty i isset.

Podsumowując isset() zwróci wartość logiczną PRAWDA, jeśli zmienna istnieje. W związku z tym, jeśli masz wykonać, to istnieje $ PRAWDA, ponieważ istnieje $ _GET ['friendid']. Jeśli nie jest to, co chcesz, sugeruję, żebyś zajrzał do pustego. Empty zwróci TRUE na pustym ciągu (""), który wydaje się być tym, czego oczekujesz. Jeśli użyjesz pustego, PROSZĘ zapoznaj się z dokumentacją, z którą się łączyłem, są też inne przypadki, w których puste zwrócą prawdę tam, gdzie możesz tego nie oczekiwać, przypadki te są jawnie udokumentowane na powyższym łączu.

HTH.

5

Obecnie pracujesz z potrójnego operatora:

$friendid = (!isset($_GET['friendid'])) ? $_GET['friendid'] : 'empty'; 

rozbicie go na rachunku if-else i wygląda to tak:

if(!isset($_GET['friendid'])) 
    $friendid = $_GET['friendid']; 
else 
    $friendid = 'empty'; 

Spójrz na to, co naprawdę dzieje się w rachunku if :

!isset($_GET['friendid']) 

Uwaga wykrzyknik (!) przed funkcją isset. To inny sposób na powiedzenie "przeciwieństwo". To, co tu robisz, polega na sprawdzeniu, czy nie ma wartości ustawionej w $_GET['friendid']. A jeśli tak, to $friendid powinna przyjąć tę wartość.

Ale tak naprawdę, pękłoby, ponieważ $_GET['friendid'] nawet nie istnieje. I nie możesz wziąć wartości czegoś, czego tam nie ma.

Biorąc to od początku, ustawiono wartość dla $_GET['friendid'], więc pierwszy warunek if jest teraz fałszywy i przekazuje go do opcji else. W takim przypadku ustaw wartość zmiennej $friendid na empty.

Należy usunąć wykrzyknik, a następnie wartość $friendid przyjmie wartość $_GET['friendid'], jeśli została wcześniej ustawiona.

2

Najlepszym rozwiązaniem tego pytania, tzn. Jeśli musisz "sprawdzić pusty ciąg znaków", jest empty().

$friendid = empty($_GET['friendid']) ? 'empty' : $_GET['friendid']; 

empty() nie tylko sprawdza, czy zmienna jest ustawiona, ale dodatkowo zwraca wartość false, jeśli jest karmione niczego, co mogłoby zostać uznane za „pusty”, takich jak pusty ciąg, pustej tablicy, liczba całkowita 0, wartość logiczna fałsz, ...

11

Jeśli jesteś leniwy i ryzykowny, możesz użyć error control operator @ i krótkiej formy ternary operator.

$friendid = @$_GET['friendid']?: 'empty'; 
+1

Przyszedłem tutaj, szukając skondensowanej formy struktury kontrolnej umieszczonej w odpowiedzi, a twoja jest doskonała. Dzięki. –

+2

Należy zauważyć, że to rozwiązanie jest wolniejsze, może zakłócać (źle napisane) niestandardowe procedury obsługi błędów itp., A instrukcja if może działać szybciej. Ale to nie znaczy, że jest zły. – thomasrutter

0

Okej, być może miałem podobny problem, który nie był znajomy! Sytuacja taka jak miała jasondavis.

Trochę mylące, ale dowiedzieć się, nie mając! jak w ... isset ($ avar) w porównaniu do! isset ($ avar) może zrobić dużą różnicę.

Tak z! w miejscu, jest więcej stwierdzenia TAK, jak w Nie było dużo zamieszania, jeśli A $ = "" to .... pracować. (lub $ A = "" dla PHP).

Uważam, że użycie ciągów i zmiennych jako ciągów może być czasem bardzo zniechęcające. Nawet przez zamieszanie, mogę właściwie zrozumieć, dlaczego ... po prostu sprawia, że ​​rzeczy trudne do uchwycenia dla mnie.

35

Od PHP 7's release, można użyć operatora null koalescencyjny (double "?") Za to:

$var = $array["key"] ?? "default-value"; 
// which is synonymous to: 
$var = isset($array["key"]) ? $array["key"] : "default-value"; 

W PHP 5.3+, jeśli wszystkie są sprawdzania jest "truthy" wartość, możesz użyć "operatora Elvisa" (zauważ, że to nie sprawdza isset).

$var = $value ?: "default-value"; 
// which is synonymous to: 
$var = $value ? $value : "default-value"; 
+0

Dokładnie tego, czego szukałem, dzięki. –

+1

? :-) uh huh huh – Greg

0

Używam Null coalescing operator operatora, jeśli stan się ten

if($myArr['user'] ?? false){ 

co jest równoważne

if(isset($myArr['user']) && $myArr['user']){