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
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
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 *
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 *
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
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 *
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
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
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
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
Keeehi:
přesně tak... není tam uvedené :)

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