Autor Zpráva
tajny spion
Profil
Hi! Je lepší použít pro kontorlu, zda řetězec je číslo, script

if (!is_numeric($icq)) {
$chyba = 1;
echo '(is_numeric) Zadány neplatné znaky v poli ICQ. Smíte zadat pouze čísla!<br>';
}

nebo script

if (!EReg("^[0-9]+$", $icq)) {
$chyba = 1;
echo '(ereg) Zadány neplatné znaky v poli ICQ. Smíte zadat pouze čísla!<br>';
}

?

Popřípadě jak je upravit?
Str4wberry
Profil
Odpovídám tajnému spionovi:
To druhé je méně špatné… v případě prvního (podle mě) podmínku splní i desetinné číslo.
DoubleThink
Profil *
v případě prvního (podle mě) podmínku splní i desetinné číslo.
Máš pravdu, kromě toho vyhoví i exponenciální číslo.

Zkus is_int()
Alphard
Profil
DoubleThink
To test if a variable is a number or a numeric string (such as form input, which is always a string), you must use is_numeric()
http://cz2.php.net/manual/cs/function.is-int.php
souki
Profil
if ($icq!=intval($icq)) :o)
tajny spion
Profil
DoubleThink, Alphard
Tzn, že is_int() je špatně a lepší je is_numeric() ?

souki
To je co prosím? V čem je to lepší než ereg?
souki
Profil
tajny spion
to převede $icq na číslo a zjistí, jestli se to (ne)rovná původní hodnotě.
Nevím jestli lepší, ale rozhodně rychlejší
Dranel
Profil
Pro všechny
Tak, teď máme tři řešení, prosím vás, seřaďte mi je od nejlepšího po nejhorší (jinak od nejrychlejšího po nejpomalejší)... protože takhle jste mi jen nasadili brouka do hlavy :)
Alphard
Profil
ještě upozorním, že žádné z řešení netestuje délku řetězce, ale do toho regulárního výrazu by to šlo jednoduše dodat
tiso
Profil
Dranel - kto sa veľa pýta, ten sa veľa dozvie...
loyza
Profil
Ten regulární výraz bude nejpomalejší, ty ostatní budou rychlejší. Rozdíl mezi intval a is_int je podle mě (možná se pletu) v tom, že is_int testuje hodnotu proměnné a pokud máš řetězec a v tom řetězci máš číslo, tak is_int vrátí false. Kdežto intval vrátí z daného řetězce číselnou hodnotu, když v tom řetězci bude třeba "45g" tak intval vrátí 45. V tvém případě je is_int nepoužitelné, protože z formuláře vždycky chodí řetězce. Můžeš si to vyzkoušet na příkladě:

<form>
<input type="text" name="cislo">
<input type="submit">
</form>
<?php
print_r (intval($_GET["cislo"]));
if(is_int($_GET["cislo"])){
echo "ano";
}
else{
echo "ne";
}
?>
Dranel
Profil
loyza
is_int = is_numeric?
V tom případě je is_numeric nepoužitelné...

A pokud jsem správně porozuměl zbytku, tak je nejlepší intval() - protože ať už uživatel zadá ICQ: 123456789 nebo 123-456-789, vždy to převede na 123456789, což je pro mě výhodné.

Jak ale otestuju, jestli je vložených max 9 (respektive 11) znaků? To budu muset zakládat další if() - není už lepší napsat to vše v ereg()?
Str4wberry
Profil
Odpovídám tajnému dranelovi:
„protože ať už uživatel zadá ICQ: 123456789 nebo 123-456-789, vždy to převede na 123456789“
Ne.

„Jak ale otestuju, jestli je vložených max 9 (respektive 11) znaků?“
Uživatel to bude zadávat do formuláře, ne? Tak to ošetříš přímo tam (maxlength).
nightfish
Profil
is_int = is_numeric?
pokud myslíš "rovná se" jako symbol pro ekvivalenci, tak zní odpověď ne
http://cz.php.net/is_int
http://cz.php.net/is_numeric

tak je nejlepší intval() - protože ať už uživatel zadá ICQ: 123456789 nebo 123-456-789, vždy to převede na 123456789, což je pro mě výhodné.
vyzkoušej si to, ale není to tak

Jak ale otestuju, jestli je vložených max 9 (respektive 11) znaků? To budu muset zakládat další if() - není už lepší napsat to vše v ereg()?
stačí do toho původního if()u přidat další podmínku (strlen($cislo) <= 9) (samozřejmě v číslo už bude jenom to číslo, bez pomlček a mezer, pouze číslice
loyza
Profil
Ještě k tomu ereg. Ta funkce je pomalá, pokud se tomu můžeš vyhnout a existuje pro tvůj případ jiná funkce, tak použij jinou.
Řešil bych to asi takhle:

if( ($_GET["icq"]!=intval($_GET["icq"]) ) || (strlen($_GET["icq"])>11 ) )
echo "nene";

A asi bych udělal nějaký javascript, který by dovolil uživateli do toho pole vkládat jenom čísla.
nightfish
Profil
loyza
if( ($_GET["icq"]!=intval($_GET["icq"])
to spolehlivě odfiltruje člověka, který zadá na vstupu číslo oddělené pomlčkami (třeba 123-456-789), což je, zdá se, nežádoucí
Dranel
Profil
loyza, nightfish
Dejte hlavy dohromady hosi a vyronte pls neco - ja jsem v tom stracenej :(
nightfish
Profil
$vstup = "123-456-789"; // do promenne $vstup si uloz vstup z formulare

$vstup = str_replace("-", "", $vstup); // odstraneni pomlcek
$vstup = str_replace(" ", "", $vstup); // odstraneni mezer
if (($vstup == (int)$vstup) && (strlen($vstup) <= 9)) echo "číslo je v pořádku";
else echo "číslo je v nepořádku";
Dranel
Profil
nightfish
Výtečně. Moc díky. Akorát mám jeden dotaz mimo: jaký je rozdíl mezi str_replace() a ereg_replace() ?
Jan Tvrdík
Profil
str_replace je jednodušší a tím pádem asi i rychlejší, ereg_replace nahrazuje podle masky nebo jak se tomu česky říká.
nightfish
Profil
Akorát mám jeden dotaz mimo: jaký je rozdíl mezi str_replace() a ereg_replace() ?
zcela zbytečný dotaz, protože si to můžeš zjistit sám v manuálu, což?
http://cz.php.net/str_replace
http://cz.php.net/ereg_replace
a případně ještě i
http://cz.php.net/preg_replace

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: