Autor Zpráva
Jcas
Profil *
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 *
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 *
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
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
Prostě proměnné uvnitř funkce a vně funkce se neovlivňují, i když se stejně jmenují. K porušení tohoto pravidla slouží to global.
Jcas
Profil *
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
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 *
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
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
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 *
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 *
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
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 *
Asi jsu blbej.
Pokud neexistuje prom. 'edit' formulář nebyl odeslán a nemohu testovat jeho vyplněnost.
Keeehi
Profil
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 *
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
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0