Diskuze: problem se zpracovanim $_POST pozadavku
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 11 zpráv z 11.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.


samozrejme kod sem prochazel asi stokrat, zadna chyba v syntaxi nebo
tak...
uz nevim co s tim....
Strkat obsah $_POST do $_SESSION není zrovna nejlepší nápad.
Test isset($_GET) je zbytečný. Pole $_GET existuje vždy, i
když si nejsem jist, jestli je dostupné uvnitř třídy. Ještě jsem to
nezkusil.
Co je obsahem proměnné self::_param1? Je v ní název indexu?
Proč jednoduše nepoužiješ $_GET['parametr']?
Větev empty post tam nevidím. Jestli myslíš tu zakomentovanou, tak ta se nikdy neprovede, protože je odchycena už v první podmínce.
Takhle se dnes dělá MVC? V tom bych se nevyznal.
$_POST do $_SESSION strkám
jen v této ukázce, abych "ukázal" že data z $_POST jsou dostupná až po
ukončení zpracování formuláře... $_GET v mé třídě není vždy
dostupné.
self::_param1 je název parametru, Jinak jsem se pokusil vyjádřit "jádro"
problému, což se mi očividně nepovedlo, což teď už chápu (po přečtení
mého příspěvku) takže se omlouvám za zmatek, byl jsem "rozpálený",
a nepomyslel jsem na to že vy
vlastně o tom jak můj kód funguje nevíte vůbec nic. Ukázka s mím kódem
nemá nic moc společného. Pokusím se ještě jednou snad to bude lepší...
(doufám)
Pro Controller používám vzor singletron (běží na jedné instanci), V jeho
konstruktoru mám front controller, nejdříve ověřím zde je zaslán nějaký
$_POST požadavek (v první větvi), pokud ano, zpracuji, pokud ne tak ověřím
jestli existuje nějaký $_GET parametr a jestli má platnou hodnotu, pokud ano,
zpracuji na základě té hodnoty parametru, pokud ne v poslední větvi
(else{})zobrazím defaultní stránku, (uživatel nic nechce). Jak jsem psal
vše funguje bezvadně třeba u modulu pro přihlášení aj.. Problém je že,
právě formulář pro registraci, se nechce zpracovat. Tzn. ve front
controlleru přejde do poslední větve else a zobrazí se defaultní
stránka... (první větev = $_POST požadavek, druhá = $_GET požadavek.
Protože není definován $_POST (i když by po odeslání regis. formuláře
měl být definován) ani $_GET, skočí do else...
Singleton se používá jen tam, kde je to nezbytně nutné. Controller není ten případ.
Uvědom si, že když se zpracuje 1. větev, tak další se už neprovedou.
Podmínky empty($_POST) a isset($_GET) není třeba testovat, protože v daném místě jsou splněny vždy.
Celé mi to připadá značně chaotické. Proč to děláš tak složitě? Když použiješ Simple Factory tak to bude krásně přehledné a nebude to zlobit.
Na Simple Factory se ještě podívám, jinak singleton mi přišel že se mi sem právě docela hodí...
K těm větvím, právě že je splněna vždy jen jedna:
if( !empty($_POST) )
{
// Zpracuji požadavek a přesměruji, (do další větve už nepolezu)
}elseif ( empty($_POST)
&& isset($_GET["parametr"])
&& array_key_exists(ValidateInputController::validateInput($_GET["parametr"], FALSE),$arr_request)// pokud parametr je v poli povolených parametrů
)
{
$func = $arr_request[ValidateInputController::validateInput($_GET["parametr"], FALSE)];// struktura $arr_request je = array("getParametr"=>"volanaMetoda")
return $this->$func();// Zavola danou metodu, treba sowRegistrationPage()
}else
echo View::getDefaultPage();
Jestli máš lepší řešení, budu jen rád když mě s ním seznámíš

Na co ten Sigleton potřebuješ? Většinou k ničemu jinému, než k otevření databáze. V ostatních případech je lepší se mu vyhnout. Je to antipattern. Skoro bych řekl, že se nehodí k ničemu, až na výjimky.
Ve druhé větvi nemusíš testovat podmínku empty($_POST),
protože je splněna vždy, když není splněna podmínka pro první
větev.
Proč používáš statické objekty? Proč voláš
ValidateInputController::validateInput() 2× za sebou? Kam
ukládáš výsledek validace $_GET["parametr"]? A proč vlastně
validuješ, když to používáš jako index do slovníku
$arr_request?
S návrhovými vzory moc zkušeností nemám, ale u toho singletonu se mi
hlavně líbila přectava, že se pořád pracuje s jednou instancí objektu,
proč vytvářet pokaždé novou stejnou instanci? K otevření databáze jí
ani nepoužívám, pro to používám PDO s vlastní statickou třídou, tam
vlastně taky pracuju jen s jedním spojením... Dvakrát validovat nemusím, to
máš pravdu, validuji proto, že nevím zda by se dal použít nějaký
záškodný kód, což si myslím že dal, jistota je jistota
, Statické objekty používám jen
v případě database a jedné třídy View, kde mi to tak přišlo
lepší...
Tak ještě jednou a naposled: Singleton je na ho..o. Zapamatuj si to.
Celé se to bezpečně dá udělat třeba takto i bez pole
$arr_request:
function factory() {
if(!empty($_POST)) return new ZpracujPost($_POST);
if(isset($_GET["parametr"]) {
switch($_GET["parametr"]) {
case 'getParametr': return new ZpracujGetParametr($_GET);
case 'jinyPrikaz': return new ZpracujJinyPrikaz($_GET);
default: return new UzivatelJeKretenKteryMeChceHacknout($_GET);
}
}
return new DefaultPage();
}
$objekt=factory();
echo $objekt;
V tom mém příkladu chybí jedna uzavírací závorka. Jinak by to mělo
být funkční. Samozřejmě je možné na $_POST udělat úplně
stejný switch jako na $_GET["parametr"] a tím tu
továrničku dovést k dokonalosti.
Když se konstruktorům přidá další parametr $model, vznikne
z toho přehledná realizace MVC.
Zobrazeno 11 zpráv z 11.