Autor | Zpráva | ||
---|---|---|---|
Jcas Profil * |
#1 · Zasláno: 23. 9. 2010, 18:50:53
Zdravím. Nevíte někdo o nějakém (CS) článku, který vysvětluje základní stavbu - postupy.
Mám takový problém, že si nejsem schopen navrhnout strukturu. php pracuje na serveru, což znamená, že na zpracování jakéhokoliv vstupu uživatele, musím kontaktovat znovu server. header() - nesmím nic vypsat, takže uživatel nemůže mít vstup, protože jsem mu ještě nic nevypsal. Takže by zpracování muselo proběhnout v nějakém externím souboru a výsledek vrátit. form akcion="#" - to je jako by jsme znovu načetli stránku. Jasně, zde zpracujeme vstup už, který máme v $_POST, ale zhodnocení vstupu a případné reakce? To že mám neznalosti v postupech jsem zjistil, když jsem přemýšlel jak zpracuji povinná pole. if (empty($_POST....echo.....) A teď co? jak zajistit, aby se vypsalo až po odeslání. Aby to neotravovalo při prvním zobrazení, aby se to opakovalo při opakovaném nevyplnění input atd. Nehledám řešení okamžitého problému. Vím jak bych to udělal, aby to fungovalo. Podmínka + podmínka + podmínka atd. Hledám článek, který by vysvětlil, jak se to správně dělá. |
||
Jcas Profil * |
#2 · Zasláno: 23. 9. 2010, 19:37:50
objevil jsem zajímavou metodu.
Uložit si vypsání html kodu do funkce (funkcí) a když neprojdeme přez určité podmínky, tak použít funkci die(voláme funkce pro vypsání html kodu) Následné zajistíme, že nic dalšího se nevypíše. Ovšem nic to nemění na tom, že nemohu najít žádný článek, který by se zabýval strukturou. Všude pořád dokola jen vytvoření proměnné a její volání. |
||
Jcas Profil * |
#3 · Zasláno: 23. 9. 2010, 19:43:34
ps. platí pro php stejná viditelnost proměnných jako v javascriptu? tzn.
function bla(){} $file = $_POST.... že vunkce bla() bude znát $file |
||
Keeehi Profil |
#4 · Zasláno: 23. 9. 2010, 19:59:21 · Upravil/a: Keeehi
Jcas:
„platí pro php stejná viditelnost proměnných jako v javascriptu?“ Ne. $file = "a"; function bla(){ $x="b"; echo $file; echo $x; } bla(); //vypíše se jen "b" $file = "a"; function bla($soubor){ $x="b"; echo $soubor; echo $x; } bla($file); //vypíše se "ab" $file = "a"; function bla(){ global $file; $x="b"; echo $file; echo $x; } bla(); //vypíše se "ab", ale tuto možnost bych nedoporučoval. Špatně se potom hledají chyby, když funkce přepisuje proměnné které jsou mimo funkci |
||
Jcas Profil * |
#5 · Zasláno: 23. 9. 2010, 20:24:09
Jasně, takže aby funkce viděla proměnou, která je "vně", tak ju musím buď globalizovat, nebo předat jako parametr.
A k té struktuře. Uvedu příklad str. pro editaci. 1.form na přihlášení - pokud neproběhne, pomocí die(funkce()form na přihl.) a zabiju vše za tím. 2. výběrový form - co chcu dělat 3. kontrola vyplnění - ???volám funkci? volám jiný soubor? nebo pouze podmínka 4. špatně = znova - jak? dobře = další form na přídavek, nebo editace existujícího. 5.další form na přídavek - stejné otázky jako bod 3 6. editace - zobrazit existující a editovat - ???soubor?, funkce?, podmínka? Jakou by jste volili strukturu? |
||
Alphard Profil |
#6 · Zasláno: 24. 9. 2010, 20:28:01
Jcas:
Přečetl jsem všechny 4 vaše příspěvky, ale pořád moc nechápu, co myslíte. A asi nejsem sám, jinak by tady bylo více odpovědí. „php pracuje na serveru, což znamená, že na zpracování jakéhokoliv vstupu uživatele, musím kontaktovat znovu server.“ Ano. Při každém požadavku se kontaktuje server. „header() - nesmím nic vypsat, takže uživatel nemůže mít vstup“ Vůbec nechápu. Před header nesmí být žádný výstup, jak to souvisí se vstupem? „jak zajistit, aby se vypsalo až po odeslání“ Vždyť to tam máte napsané. Zkontrolujte existenci (prázdnost) nějaké hodnoty z formuláře. „die(voláme funkce pro vypsání html kodu)“ Existuje více způsobů, jak řídit výstup. die() je docela agresivní, ale jestli se vám zrovna hodí… „???soubor?, funkce?, podmínka?“ „Jakou by jste volili strukturu?“ Až se v PHP trochu zorientujete, podívejte se na MVC. Nyní se mi ale zdá, že vám unikají základy. Každá akce odpovídá nějakému požadavku, obvykle specifickovanému v URL adrese. Přečtěte si nějaké návody. |
||
Jcas Profil * |
#7 · Zasláno: 25. 9. 2010, 01:14:31
Aby jste pochopili, na co se ptám, musíte se naladit na myšlení laika a lamy.
„header() - nesmím nic vypsat, takže uživatel nemůže mít vstup“ Vůbec nechápu. Před header nesmí být žádný výstup, jak to souvisí se vstupem? Nepochopení header header() // odešlu hlavičku dřív než vypíšu form <form>...</form> //to je OK, ale uživatel nemohl provést vstup, protože jsem mu žádný form ještě //nevypsal. Nejsem tedy ani schopen zpracovat jím zadaná data dále - to co hledám <input type="submit" name="edit">..... if(isset($_POST['edit'])) { //není co řešit, když budu mít málo vstupních polí echo 'tohle' //ještě třeba mohu přidat podmínku, jestli byla vyplněna všechna povinná pole To co mě trápí je, že to plácám. Problém souvisí s mým předchozím příkladem, kde jsem očísloval jednotlivé kroky. Tak jak jsem to napsal to nejde. vše v jednom souboru(přihlášení vynechám-bod1) 3. Byl form odeslán + byla vyplněna všechna povinná pole 5. Ano = zobraz další form 2+4. ne = zobraz první form Jak vidíte stavba skriptu je důležitá a já hledám článek, který by se tímto zabýval. Jelikož teď žeším formulář, který pracuje asi z 10 poli a dle jejich vyplnění zobrzuje rozdílné stránky. A hlavní problém je, aby se "tohle" zobrazilo "právě a jen tehdy, když" Funkce, soubor atd - je jasné že všechno dělá jinou věc. Jednoduchý příklad který jsem teď napsal řeší variantu, kdy je vše pouze přes podmínku naskladané za sebou. Ale jsou i další struktury. Např. použiju-li zobrazení formuláře přes funkci, je v podstatě jedno kam ji strčím, protože se vypíše pouze když ji zavolám. function zobraprvniform() {return $funkce = '<form>....</form>';} 3. Byl form odeslán + byla vyplněna všechna povinná pole 5. Ano = zobraz další form 2+4. ne = echo zobrazprvníform() A pak je taky možný nasměrovat action na jiný php a vrátit hlavičku. Nechci dělat patláma. Rád bych si někde přečetl jaké jsou postupy, abych dřív než začnu psát věděl, např. "ano, tyto výsledky mi tam budou zavazet, měl bych je strčit do jiného souboru. |
||
Step Profil |
#8 · Zasláno: 25. 9. 2010, 06:31:52
Jcas:
hlavičky se posílají samy, při prvním výstupu, takže např: echo "a"; vám je odešle header() používejte když je chcete změnit, např při přesměrování pokud je formulář odeslán tak potom v $_POST jsou všechny jeho pole, takže funkcí isset zjistíte jen jestli byl odeslán, vyplnění se zjišťuje pomocí empty() na vše v jednom souboru je ideální zmiňovaná architektura MVC, na začátek bych doporučil kouknout na nette velmi dobře zpracované jsou formuláře právě v nette, které dokáží dost usnadnit práci |
||
Alphard Profil |
#9 · Zasláno: 25. 9. 2010, 15:37:00
Jcas:
> header() // odešlu hlavičku dřív než vypíšu form > <form>…</form> //to je OK, ale uživatel nemohl provést vstup, protože jsem mu žádný form ještě //nevypsal Opět z vašeho popisu moc moudrý nejsem :-( Radši se zeptám, je vám jasný princip zpracování PHP skriptů? PHP nečeká na žádné uživatelské akce. Po zaslání požadavku na server se zpracuje celá stránka, PHP se ukončí a uživateli se odešle výstup, např. váš formulář. Teď uživetel může vyplnit formulář a dát odeslat. Tím se znovu spustí PHP a opět vyhodnotí celou stránku. Tentokrát ale existují proměnné z formuláře, takže se může vyhodnotit patříčná větev skriptu. Pak se PHP opět ukončí a výsledek se odešle uživateli. Celé zpracování stránky trvá zlomek sekundy a pořád se opakuje s každým novým požadavkem. *Ta formulace "PHP se ukončí a výsledek se odešle uživateli" je silně zjednodušená a ne zcela přesná, ale pro součný problém snad vyhovující. |
||
Jcas Profil * |
#10 · Zasláno: 25. 9. 2010, 15:54:46
toto jsem teda zatím absolutně nepochopil, ale každopádně děkuji, protože jste mě nasměrovali.
Myslím, že na začátek je ideální tento odkaz. |
||
Jcas Profil * |
#11 · Zasláno: 25. 9. 2010, 18:34:49
Tak už nevím jak to vysvěstlit. S mým stylem "patláma" jsem se dostal do situace.....
(Mám asi dvacet <input>ů a jejich vyplnění, nebo přeskočení silně ovlivňuje další kroky a kombinatorika dělá opravdu velké počty možností.) ...že můj script najednou dostává strašně moc podmínek. if(isset...)){ if(isset()) { if(isset()) { if(isset()) { } } } } A po mnoha podmínkách jsem vlastně zpracoval pouze jednu možnost. Zjistil jsem, že takhle NE. Že jdu na to úplně špatně a že si musím ujasnit architekturu, jakou script bude mít. A tak jsem začal hledat článek, který by vysvětloval tuto problematiku a nedaří se mi nic najít. Stále jen nacházím vysvětlení, jak vznikne $_POST, jak si můžu ověřit, že script byl odeslán atd. Díky tomu jsem třeba našel metodu (způsob řešení), kdy výpis HTML vrací funkce. Podívejte se na příklad, který ukazuje onu problematiku, která mě zajímá. if (!isset($_POST['edit'])) { //pokud nebyl form odeslán echo "<form>....<input type='submit' name='edit'/></form>"; } Nyní přidám kontrolu. if (isset($_POST['edit'])) { //pokud nebyl form odeslán if (empty($_POST['kategorie']) or empty($_POST['codelat'])) { //nebo 2 povinná pole nabyla vyplněna echo "<p><strong>nevyplnily jste povinná pole</strong></p>"; echo "<form>....<input type='submit' name='edit'/></form>"; } Jak vidíte, už teď je zvolena špatná struktura. Jednak mám v souboru jeden a ten samý formulář dvakrát a potom taky zbytečně připisuji jednu podmínku za druhou. Takže i když neznám řešení už teď vím, že je to špatný přístup. Bohužel stále jen nacházím články, který mi vysvětlí, že if (isset($_POST['edit'])) mi zkontroluje jestli byl form odeslán. A tak jsem objevil, že vypsání formuláře mohu narvat do funkce. if (!isset($_POST['edit'])) { //pokud nebyl form odeslán echo zobrazform(); } if (isset($_POST['edit'])) { //pokud nebyl form odeslán if (empty($_POST['kategorie']) or empty($_POST['codelat'])) { //nebo 2 povinná pole nabyla vyplněna echo "<p><strong>nevyplnily jste povinná pole</strong></p>"; echo zobrazform(); } Jak vidíte, stejný příklad, ale jiná řešení. Druhé řešení je bezpochyby lepší, protože mám <form> v souboru jenom jednou. A takhle vznikl můj dotaz. Hledání článku, který by vysvětloval, jakou volit architekturu scriptu. A ještě bych mohl zkusit vyřadit druhou podmínku na ['edit']. Použiju na to GET. if (!isset($_POST['edit'])) { //pokud nebyl form odeslán echo zobrazform(); } index.php?page=$_GET if (empty($_POST['kategorie']) or empty($_POST['codelat'])) { //2 povinná pole nabyla vyplněna echo "<p><strong>nevyplnily jste povinná pole</strong></p>"; echo zobrazform(); } Jak je zřejmé, když použiju metodu GET, tak už nemusím opakovat podmínku, která ověří, jestli byl form odeslán (ano musím vytvořit podmínku na GET, ale do ní mohu schovat několik dalších podmínek, které už nebudu muset opakovat). Jiný způsob stejně funkční, ale existuje článek, který by se věnoval tomu, jaký způsob volit? Asi mě nepochopíte, protože po tom co si to přečtete budete mít pocit, že to co mě zajímá znám[b][/b], jinak bych nenapsal, to co jsem napsal. Problém je v tom, že napíšu php, ozkouším a teď vidím "jé objevilo se něco, co už se teď objevit nemělo". Nebo "jé teď se neobjevilo to co mělo". Rychle najdu proč a rychle nejdu řešení. Jenže to je ten styl "patláma". |
||
Keeehi Profil |
#12 · Zasláno: 25. 9. 2010, 18:47:19
Váš kód je něco takového:
if (!isset($_POST['edit'])) { //pokud nebyl form odeslán echo "<form>….<input type='submit' name='edit'/></form>"; } if (isset($_POST['edit'])) { //pokud nebyl form odeslán if (empty($_POST['kategorie']) or empty($_POST['codelat'])) { //nebo 2 povinná pole nabyla vyplněna echo "<p><strong>nevyplnily jste povinná pole</strong></p>"; echo "<form>….<input type='submit' name='edit'/></form>"; } Ovšem co to napsat takto: if (!isset($_POST['edit'])) { //pokud nebyl form odeslán if (empty($_POST['kategorie']) or empty($_POST['codelat'])) { //nebo 2 povinná pole nabyla vyplněna echo "<p><strong>nevyplnily jste povinná pole</strong></p>"; echo "<form>….<input type='submit' name='edit'/></form>"; } Dělá to to samé, jen je to lépe zapsané. Jde o to, že když už jste jednou podmínku isset($_POST['edit']) otestoval, nemusíte ji o kus dál znovu testovat, ale tu podpodmínku vložíte do té první. Chce to jen logické uvažování. Tam, kde se kód opakuje to jde v valné většině případů nějak zkrátit. Stačí o tom jen přemýšlet. |
||
Jcas Profil * |
#13 · Zasláno: 25. 9. 2010, 19:02:48
Asi jsu blbej.
Pokud neexistuje prom. 'edit' formulář nebyl odeslán a nemohu testovat jeho vyplněnost. |
||
Keeehi Profil |
#14 · Zasláno: 25. 9. 2010, 20:56:45
Jcas:
Omlouvám se, nějak sem přehlédl ten vykřičník. Potom správně je to takto: if (isset($_POST['edit']) and (empty($_POST['kategorie']) or empty($_POST['codelat']))) { //pokud nebyl form odeslán echo "<p><strong>nevyplnily jste povinná pole</strong></p>"; } echo "<form>….<input type='submit' name='edit'/></form>"; |
||
Jcas Profil * |
#15 · Zasláno: 26. 9. 2010, 07:36:04
Dík jseš hodnej že radíš, ale přesně takto vzniklo tohle téma. Teď se zase nezobrazí formulář při prvním načtení stránky.
Udělám takový příklad a pooložím přímé dotazy. Zde jsem vytvořil pravdivostní tabulku, kde 1=true a to = zobrazeno uživateli. Jednoduchá věc. Form1 má select na výběr kategorie a radio na výběr "přidat""změnit" Form2 obsahuje pouze textová pole na přidání, nebo změnu. A teď teda ty přímé dotazy. Zpracovali by jste to všechno v jednom.php? Co by jste dělali přes GET a co přes POST? Co by jste narvali do funkcí? Použili by jste někde header(), nebo die()? |
||
Keeehi Profil |
#16 · Zasláno: 26. 9. 2010, 11:05:10
Jcas:
„Zpracovali by jste to všechno v jednom.php?“ Vždy záleží na situaci. Většinou to jde tak i tak, pak záleží jen na tobě, jakou cestou se vydáš. Nemohu říct, jak bych postupoval v tomto případě, neboť mám o tom stále málo informací. „Co by jste dělali přes GET a co přes POST?“ Data z formuláře z POSTu, data z odkazů z GETu. Vždy však zase záleží na konkrétní situaci. „Co by jste narvali do funkcí?“ Konkrétně to zase nemohu vědět, ale do funkcí se dává často opakovaný kód. „Použili by jste někde header(), nebo die()?“ Header asi ano, jednalo by se nejspíš třeba o přesměrování při úspěšné kontrole formuláře. Die osobně nemám rád, takže ho nepoužívám, ale jsou situace, kde se hodí. Obecně to prostě říct nelze. |
||
Časová prodleva: 14 let
|
0