| Zdravím, jsem zase já s mojí hrou, a zase potřebuju poradit.
V jedné sekci mám několik imputů, a on mi do nich zadává toho: "0-999999" a tím pádem mu to odečte klidně i víc než má.
Mám tam pár věcí který by tomu měli zabránit (jedná se o prodej surovin ve hře, do pole zadáte číslo kolik chcete prodat, a nesmíte prodat víc než máte a nesmí tou ochranou prijít záporné číslo.). Chráním to tímto!
if($_POST['pocet'])
=='') echo "Udej počet zboží!";
elseif($_POST['pocet'] <= '0') echo "Všechna čísla musí být kladná!";
elseif( $_POST['pocet'] > $prodej['jidlo'] ) echo "Nemůžeš prodat víc než máš!";
elseif( $_POST['pocet'] <='0') echo "Tak něco prodej vole!";
else{
$pole = explode("-",$_POST['pocet']);
$delkaPole = strlen($pole);
$vysledneCislo = "";
for($i=0;$i<$delkaPole;$i++)
{
if(is_numeric($pole[$i]))
{
$huh .= $pole[$i];
}
}
$penize_pridat=($huh * 1);
mysql_query('UPDATE `lg_4099`.`uzivatele` SET `penize` = `penize` +('.$penize_pridat.') WHERE id="'.$_SESSION['id'].'" ');
a stejnak když zadá váše zminěné číslo tak mu to odečte jakoukoliv hodnotu :(.
Jaký mám použít script aby se to nestávalo?
(odpovědět) | Pokyy | 85.207.18.* | 21.7.2008 11:12 |
|
|
|
| Minule jsi to kontroloval podminkou 'is_numeric' myslim. Tak cely ten kod co jsi sem postnul zabal do te podminky 'if(is_numeric($_POST['pocet']))'
A nepouzivej promnennou '$_POST['pocet']' vsude,
nahraj si tu hodnotu do sve promenne: $pocet = $_POST['pocet'];
A tu teprve kontroluj, upravuj, zakazuj.. (odpovědět) | _Phuck3r | 88.146.45.* | 21.7.2008 13:53 |
|
|
|
| Jj, is_numeric je dobry reseni, nebu tky intval... navic myslim, ze je zbytecny '0', staci 0 ne?(pretypovani)
taky je zajimavy
if(podminka) neco; elseif (stejna_podminka) ... :)
Btw s kopii promennych v pameti nesouhlasim (teda pro konrtolni ucely, pokud je treba s jejim obsahem dale pracovat, tak jo, aby nam zustal original)
... jo a vubec nechapu k cemu slouzi ta cast s explode :)... (odpovědět) | Petrof_ | 212.90.248.* | 21.7.2008 14:27 |
|
|
|
| S tou kopii co jsi rikal, zajimalo by me proc je lepsi? Pokud je to totiz lepsi, zajima me proc.
pls vysvetli (odpovědět) | _Phuck3r | 90.176.226.* | 21.7.2008 17:47 |
|
|
|
| imo je to neelegantni (neefektivni)... proc mit v pameti 2 stejne promenne? Zabere to 2x tolik mista. Navic to sezere i nejakej ten mikrocas :)... predstav si, ze mas 5 vstupu, ktere chces kontrolovat... to budes delat
$vstup1 = $_POST["vstup1"];
$vstup2 = $_POST["vstup2"];
...
if($vstup1 && $vstup2 && ... vstupn) ... ?
Neni jednodussi napsat if($_POST["vstup1"] && ...$_POST["vstupn"]) ?
Samozrejme, ze si muzes neco jako: foreach($_POST as $jmeno => $hodnota) $$jmeno = $hodnota;, ale je to zbytecne pomaly.
Nemluve o tom, ze kdyz potom bude chtit nekdo skript predelavat, tak nepozna, jestli je to hodnota od uzivatele, nebo jestli se jedna o nejakou pomocnou promennou (jasne, muzes zas oznacovat $inp_promenna, ale zas dalsi prace navic).
... tak to vidim ja :P (odpovědět) | Petrof_ | 212.90.248.* | 21.7.2008 19:14 |
|
|
|
| Ok, rad se poucim.. (odpovědět) | _Phuck3r | 88.146.45.* | 22.7.2008 12:40 |
|
|
|
| A ono ne :). Pokud vytvoris promennou je to lepsi at uz z bezpecnostnich duvodu, tak i z duvodu optimalizace.
1) Bezpecnost. Muze se stat cokoliv a promenna v POST se ti muze zmenit.
Za dalsi pokud se nemylim, tak do promenne post nemuzes zapisovat, tim padem, mas vesmes nulovou moznost s tim pozadavkem pracovat.
2) Efektivita. Takze pokud vytvoris promenou a dosadis tam hodnotu post, tak pri ziskavani teto hodnoty, se spotrebuje mene casu, mene manipulace s pameti nez pri pouzivani POST[...].. Proc? Jelikoz post je typ slovniku a tim padem pri alokaci zabere vic mista nez promenna a zaroven nasledna manipulace (bavime se o nano sekundach bo mozna este min) trva o neco dele nez jenom prectenim hodnoty v pameti. Spracovani slovniku je o neco slozitejsi nez promenna ;). (odpovědět) | babca | 194.212.59.* | 22.7.2008 13:08 |
|
|
|
| Samozrejme, pokud chces s pozadavkem dale pracovat (upravovat atd), tak je lepsi kopie. Jinak do $_POST tusim zapisovat jde (ne ze bych to nejedboze delal :). Je jasny, ze manipulace se slovnikem je casove narocnejsi, nez jednoducha prace s promennou. Myslel jsem to z hlediska jednoduche kontroly...
tzn opravdu jen pripady, kdy treba kontrolujes
if($_POST["dodrzimpravidla"]) je vyhodnejsi nez $pravidla = $_POST["dodrzimpravidla"];
if($pravidla)... nekomu to mozna prijde jasny, ale vidim to hodne casto... ovsem, co by me docela zajimalo, jestli je vyhodnejsi konkretne
$xx = $_POST["xx"];
if(validate($xx)) fce($xx);
nebo
if(validate($_POST["xx"])) fce($_POST["xx"]);
... osobne se teda lip vyznam v druhem pripade, je to o 1 radek min (nadruhou stranu, koho to zanedbatelny casovy zpozdeni zajima)... a kdybys takhle kontroloval 5 parametru, tak uz mas 5 radku navic
... rekl bych, ze v takovejchle jednoduchejch pripadu to zavisi hlavne na zvyku (odpovědět) | Petrof_ | 212.90.248.* | 22.7.2008 13:52 |
|
|
|
| koukam, ze ani jeden jste toho v php moc nenapsal. o tom, ze byste meli poneti o kompilaci a behu php ani nemluvim :)
(odpovědět) | prc | 213.211.51.* | 23.7.2008 17:49 |
|
|
|
| ja v php nedelam a ani se o nej nezajimam, ale z hlediska logickeho uvazovani, vzdy ti bude trvat prace se slovnikem dyl, nez s promenou ci polem, to je pravda, ne? A je jedno jak ten interpretr pracuje, vzdy to tak bude. Teda pokud si to myslim spravne... Vzdy ti bude trvat min casu hledani, kdyz ti reknu presne cislo stranky v knizce, nez kdyz ti reknu nazev kapitoly a ty si to musis v obsahu najit.
Ale samozrejme je mozne ze se mylim, v php nedelam, ale zdravy rozum mi napovida toto.
Ikdyz je pravda, ze kompilator v tom muze udalat taky svoje. (odpovědět) | babca | 194.212.59.* | 23.7.2008 19:18 |
|
|
|
| to je samozrejme pravda, i kdyz rozdil neni az tak velky (fetch jednoduche promenne stejne jako prvku jednorozmerneho pole je v php bytecodu jeden opcode. hashovane klice poli. slusny reuse alokator.) a rozhodne je zanedbatelny v prostredi, pro ktere je php urceno.
ale o to nejde, hlavni duvod je ten, ze jednodussi identifikator se lepe pise :)
(odpovědět) | prc | 213.211.51.* | 24.7.2008 18:54 |
|
|
|
| jj se vsim souhlasim. Me slo jenom o to vyvratit mu to tvzeni, ze se se slovnikovou strukturou da usetrit vice O(...). :).. Jinak samozrejme se se slovniky dela o dost znacne rychleji v uzivatelskem modu :). A nehlede, jak pravis, stejne se vyhledava podle hashovaneho klice :)... Tam slo o to ujasnit si co je rychlejsi :) (o ten bezvyznamny cas) :)
Aspon ze jsem se nemylil :)
Dekuji :) (odpovědět) | babca | 194.212.59.* | 24.7.2008 23:56 |
|
|
|
| to je kod na bliti. proc is proste neprectes dokumentaci misto vymysleni kravin?
$pocet = intval($_POST['pocet']);
if ($pocet <= 0) error;
elseif ($pocet > $prodej['jidlo']) error;
else update;
(odpovědět) | prc | 213.211.51.* | 23.7.2008 17:29 |
|
|
|
|