Jump to content
  • 0

pomoc PHP - bug function is_int


{V} P - y c h o {V}

Dotaz

Nazdar, mám problém, mám kód:

if(!is_int($_POST['ID_Process']))
{
echo('');
return;
}

jenže je problém že ať už tam zadám text nebo číslo, tak mi to furt vypíše ,,Musíte zadat ...''.

Nevím v čem je problém, dřív mi na PHP 5.2 fungovala, ale od verze 5.3 jsou skoro všechny funkce úplně jinak dělaný :/

Link to comment
Share on other sites

14 odpovědí na tuto otázku

Recommended Posts

  • 0

V PHP 5.3 by tato funkce podle dokumentace měla fungovat. Každopádně bych zkusil ještě funkci is_numeric(), až na pár rozdílů jsou si podobné a měla by ti stačit. Jediný problém bych viděl v tom, že jako číslo bere i např. "1e4", což by ti mohlo vadit. Ještě jeden problém, že to nerozezná int a string, ale to by ti taky nemělo vadit :d. Pokud by ti vadily ty stringy, tak bych si normálně vytvořil vlastní funkci, která bude kontrolovat, jestli string obsahuje jen čísla a případně z toho můžeš udělat i int. :)

Link to comment
Share on other sites

  • 0
V PHP 5.3 by tato funkce podle dokumentace měla fungovat. Každopádně bych zkusil ještě funkci is_numeric(), až na pár rozdílů jsou si podobné a měla by ti stačit. Jediný problém bych viděl v tom, že jako číslo bere i např. "1e4", což by ti mohlo vadit. Ještě jeden problém, že to nerozezná int a string, ale to by ti taky nemělo vadit :d. Pokud by ti vadily ty stringy, tak bych si normálně vytvořil vlastní funkci, která bude kontrolovat, jestli string obsahuje jen čísla a případně z toho můžeš udělat i int. :)

 

Ty stringy mi tam vaděj hodně, proto is_int a ne is_numeric ...

Ale už sem to vyřešil následovně touto funkcí:

function _int($int)
{
if(is_numeric($int) === TRUE)
{
if((int)$int == $int) return TRUE;
else return FALSE;
}else return FALSE;
}

Toto už funguje ... Jen nevím proč nefunguje orig. způsob, ale když to dám na server s PHP 5.2, tak to jede v pohodě, jen u PHP 5.3 to dělá takovou neplechu :/

Link to comment
Share on other sites

  • 0

A já bych to ještě více zkrátil :d

$num = "432e2";

 

function isInt($input, &$int = 0)

{

    if (is_numeric((int)$input))

    {

        $int = (int)$input;

        return true;

    }

    return false;

}

 

isInt($num, $ok);

echo $ok; // 432 (jako int) 

Link to comment
Share on other sites

  • 0
Tak aby jste se nedohadovali, tak zde je nejkratší a funkční verze :d

function _int($int) { return preg_match("/^[0-9]/", (string)$int); }

Toto bych nepoužival, rozhodně ne na tak jednoduchou věc.. regexp žere víc sys. prostředky a v tomhle případě ti to stejně nechá jako string, musel bys to na výstupu ještě explicitně přetypovat... použij klasickej is_numeric a pak to ještě přetypuj na (int), podstatě co jsem psal...

Link to comment
Share on other sites

  • 0
Tak aby jste se nedohadovali, tak zde je nejkratší a funkční verze :d

function _int($int) { return preg_match("/^[0-9]/", (string)$int); }

Toto bych nepoužival, rozhodně ne na tak jednoduchou věc.. regexp žere víc sys. prostředky a v tomhle případě ti to stejně nechá jako string, musel bys to na výstupu ještě explicitně přetypovat... použij klasickej is_numeric a pak to ještě přetypuj na (int), podstatě co jsem psal...

No když sem to zkoušel měřit oba scripty za jakou dobu se vykonají, tak je to na stejno ať tak nebo tak a dnes žijeme v moderní době a ne s CPU 300MHz, takže zátěž mě nijak nezajímá, ale kvalita a bezpečnost kódu hlavně ...

Link to comment
Share on other sites

  • 0

ho*no, chyba je v tom ze php bere vstupy z $_POST a $_GET ako string a nepretipovava ich.

 

if (is_int((int)$input))

je to iste ako is_numeric($input) lebo ak mas 10e+05 a pretypujes to na int tak pravdepodobne dostanes 100000 a to je integer. Ale nechapem co ti tak vadi na tom zapise is_numeric().

Link to comment
Share on other sites

  • 0

nezáleží jaká je doba... vždy je důležitá rychlost a optimalizace kódu.. krom toho bezpečný jsou obě varianty... ale osobně bych se vysral na nějaký šílenosti a použil jen explicitní přetypování.. resp.

$num = "43e4xl";
echo (int)$num; // 43

