No me prave tohle pripada uplne mimo. Pokud cekam od uzivatele jako vstup cislo, nebudu preci vstup pretypovavat na int ale prozenu jej nejakym ereg() ci necim podobnym a pripadne vypisi chybu. Pokud vstup pretypuji na int (ci float), uz nikdy nezjistim, co tam vlastne bylo...
Dalsi vec ke ktere mam vyhradu je nezmineni funkci require_once a include_once, coz jsou funkce daleko uzitecnejsi, nez jen samotne require,include.
Autorovi preji hodne zdaru, osobne si myslim, ze v PHP nelze bezpecne programovat a nemusi to byt jen tim, ze programator je cune. Jazyk na to neni postaven (viz operatory =, ==, === - tohle ma snad jen php) a taky dost zalezi na verzi PHP, ktera bezi na serveru. Pokud chci neco bezpecneho, pouziji typove bezpecny jazyk (java), kde je uz na urovni jazyka jasne, co je int a co je String. PHP je jazyk skriptovaci, ne programovaci...
Bundik
No ona funkce is_integer() Vam zjisti, zda-li je promenna typu integer, coz ale nemusi byt vzdy to co potrebujete. Zkuste tento kod:
$n = "1";
echo "$n " . (is_integer($n) ? "je" : "neni") . " integer";
Pokud chcete zjistit, zda-li ve stringu mate cislo, nepomuze Vam to.
Bundik
Nenenene, ===================== neni pro uplne stejne, jenom pro ty, ktere jsou jen opravdu velice tezko rozeznatelne. Uplne stejne objekty jsou takove, ktere projdou =^n pro libovolne n, coz se obvykle zapisuje jako lim_{n->\infty}{=^n}
Pak definujeme miru podobnosti dvou objektu a, b jako nejvetsi n takove, ze plati a =^n b. Existuji pak operatory =< a =>, ktere porovnavaji podobnost dvou objektu.
:o)
Ja si myslim, ze to zavisi od kontextu cisla, ktore pouzivam. Napr. ak ocakavam ID (napr do databazy), o ktorom viem, ze je urcite vacsie ako nula, pretypovanie na int a kontrola na nulu je celkomm vhodna a dostacujuca:
if ((int) $nID > 0) {
// whatsoever ..
}
Navyse pretypovanie ma tu krasnu vlastnost, ze ak napriklad retazec '474boeing' po pretypovani bude cislo 474 (ale napr. '474boeaing4' bude tiez 474). Problem je v tom, ze premenne posielane GET-om alebo POST-om su interne prezentovane ako retazce, a az pri pouziti sa pripadne automaticky konvertuju na potrebne typy. Dolezita zasada cisteho a bezpecneho programovania je zriect sa lenivosti a drzat sa hesla: "co mozem ovplivnit sam, nenecham na automatiku a nebudem potom neprijemne prekvapeny ked si jedneho rana najdem prazdnu databazu" :) Takze pretypovanie ma urcite svoj zmysel.
Este poznamocka k pouzivaniu funkcii is_int() a is_numeric(): Funkcia is_int ocakava na vstupe integer, tj. prave tu je potrebna konverzia vstupneho parametru na integer. Funkcia nesluzi na to, aby zistovala ci je retazec cislo! Na to, naopak sluzi funkcia is_numeric, ktora "Finds whether a variable is a number or a numeric string". Dolezita poznamka k funkcii is_numeric(): Aj retazec '10.55' je cislo, takze funkcia vrati true! Ak chcete zistit, ci je premenna *CELE* cislo, musite tieto dve funkcie skombinovat:
if (is_numeric($nCislo) && is_int((int) $nCislo)) {
// whatsoever...
}
Pozrite si manual k tymto funkciam: http://sk2.php.net/manual/en/function.is-int.php a http://sk2.php.net/manual/en/function.is-numeric.php
Navyse, mam pocit, ze vznikol mylny dojem, ze napr. po:
if ((int)$nCislo > 0)
stratim obsah povodnej premennej (tj. ak v nej bolo napr. '485xyz', ze z nej zostane len 485). To samozrejme NIE JE PRAVDA, rovnako ako po:
$a = 4
if($a + 1 == 5)
nebude v $a 5, ale zostane tam 4! Musel by som vykonat priradenie, napr. takto:
$nCislo = (int) $nCislo;
Co som chcel tymto vsetkym povedat? Aha.. chcel som odpovedat na odkaz: ak ocakavam na vstupe cislo, pretypovanie nemoze predstavovat chybu! Skor by malo byt ziadane a imperativne! Nuz a samozrejme pouzivanie regularnych vyrazov na kontrolu ci nieco je alebo nie je cislo je dalsi nezmysel (najma ak existuju na to vstavane funkcie), pretoze je to strasne pomale (vseobecne plati, ze pokial sa mozno regexpom vyhnut, treba sa im vyhnut:)
"... Ak chcete zistit, ci je premenna *CELE* cislo, musite tieto dve funkcie skombinovat:
if (is_numeric($nCislo) && is_int((int) $nCislo)) {
// whatsoever...
}
... "
Bohužel, ale tímto to určitě nezjistíte. Výsledkem druhé části podmínky, tj. "is%_int((int) $nCislo)", bude vždy pravda. Jakákoliv proměnná (dokonce i pole) jí vyhoví, když z ní ten integer napřed uděláte. Takže vaše "whatsoever" se vykoná nejen pro vaše $nCislo = '10.55', ale i např. pro řetězec $nCislo = '-256.02e-7'.
To už by bylo lepší použít toto:
if (is_numeric($nCislo) && (int) $nCislo == $nCislo)
{
...
}
Nicméně této podmínce vyhoví i řetězec $nCislo = '256.00', ale kupodivu už ne '2.56e2', které je vlastně také stejné ;o)
Pokud trváme na tom, aby uživatel vložil *CELÉ* číslo, nezbyde nám stejně nic jiného (nic elegantnějšího), než v podmínce použít funkci
ereg('^[\+\-]?[0-9]+$', $nCislo)
případně
ereg('^[0-9]+$', $nCislo)