Autor | Zpráva | ||
---|---|---|---|
tajny spion Profil |
#1 · Zasláno: 15. 11. 2007, 17:32:27
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 |
#2 · Zasláno: 15. 11. 2007, 17:38:14 · Upravil/a: Str4wberry
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 * |
#3 · Zasláno: 15. 11. 2007, 17:43:17
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 |
#4 · Zasláno: 15. 11. 2007, 18:07:33
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 |
#5 · Zasláno: 15. 11. 2007, 19:07:15
if ($icq!=intval($icq)) :o)
|
||
tajny spion Profil |
#6 · Zasláno: 15. 11. 2007, 21:23:37
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 |
#7 · Zasláno: 15. 11. 2007, 21:38:46
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 |
#8 · Zasláno: 17. 11. 2007, 09:25:33
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 |
#9 · Zasláno: 17. 11. 2007, 09:38:40 · Upravil/a: Alphard
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 |
#10 · Zasláno: 17. 11. 2007, 09:38:43
Dranel - kto sa veľa pýta, ten sa veľa dozvie...
|
||
loyza Profil |
#11 · Zasláno: 17. 11. 2007, 11:41:30
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ě:
|
||
Dranel Profil |
#12 · Zasláno: 17. 11. 2007, 11:51:23
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 |
#13 · Zasláno: 17. 11. 2007, 11:59:36
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 |
#14 · Zasláno: 17. 11. 2007, 12:20:23
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 |
#15 · Zasláno: 17. 11. 2007, 13:17:42 · Upravil/a: loyza
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:
A asi bych udělal nějaký javascript, který by dovolil uživateli do toho pole vkládat jenom čísla. |
||
nightfish Profil |
#16 · Zasláno: 17. 11. 2007, 13:27:51
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 |
#17 · Zasláno: 17. 11. 2007, 14:10:37
loyza, nightfish
Dejte hlavy dohromady hosi a vyronte pls neco - ja jsem v tom stracenej :( |
||
nightfish Profil |
#18 · Zasláno: 17. 11. 2007, 14:19:28
$vstup = "123-456-789"; // do promenne $vstup si uloz vstup z formulare |
||
Dranel Profil |
#19 · Zasláno: 17. 11. 2007, 16:09:52
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 |
#20 · Zasláno: 17. 11. 2007, 16:39:04
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 |
#21 · Zasláno: 17. 11. 2007, 16:52:19
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 |
||
Časová prodleva: 16 let
|
0