To ti odtrhne všechno od znaku, který není číslo 0-9.. pokud ovšem první znak nebude číslo, tak vrátí 0

 

Bloodman: to není pravda... pokud přetypuješ 333e9 na int, tak dostaneš 333, protože výraz "333e9" NENÍ int... jinak ještě is_integer je zastaralej alias k is_int.. dneska se, ale ani jeden z nich moc nepoužívá

Link to comment
Share on other sites

  • 0
nezáleží jaká je doba... vždy je důležitá rychlost a optimalizace kódu.. krom toho bezpečný jsou obě varianty... ale osobně bych se vysral na nějaký šílenosti a použil jen explicitní přetypování.. resp.

$num = "43e4xl";
echo (int)$num; // 43

To ti odtrhne všechno od znaku, který není číslo 0-9.. pokud ovšem první znak nebude číslo, tak vrátí 0

 

Bloodman: to není pravda... pokud přetypuješ 333e9 na int, tak dostaneš 333, protože výraz "333e9" NENÍ int... jinak ještě is_integer je zastaralej alias k is_int.. dneska se, ale ani jeden z nich moc nepoužívá

 

Nanestastie nemas pravdu, vyraz 333e+04 je platny zapis integeru tak isto ako 0b0101010 alebo 0xAB4154564FC, No ja som si to preistotu overil a tento script mi vypisal obe cisla rovnake

<?php 
$lol = 333e+04;

echo $lol . '
';
echo (int)$lol;

Link to comment
Share on other sites

  • 0
nezáleží jaká je doba... vždy je důležitá rychlost a optimalizace kódu.. krom toho bezpečný jsou obě varianty... ale osobně bych se vysral na nějaký šílenosti a použil jen explicitní přetypování.. resp.

$num = "43e4xl";
echo (int)$num; // 43

To ti odtrhne všechno od znaku, který není číslo 0-9.. pokud ovšem první znak nebude číslo, tak vrátí 0

 

Bloodman: to není pravda... pokud přetypuješ 333e9 na int, tak dostaneš 333, protože výraz "333e9" NENÍ int... jinak ještě is_integer je zastaralej alias k is_int.. dneska se, ale ani jeden z nich moc nepoužívá

 

Nanestastie nemas pravdu, vyraz 333e+04 je platny zapis integeru tak isto ako 0b0101010 alebo 0xAB4154564FC, No ja som si to preistotu overil a tento script mi vypisal obe cisla rovnake

<?php 
$lol = 333e+04;

echo $lol . '
';
echo (int)$lol;

Promiň, ale ne.. nemáš pravdu :) Pokud máš takové číslo "333e+04" s exponentou a přetypuješ to surově na int, tak to ořízne tak, jak jsem psal, takže z toho udělá int čili "333", pokud by jsi chtěl, aby se použila i ta exponenta, tak je nutný to přetypovat na nějakej realnej typ, třeba double, potom z toho bude "3330000"

Link to comment
Share on other sites

  • 0
nezáleží jaká je doba... vždy je důležitá rychlost a optimalizace kódu.. krom toho bezpečný jsou obě varianty... ale osobně bych se vysral na nějaký šílenosti a použil jen explicitní přetypování.. resp.

$num = "43e4xl";
echo (int)$num; // 43

To ti odtrhne všechno od znaku, který není číslo 0-9.. pokud ovšem první znak nebude číslo, tak vrátí 0

 

Bloodman: to není pravda... pokud přetypuješ 333e9 na int, tak dostaneš 333, protože výraz "333e9" NENÍ int... jinak ještě is_integer je zastaralej alias k is_int.. dneska se, ale ani jeden z nich moc nepoužívá

 

Nanestastie nemas pravdu, vyraz 333e+04 je platny zapis integeru tak isto ako 0b0101010 alebo 0xAB4154564FC, No ja som si to preistotu overil a tento script mi vypisal obe cisla rovnake

<?php 
$lol = 333e+04;

echo $lol . '
';
echo (int)$lol;

Promiň, ale ne.. nemáš pravdu :) Pokud máš takové číslo "333e+04" s exponentou a přetypuješ to surově na int, tak to ořízne tak, jak jsem psal, takže z toho udělá int čili "333", pokud by jsi chtěl, aby se použila i ta exponenta, tak je nutný to přetypovat na nějakej realnej typ, třeba double

 

Prosim ta, skvor nez sem nieco napises tak si to aspon vyskusaj

Link to comment
Share on other sites

  • 0
Prosim ta, skvor nez sem nieco napises tak si to aspon vyskusaj

Já nic zkoušet nemusim.. je to tak, jak jsem napsal - http://ideone.com/dGZJZ

 

Jo ale pozor, já to od začátku beru jako string (autor to měl jako string tušim)... pokud to dáš jako číslo, tak to potom ano, protože se to napřed vykoná exponenta a až potom přetypování... u stringu je to opačně

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...