Autor | Zpráva | ||
---|---|---|---|
Pavlínka Profil |
zpracovávám registraci - při které když některé z zadaných polí zapíše správně (v tomto případě nickname) ale jiné nikoli (například password), měli by se vepsat zpět do inputu
následující kod pro ověření nickname: if(empty(trim($_POST["username"]))){ $msg = "<span class=\"sign__error\">Zadejte prosím uživatelské jméno.</span>"; } elseif(!preg_match("/^[a-zA-Z-]*$/", trim($_POST["username"]))){ $msg = "<span class=\"sign__error\">Uživatelské jméno může obsahovat pouze písmena a-Z a polmčku.</span>"; } else{ $sql = "SELECT `id` FROM `plac`.`user` WHERE `nickname` = ?"; if($stmt = mysqli_prepare($mysqli, $sql)){ mysqli_stmt_bind_param($stmt, "s", $param_username); $param_username = trim($_POST["username"]); if(mysqli_stmt_execute($stmt)){ mysqli_stmt_store_result($stmt); if(mysqli_stmt_num_rows($stmt) == 1){ $msg = "<span class=\"sign__error\">Toto uživatelské jméno je již obsazeno.</span>"; } else{ $username = trim($_POST["username"]); } } else{ $msg = "<span class=\"sign__error\">Chyba!</span>"; } mysqli_stmt_close($stmt); } } v kodu následuje ověření dalších součástí registrace, kde $username již není zmiňována... na konci chci vypsat $username ale nevypíše se mi nic... $msg se posílá jak má... netuším kde dělám chybu? děkuji za rady |
||
mckay Profil |
#2 · Zasláno: 18. 3. 2021, 08:41:50
Pavlínka:
Proměnná $username je nastavena (existuje) jen pokud již není zvolené jméno obsazené. Z dostupného úryvku kódu to vypadá, že v $msg se ukládají pouze chybové informace, zatímco $username je nastavena pouze v případě, že validace proběhne úspěšně. Rychlá oprava bude username proměnnou nastavit hned na začátku zpracování. Při výpisu potom bude dávat smysl to ještě HTML enkódovat, má to potenciál pro XSS.
|
||
Pavlínka Profil |
mckay:
no ano - $username má existovat pouze pokud je vše správně... problém ale je, že i když je vše správně, $username se nepošle... v všech ostatních případech to posílá správně $msg asi jsem něco zkonila ale nevidím nikde chybu... |
||
mckay Profil |
#4 · Zasláno: 18. 3. 2021, 08:57:58
Pavlínka:
Pošle kam? Na výstup, nebo tam je ještě nějaká jiná mechanika ve hře? A vůbec neukazuješ tu část, kde s $username pracuješ. V originálním příspěvku je pouze to místo, kde to nastavuješ - v předpokládám jednom místě, kde s tím zrovna pracuješ a vynechala jsi zbytek validací pro přehlednost. Zkus ukázat i ten zbytek, nebo alespoň tu část, kde to posíláš/vypisuješ. A ještě jedna věc - týká se to toho velkého projektu, pro kterej jsi začala řešit ve vlákně vedle VPS? Pokud jo, zvaž jestli nepoužít nějakej framework (třeba Laravel, nejpoužívanější PHP framework). Má rychlou učící křivku a zaběhlé přístupy k tomu jak řešit validace a posílat si chybové informace (a stav) mezi stránkami. |
||
anonym_ Profil * |
#5 · Zasláno: 18. 3. 2021, 09:09:57
Pavlínka:
Z toho kódu je naprosto zřejmé, ze buď existuje username, nebo msg. Nevidim tam letmym pohledem žádnou situaci, kdy by naráz existovaly obě proměnné. |
||
Pavlínka Profil |
dale se to melo zapsat do databaze...
K zapisu jsem se ale zatim nedostala, protoze $username se neposila... Je to zdanlive jednoduchy kod, z uryvku chybi temer jen pripojeni k databazi dalsi kod je zbytecne zde psat, pokud hned pod uryvek napisu echo"$username"; nic se nevypise... anonym: No taky tam nevidim chybu, jako hruby kod by to melo fungovat... pokud i vy tam nevidite chybu... tak asi jen potrebuju spanek :) 2 dny u pc dela divy Dekuji za rady |
||
anonym_ Profil * |
#7 · Zasláno: 18. 3. 2021, 09:26:18
Pavlínka:
Já tam chybu nehledal, ale v logice evidentně je, pokud chceš zároveň vypsat obě proměnné do formuláře. Kdybych tomu chtěl věnovat 5 minut, tak ji najdu, ale trochu se snaž. Mmáš tam asi 5 podmínek, tak si promysli, kdy se které aplikuje. |
||
Pavlínka Profil |
#8 · Zasláno: 18. 3. 2021, 09:31:12
anonym:
Nechci vypisovat obe... |
||
mckay Profil |
anonym [#7]:
„Kdybych tomu chtěl věnovat 5 minut, tak ji najdu, ale trochu se snaž.“ Celkem okřídlenej výrok s ohledem na to, jak moc nápomocný zatím jsi. Ta otázka je stroze formulována a nechává dost prostoru pro vlastní výklad/špatnou interpretaci - a domnívám se, že jsi špatně interpretoval čeho chce autorka docílit - já si to vykládám tak, že nechce vypisovat obě dvě naráz, ale pouze jednu z nich, a pídí se po tom, proč se $username nevypisuje. Tvoje odpovědi jsou pasivně agresivní (nebo při nejmenším neomalený) a nepřidávají žádnou hodnotu - pokud teda nesázíš na to, že si čtenář vyloží formulace „Z toho kódu je naprosto zřejmé“ a „Kdybych tomu chtěl věnovat 5 minut, tak ji najdu, ale trochu se snaž“ jako motivaci se dále vzdělávat. Pavlínka: A testuješ to s uživatelským jménem, co ještě nemáš v databázi uložené? Máš ten výpis $username/$msg něčím podmíněnej (pokud ano, zkontroluj, že podmínka se opravdu může vyhodnotit jako pravdivá). Celkově dobrej způsob, jak odhalit zdroj těhle chyb je jít a zdebugovat kód. Buď přímo prostřednictvím vývojového prostředí, ve kterém pracuješ, a nebo takovou rychlou a ošklivou cestou -> naházet do každé podmínky a její větve echo "Dostala jsem se do podminky X"; a sledovat co všechno dostaneš na výstupu.
|
||
anonym_ Profil * |
#10 · Zasláno: 18. 3. 2021, 10:34:58
mckay:
Já teda v otázce četl: "když některé z zadaných polí zapíše správně (v tomto případě nickname) ale jiné nikoli (například password), měli by se vepsat zpět do inputu následující kod pro ověření nickname" Z toho mi vyplynulo, že se má do inputu vložit nickname (abych ho nemusel znovu vyplňovat), ale současně se někde má vypsat msg , protože je ten formulář vyplněný špatně.
Nebo z dotazu nechápu, co se má v případě správného (nebo nějakého) usernamu a chybného hesla objevit na výstupu. |
||
lionel messi Profil |
#11 · Zasláno: 18. 3. 2021, 23:14:12
Pavlínka:
Skús prosím zameniť poradie riadkov 9 a 10: $param_username = trim($_POST["username"]); mysqli_stmt_bind_param($stmt, "s", $param_username); //najprv premennú definujeme, až potom ju využijeme |
||
lionel messi Profil |
lionel messi:
„Skús prosím zameniť poradie riadkov 9 a 10:“ Sám som vyskúšal, lenže tam problém nie je. Funguje v pôvodnom poradí a funguje aj v prehodenom. |
||
lionel messi Profil |
#13 · Zasláno: 19. 3. 2021, 21:46:55
Pavlínka:
Dodaj, prosím, do diskusie čo najkompletnejší kód. Som ochotný sa tomu venovať, myslím si, že nie som sám, lebo inak sa zjavne nepohneme ďalej. |
||
Pavlínka Profil |
#14 · Zasláno: 20. 3. 2021, 08:24:26 · Upravil/a: Moderátor (editace znemožněna) 24. 3. 2021, 11:19:57
tak jsem prostě blbá :D
zapoměla jsem na include configu (připojení k databázi) z nějakého záhadného důvodu mi to nevypsalo chybu do logu a... omlouvám se za zmatek :) příště nebudu psát v polomrtvém stavu a podívám se na problém po delším spánku :D lionel messi: „najprv premennú definujeme, až potom ju využijeme“ e-é :) podívej se na funkci mysqli_stmt_bind_param což mě přivádí k myšlence... (možná je to na založení nového téma... ať případně admini zamknou) všimla jsem si, že u php8 už mysqli_stmt_bind_param není... jak se podobný zápis řeší tam??? |
||
Keeehi Profil |
Jak jsi přišla na to, že v php 8 už mysqli_stmt_bind_param není? Jediné co mě tak napadá je, že v dokumentaci není php 8 uvedeno. Ale to není ani u mysqli_connect. Takže si myslím, že to bude spíš neaktualizovaná dokumentace. Nikde jinde se mi nepovedlo dohledat informaci, že by mysqli_stmt_bind_param v 8 být neměla. Taky mám k dispozici 8 PHP, reálnou funkčnost jsem nezkoušel, ale funkci mysqli_stmt_bind_param to zná. To znamená, že když jsem ji dal kódu, tak to nespadlo to kvůli neexistující funkci, ale kvůli špatně vyplněným parametrům. Takže ta funkce tu bude.
|
||
Pavlínka Profil |
#16 · Zasláno: 20. 3. 2021, 19:22:55
Keeehi:
přesně tak... není tam uvedené :) |
||
Časová prodleva: 3 roky
|
0