| | |  |  | 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 | 
 | 
 | 
 | 
|  |