Autor | Zpráva | ||
---|---|---|---|
Laco Profil * |
Zdravim
Robim stranku pre jedného známeho, tu testujem na svojej domene, kde nemam ziaden problem. Ale ked ju skopirujem na server s domenou, ktoru si zakupil, tak tam vznika nejaky problem, Prehliadac stale vypisuje ze niektore premenne neboli este definovane, alebo neberie mi premenne z adresoveho riadku. a nechce sa mi prerabat celu stranku, aby som musel pridavat $_POST[] alebo $_GET[] ked ani este neviem ci budem zobrazovat premenne v adresovom riadku alebo nie. Potrebujem pomoc pls... www.fotodarceky.eu/index1.php < tu sa na to pozrite... hned hore mi hovori ze su nedefinovane premenne, a nic nerobi, lebo premenne z adresoveho riadku neakceptuje, kedze nepouzivam $_POST ani $_GET. Moderátor Joker: Správně je normální lomítko a ne zpětné
da sa to varovanie niekde vypnut? a aj to aby premenne bral normalne ? bez tych post a get? prosim help... dakujem! pozrite aj http://www.fotodarceky.eu/phpinf.php mozno to pomoze... som zacatecnik :) Moderátor Joker: Dva příspěvky sloučeny do jednoho Moderátor Joker: Titulek „Problem s nastaveniami PHP“ byl moc obecný.
|
||
Joker Profil |
#2 · Zasláno: 12. 8. 2011, 09:53:18 · Upravil/a: Joker
Laco:
Jde o nastavení register_globals. Nicméně PHP má tohle vypnuté už dlouhé roky (superglobální pole byla přidána v roce 2001!) a je nejvyšší čas si na to zvyknout. Nebo spíš nejvyšší čas si na to zvyknout byl někdy před 5 lety. Navíc vlastnost register_globals je zavržena a velmi se nedoporučuje na ni spoléhat. „nechce sa mi prerabat celu stranku, aby som musel pridavat $_POST[] alebo $_GET[]“ V tomhle případě by to bylo velice vhodné. „ani este neviem ci budem zobrazovat premenne v adresovom riadku alebo nie“ To je možná dobré si rozmyslet, pro různé typy situací se obvykle hodí buď metoda GET, nebo POST, není to úplně podle toho jak se zrovna programátor vyspí. Ale jinak existuje ještě pole $_REQUEST, které obsahuje obojí. „da sa to varovanie niekde vypnut?“ Tohle není dobrý přístup, přemýšlet jak potlačit chybové hlášky. Chybové hlášky jsou naši kamarádi, říkají nám, co je špatně. Zobrazování té poznámky samozřejmě potlačit jde, výsledkem bude, že skript se bude chovat divně, ale nebude zobrazovat žádné chyby - což je ta nejhorší situace. Jinak související nastavení jsou: error_reporting - jaké všechny chyby jsou hlášeny, nedoporučuji moc omezovat. display_errors - zda se chyby zobrazí do stránky. Na testovacím webu zapnout, na ostrém vypnout (návštěvníkům netřeba ty hlášky zobrazovat, těm stačí něco jako „Nastala chyba, na odstranění se pracuje“). log_errors - na ostrém webu (kde se chyby nevypisují do stránky) zapnout, na testovacím webu podle situace. |
||
Laco Profil * |
#3 · Zasláno: 12. 8. 2011, 10:32:27
Joker:
Dik za radu, v tomto prípade som chcel vypnút chybové hlasenia len kvoli tomu upozorňovaniu že do testovanej premennej ešte nebola žiadna hodnota priradená. Keď to PHP robí implicitne, tak prečo neustále priradzovať do všetkých premenných prázdne hodnoty? ! Bez chybových hlášok by som stránku ani nezostavil, takže sú super kamaráti. :) všade čítam o php.ini a pofdobne, kde by sa dalo registe_globals vypnúť, ale žiaden súbor na servery, kam kopírujem stránku.. mam sa dotázať u poskitovatela domény? thnx |
||
Joker Profil |
#4 · Zasláno: 12. 8. 2011, 11:26:08
Laco:
„kde by sa dalo registe_globals vypnúť“ Naopak, v tomhle případě zapnout (register_globals právě zařizuje překlad na ty proměnné). „žiaden súbor na servery, kam kopírujem stránku“ php.ini není v adresáři se stránkou. Na hostingu se typicky přímo měnit nedá, možná budou nějaká nastavení v administraci, ale typicky je to potřeba řešit s technickou podporou hostingu. Ovšem register_globals lze nastavit i přes .htaccess (viz http://www.php.net/manual/en/ini.core.php#ini.register-globals ) „prečo neustále priradzovať do všetkých premenných prázdne hodnoty?“ Hmm, v čem přesně je problém? Já měl za to, že jde o to, že skript nepoužívá $_GET a $_POST a spoléhá na to, že třeba skript.php?promenna=neco automaticky založí $promenna ="neco".
Nebo je problém v tom, že skript.php?promenna=neco funguje správně, ale když se vynechá to promenna=neco, napíše to tu poznámku? |
||
Laco Profil * |
#5 · Zasláno: 12. 8. 2011, 12:34:48
Joker:
„Já měl za to, že jde o to, že skript nepoužívá $_GET a $_POST a spoléhá na to, že třeba skript.php?promenna=neco automaticky založí $promenna ="neco".“ Ano presne o to ide, nepoužíval som $_GET a $_POST a teraz mám z toho chaos, niekde som čítal, že $_GET a $_POST sú dobré na to ak chceme prečítať premennú odovzdanú formulárom. je správne toto napríklad? : <?php $b = $b + 1; // Tu dostanem chybovú hlášku, že UNDEFINED VARIABLE.... prečo? ja to potrebujem mať vysvetlené ako decku. echo $b; echo $_REQUEST['b']; // Ktoré z tých sú správne? ešte raz dík za ochotu. |
||
Pilec Profil * |
Notice jsou chyby, ktere neovlivnuji beh skriptu, ale spise maji donutit programatora, aby se chytil za nos a rekl si, a bacha, tuhle promenou nemam deklarovanou. Hodne to pomaha pokud clovek napise trebas misto promene $page promenou $pgae (ve dve rano zcela bezna chyba :-D) tak mu to pomuze ten skript odladit.
Pokud se chces te notice zbavit, provedes to jednoduchym if (isset($tt)) { echo $tt; } else { echo 'zatim nemam $tt deklarovanou tak ji treba muzu nastavit defaultni hodnotu' $tt = 0; } Moderátor Joker: Přesunuto z duplicitního dotazu.
|
||
Joker Profil |
#7 · Zasláno: 12. 8. 2011, 13:26:42 · Upravil/a: Joker
Laco:
Pro jeden problém jedno vlákno, ať v tom není binec. Přesunul jsem odpověď sem. <?php $b = $b + 1; // Tu dostanem chybovú hlášku, že UNDEFINED VARIABLE.... prečo? ja to potrebujem mať vysvetlené ako decku. echo $b; echo $_REQUEST['b']; // Ktoré z tých sú správne? Generuje poznámku o nedefinované proměnné. PHP místo nedefinované hodnoty použije NULL, pro číselné operace se zkonvertuje na 0 a výsledkem bude $b=1. Pokud jde o to druhé, obojí je správně, ale jsou to různé věci. To první vypíše hodnotu proměnné $b, to druhé vypíše hodnotu toho, co skriptu předal požadavek pod jménem "b". Jestli proměnná vůbec existuje anebo má „neprázdnou“ hodnotu se dá testovat funkcemi isset a empty Příklad: Dejme tomu, že skript byl volán: skript.php?b=3 <?php $b = $b + 1; // Chyba, $b ještě není definováno. Dosadí se NULL, výsledek bude 1, viz výše echo $b; // vypíše se hodnota $b, tedy 1 echo $_REQUEST['b']; // Vypíše se co skript dostal v požadavku jako "b", tedy 3 Další příklad, obvyklé správné použití: Opět předpokládám, že skript byl volán: skript.php?b=3 <?php // Zkontroluji, zda jsem zvenku dostal "b". Pokud ne, dám si do $b 0, pokud ano, dám si tam to co jsem dostal // To samé je: if(isset($_REQUEST["b"])) $b = $_REQUEST["b"]; else $b = 0; $b = isset($_REQUEST["b"]) ? $_REQUEST["b"] : 0 // nyní $b = 3 $b = $b + 1; // $b = 4 echo $b; // vypíše hodnotu $b, tedy 4 echo $_REQUEST['b']; // vypíše 3 // Samozřejmě $_REQUEST není nic než pole a hodnoty v něm jde taky přepisovat: $_REQUEST["b"] = 2; echo $_REQUEST['b']; // vypíše 2 |
||
DoubleThink Profil * |
#8 · Zasláno: 12. 8. 2011, 13:45:02
Ještě zpět k register_globals. Ty je možné registrovat i ručně na začátku skriptu, například:
extract($_POST, EXTR_SKIP); Nebo sofistikovaněji pomocí pear/PHP_Compat. Ale samozřejmě, jak zmiňoval Joker, je to obecně zavržená programovací technika. |
||
Laco Profil * |
#9 · Zasláno: 12. 8. 2011, 14:17:29
Joker:
Ďakujem ešte by som chcel vedieť par vecí script.php : <form action="script.php?pr1=1" method="POST"> <input type="hidden" name="pr2" value="1"> <input type="submit"> </form> čiže keď chcem v scripte ďalej pracovat s premennou $pr1... musím sa na ňu dotazovať pomocou $_POST['pr1'] ..... ? a keď chcem robiť s premennou $pr2 ... tak stačí $pr2..... ? napísal som celú stránku bez $_POST či $_REQUEST.... a cez formulár posielam celé polia premenných, asi nemôžem jednoducho dať vo vsetkých súboroch prepísať nazvy premenných na $_POST['premenna']... boze čo je to za nezmyseľ... viac to komplikovať, proste potrebujem jednoducho pracovať s premennými a teraz na začiatku scriptu mám dať if (isset $_REQUEST['premenna']) premenna = $_REQUEST['premenna']; pre vsetky premenne? stracam tym flexibilitu.. neverím, že každý kto posiela premenné cez formulare, potom celý čas pracuje s tou premennou vo forme $_POST['premenna'] + $_POST['premenna']*10-strpos($_POST['premenna'],....) ..... atd... sory ale píšem to z nahnevanosti. lebo to nechapem :( |
||
DoubleThink Profil * |
#10 · Zasláno: 12. 8. 2011, 14:23:10
Laco:
> neverím, že každý kto posiela premenné cez formulare, potom celý čas pracuje s tou premennou vo forme $_POST['premenna'] Ano, dělá to tak každý zkušenější programátor. V praxi se ale o globální pole, díky zapouzdření procedur, stará většinou jen controller na jednom místě. |
||
Joker Profil |
#11 · Zasláno: 12. 8. 2011, 15:33:51 · Upravil/a: Joker
Laco:
Poznámka, kód se vkládá mezi značky značky [>pre] a [>/pre] (stačí kliknout na ), pak ho to i obarví jako v mých příspěvcích. > čiže keď chcem v scripte ďalej pracovat s premennou $pr1... musím sa na ňu dotazovať pomocou $_POST['pr1'] ..... ? > a keď chcem robiť s premennou $pr2 ... tak stačí $pr2..... ? Ne. Kód: <form action="script.php?pr1=1" method="POST"> <input type="hidden" name="pr2" value="1"> <input type="submit"> </form> $_GET["pr1"] = "1" $_POST["pr2"] = "1" „asi nemôžem jednoducho dať vo vsetkých súboroch prepísať nazvy premenných na $_POST['premenna']“ Všechny ne, jen to co přijde z formuláře. Jinak v $_POST se obvykle drží data tak jak přišla a nepracuje se s nimi, pro nějaké úpravy se zkopírují do jiné proměnné. Samozřejmě jde udělat: $neco = $_POST["neco"]; „viac to komplikovať, proste potrebujem jednoducho pracovať s premennými a teraz na začiatku scriptu mám dať“ Ono to není o moc komplikovanější než register_globals. Zásadní nevýhoda register_globals je, že programátor nemá pod kontrolou kolik a jakých proměnných se vlastně vytvořilo. Pokud byl programátor líný a neinicializoval si důsledně všechny proměnné, bylo pak možné hodnoty proměnných „podstrčit“ zvenku a tím hacknout aplikaci. Příklad- skript.php: <?php if($tajneheslo == "hunter2") /* $tajneheslo je z formuláře*/ { $administrator = true; } if($administrator) echo("Kód pro administrátora"); ?> Fakt, že zapnuté register_globals vytvářelo takovéhle skryté bezpečnostní díry byl jeden z hlavních argumentů pro jeho zrušení. „stracam tym flexibilitu“ V čem přesně? Myslím, že právě naopak. |
||
Časová prodleva: 3 dny
|
|||
Laco Profil * |
#12 · Zasláno: 15. 8. 2011, 09:10:27
:) Stále som vďačný za ochotu venovať sa mi :)
Takže mám posledný dotaz, test.php : <?php if(!isset($t1[0][0])) $t1[0][0] = ""; if(isset($_REQUEST['t1[0][0]'])) $t1[0][0] = $_REQUEST['t1[0][0]']; echo $t1[0][0]; // ani po poslaní formulárom sa tam to AHOJ neobjavy.... preeeeecooooo ? <form action="test.php" method="POST"> <input type="hidden" name="t1[0][0]" value="AHOJ"> <input type="submit" value="OK"> </form> Prečo neviem získať tú hodnotu $t1[0][0] poslielanú formulárom? mozno niečo s rawurldecode treba niečo skúsiť? ďikec |
||
Laco Profil * |
#13 · Zasláno: 15. 8. 2011, 09:11:50
zabudol som doložit značku konca PHP :
?> ale nie to je moj problém. :) Dik. |
||
Tori Profil |
#14 · Zasláno: 15. 8. 2011, 09:24:23
name="t1[0][0]" ==> $_REQUEST['t1'][0][0] print_r($_REQUEST); |
||
Laco Profil * |
#15 · Zasláno: 15. 8. 2011, 11:30:45
Super ... to mi moc pomohlo...
a to znamená že: <input type="file" name="subor1"> a $_REQUEST['subor1'] je automaticky typu file? viem, že toto je už taka lenivá otázka mal by som to radšej študovať, no už len túto jednu vec potrebujem vedieť k prerábaniu stránky .... vrelá vďaka. |
||
Tori Profil |
#16 · Zasláno: 15. 8. 2011, 12:08:02
Laco:
„mal by som to radšej študovať“ anebo aspoň vyzkoušet. Odeslané soubory jsou (pokud se nepletu) v poli $_FILES. |
||
Laco Profil * |
#17 · Zasláno: 15. 8. 2011, 13:46:22
Hej, až sa hanbím....(stidím)
Ale som v praci a nemožem sa tomu teraz venovať a som netrpezlivý chcel smo to aspoň rychlo vedieť... Ďik tomuto fóru :) |
||
Časová prodleva: 13 let
|
0