Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PHP wykłada się na sprawdzeniu, że liczba to liczba?
Forum PHP.pl > Forum > PHP
trejder
Cześć,

Czy ktoś jest w stanie wyjaśnić mi sytuację z załączonej zrzutki:



Patient ID jest liczbą (trzy (3) wydaje się być cyfrą, prawda?) wysłaną jako string (część URLa), następnie scastowaną na int, a mimo PHP wykłada się na próbie sprawdzenia tego faktu. I zamiast zrobić coś-niecoś w bazie danych, wywala zaprogramowany przeze mnie wyjątek.

Nie mam bladego pojęcia, dlaczego if w tym konkretnym kawałku kodu i w tej konkretnej sytuacji zwraca FALSE?

Z góry dzięki za wszelkie pomysły, czy opinie.

Pozdrowienia,
Trejder

P.S.: W prezentowanym komunikacie o błędzie to ja dodaję cudzysłowy z obu stron prezentowanej wartości. I robię to dopiero w treści wyjątku. Nie one są więc problemem.
wookieb
Pokaże proszę większy kawałek kodu ponieważ to co masz teraz nie jest błędne póki co.
darko
Jaki jest sens rzutować zmienną do inta tuż przed sprawdzeniem is_int ? Wywal to rzutowanie i sprawdź czy zadziała albo po prostu rzutuj bez sprawdzania.
trejder
Cytat(wookieb @ 30.10.2011, 01:26:49 ) *
Pokaże proszę większy kawałek kodu ponieważ to co masz teraz nie jest błędne póki co.

OK, tu masz cały kod tego fragmentu, ale uważam, że nie ma co więcej pokazywać, bo ten kawałek albo jest błędny, albo odkryłem buga w PHP.

Kod
if($model->patient != '')
{
        if(is_numeric($model->patient))
        {
                $pat = Pacjenci::model()->find('ID=?', array($model->patient));

                if($pat !== null)
                {
                        $patientName = mb_convert_case($pat->PATIENT, MB_CASE_TITLE, "UTF-8");
                        $patientPESEL = $pat->PESL;
                        $patientPESEL = ($patientPESEL != '') ? ', '.$patientPESEL : '';

                        $patient = $patientName.$patientPESEL;
                }
                else $patient = '';
        }
        throw new CException('Błąd przy wywołaniu funkcji &bdquo;<em>Pacjenci::model()->find()</em>&rdquo; &mdash; identyfikator pacjenta nie jest liczbą!<div class="exception">(jak identyfikator pacjenta przekazano wartość = "'.$model->patient.'")</div>');
}
else $patient = '';

Kod ma zamienić identyfikator liczbowy pacjenta, na jego imię i nazwisko wraz z PESELem. Dodałem to zabezpieczenie w zasadzie dla picu (bo bez niego wio było OK), no i się rozłożyłem, że PHP zdurniał na czymś tak banalnym.

$model->patient "przyjeżdża" jako string, ale na pewno liczba, jest castowany na int, więc pokazany na zrzutce IF pod żadnym pozorem nie ma prawa zwrócić FALSE, a zwraca.

Cytat(darko @ 30.10.2011, 01:31:24 ) *
Jaki jest sens rzutować zmienną do inta tuż przed sprawdzeniem is_int ? Wywal to rzutowanie i sprawdź czy zadziała albo po prostu rzutuj bez sprawdzania.

Sens jest taki, żeby się is_int nie wywalił, jeśli zmienna jest liczbą, ale typu string (co zdarza się w formularzach dość nagminnie). Robi dokładnie to samo, co is_numeric, bo is_numeric to cast zmiennej na int i wpuszczenie jej do is_int.

Jak widzisz, z poprzedniej mojej odpowiedzi, zamieniłem już w międzyczasie ten fragment kodu na if(is_numeric($model->patient)).

Niestety, nic to nie zmienia. Zarówno is_int, jak i is_numeric rozwalają się zupełnie mimo, że zmienna podana jako ich argument na pewno jest liczbą (czego dowodem jest komunikat wyświetlony na ekranie, w którym w podwójnych cudzysłowach daję dokładnie to, co sprawdziłem i na sprawdzaniu czego się wywaliło).

Albo ze zmęczenia jestem ślepy i nie widzę czegoś boleśnie oczywistego, albo PHP zdurniał i twierdzić, że 3 lub "3" to nie liczba.
wookieb
Chyba zabrałko Ci takiej konstrukcji
  1. if(is_numeric($model->patient))
  2. {
  3.  
  4. } else {
  5. throw new CException('Błąd przy wywołaniu funkcji &bdquo;<em>Pacjenci::model()->find()</em>&rdquo; &mdash; identyfikator pacjenta nie jest liczbą!<div class="exception">(jak identyfikator pacjenta przekazano wartość = "'.$model->patient.'")</div>');
  6. }
trejder
Cytat(wookieb @ 30.10.2011, 02:20:57 ) *
Chyba zabrałko Ci takiej konstrukcji [php]

No, przecież w kodzie, który wkleiłem na Twoje żądanie widać, jak wół, że zmieniłem is_int na is_numeric.

I tak niczego to nie zmienia. PHP wykłada się na is_numeric dokładnie tak samo, jak wyłożył się na is_int.

Z resztą, czemu by nie miał? Jak napisałem w odpowiedzi od darko, is_numeric($var) = is_int((int)$var).

Trejder
darko
Wklej jeszcze var_dump($model->patient) sprawdzę u siebie, co mi zwróci Twój kod.
wookieb
Czy ty jesteś ślepy?
Gdzie masz ELSE-a?
Przecież wyjątek zostanie wyrzucony ZAWSZE bez względu na wartość twojej właściwości. Dlatego napisałem o konstrukcji a nie o użyciu is_numeric.
trejder
Gratuluję dobrego humoru i pełnego sympatii podejścia do innych! Tak trzymaj...

Nie codziennie zdarza mi się kodowanie w środku nocy (w zasadzie zdarza mi się bardzo rzadko), więc już nie kumałem, o co Ci biega. Gdybyś napisał po prostu "Zapomniałes, koleś, else", to problem byłby rozwiązany jeszcze w nocy i nie byłoby całej dalszej dyskusji.

Dzięki za zwrócenie uwagi, to nie pierwszy raz, gdy popełniam ten błąd, tak to jest, gdy się koduje w wielu językach jednocześnie i w nocy. Mimo wszystko podejścia do ludzi nie gratuluję, bo nie ma czego. Ze trzy tysiące lat ma powiedzenie, że mylenie się jest rzeczą ludzką, ale widać, Ty o tym zapominasz. W takim razie, serdeczne gratulacje, że Ty nie popełniasz błędów nigdy i żadnych...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.