Autor Zpráva
Waka Flocka
Profil *
Chcem overiť či sa už zadané meno nenachádza v databáze, mám tento kód.

 <form method="POST">
        <h1>Registrácia</h1>
        
        Meno: <input type="text" name="menoR">
        Heslo: <input type="password" name="hesloR">
        <input type="submit">
    </form>

<?php
$meno = mysql_real_escape_string($_POST["menoR"]);
$heslo = sha1(mysql_real_escape_string($_POST["hesloR"]));

if(isset($_POST['menoR']) && isset($_POST['hesloR'])){
$meno2 = mysql_fetch_array(mysql_query("SELECT * FROM uzivatelia WHERE username = '$meno' "));
    if($meno != $meno2){
mysql_query("INSERT INTO uzivatelia (username, password) VALUES ('$meno', '$heslo')");
    }else {echo "Meno už je použité, zadaj prosím iné.";}}


?>

Už sa nad tým trápim hodinu a netuším ako to overiť a prečo tento kód nefunguje.
Taps
Profil
Musis uvest sloupec z databaze napr. $meno2['jmeno_z_db']
han5vk
Profil
$meno je stringová premenná, ale meno2 je výsledok mysql_fetch_array, čiže pole, a teda sa nikdy nerovnajú. Takisto nepotrebuješ vyťahovať všetko (SELECT *), chceš len zistiť počet záznamov s rovnakým menom (teda, či je ich viac než 0). Takže skôr takto:
$pocetMien=mysql_num_rows(mysql_query("SELECT username FROM uzivatelia WHERE username = '".$meno."' "));
if ($pocetMien!==0) { ...
Opravil som kód podľa [#5] Dan Charousek
Waka Flocka
Profil *
han5vk:
Nefunguje, stále to napíše údaje do tabuľky aj keď je meno rovnaké.
Dan Charousek
Profil
Waka Flocka:
han5vk:
Nefunguje, stále to napíše údaje do tabuľky aj keď je meno rovnaké.

$pocetMien=mysql_num_rows(mysql_query("SELECT username FROM uzivatelia WHERE username = ' ".$meno." ' "));

Smaž mezery před a za uvozovkami (výše označené). S nimi to vrátí vždy 0 řádků.

Ještě k tvému kódu:

1) Rodina funkcí mysql_* je zastaralá a bude se z PHP odstraňovat, měl bys zvážit přechod na nějakou z alternativ: MySQLi, PDO, DIBI
2) Na řádku 11 je escapeování vstupu zbytečné vzhledem k tomu, že daný řetězac následně hashuješ.
Tomáš123
Profil
Waka Flocka:
Ešte doplním, že dvojicu riadkov s ecsapovaním presuň až do bloku podmienky. Takto to hádže chyby ak nie sú definované údaje.
Waka Flocka
Profil *
Dan Charousek:
Funguje, vďaka.

Nepoznáš nejaký online zdroj, kde by som sa mohol naučiť MySQLi? (Najlepšie v Cz/Sk, ale nemusí byť)
lionel messi
Profil
Waka Flocka:
Nepoznáš nejaký online zdroj, kde by som sa mohol naučiť MySQLi? (Najlepšie v Cz/Sk, ale nemusí byť)

Veľmi dobrý článok o prechode (tzv. databázovom klimaktériu) napísal kolega Fisir: www.fisir.tk/itblog/mysql_
Waka Flocka
Profil *
Prerobil som to podľa vašich rád a funguje to, môže to byť teda takto?

<form method="POST">
        <h1>Registrácia</h1>
            Meno:<input type="text" name="menoR">
            <br>
            Heslo:<input type="password" name="hesloR">
            <br>
            <br>
            <input type="submit">
        </form>

<?php
include "config.php";


if(isset($_POST['menoR']) && isset($_POST['hesloR'])){
$meno = $con->real_escape_string($_POST['menoR']);
$heslo = sha1($_POST['hesloR']);
    
$result = $con->query("SELECT username FROM uzivatelia WHERE username = '".$meno."'");
$pocetMien = $result ->num_rows;
    if($pocetMien == 0){
    $con->query("INSERT INTO uzivatelia (username ,password) VALUES ('$meno', '$heslo')");
    }else {echo "Zadané meno už bolo použité.";}    
}
?>
juriad
Profil
Waka Flocka:
Ano, ale jsou tam chyby, které většina lidí úplně ignoruje. Jsou spíše zajímavé z pohledu teorie.

1) pokud posíláš formulář POSTem, měl bys po jeho úspěšném i neúspěšném zpracování přesměrovat pomocí funkce header. To znamená nic nevypisovat do stránky. Hlášku vypsat až po přesměrování na další stránce. Důvodem je, že uživatel může refreshnout stránu, což povede k dotazu, zda chce odeslat formulář ještě jednou. To samé se stane při tlačítku zpět. Tady to příliš nevadí, protože bráníš opakované registraci, ale v jiných situacích, jako je třeba vkládání zboží do košíku, bys ho mohl refreshem přidat několikrát.

2) Kontrola, zda je jméno použité musí býť provedena buď v transakci se správnou izolací, nebo atomicky - provést jen insert a odchytávat chybu narušení podmínky unkátního klíče. Teoreticky by se mohli dva uživatelé registrovat najednou se stejným jménem, pak by se oboum vyhodnotil SELECT jako, že nevrátil žádný záznam, a následně by se oboum provedl INSERT. Toto je ale extrémně nepravděpodobné - nemáš přece desítky registrací za minutu. Toto je třeba nutné řešit u obchodů v době slev (Black Friday), nemůžeš si dovolit prodat něco, co už nemáš.

3) Podle nastavené collation v databázi se může stát, že jméno Waka bude stejné jako waKa či WAKA, a tedy odmítne zaregistrovat uživatele, kteří se liší velikostí písmen. Otázkou je, zda je to dobře nebo špatně.

4) Použivat sha1 na hashování hesla je nešťastné. Navíc nepoužíváš vůbec žádnou sůl. Měl bys použít funkci password_hash, která je určená přimo pro použití s hesly a funkci password_verify pro ověřování hesel.

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