Autor Zpráva
papalas
Profil *
Zdravím zkouším udělat na svém webu registraci ale narazil jsem na menší problém.
Skoro všechny funkce funguji až na jednu a to je ta která kontroluje jestli se už v databázi nenachází uživatel který používá vložené $name.
U všech ostatních kontrol to zachití jestli nejsou vyplněna všechna pole nebo jestli se už pužívá zadaný $login ale když zadám $name které je již
užívané tak to kontrola ignoruje a rovnou se všechny udaje zapíší do databáze a vypíše se hláška (poděkování za registraci)
používám tento skript:

<?php
if(isset($_POST['go'])){   

    if(isset($_POST['name']))
    {
        $name = stripslashes(htmlspecialchars(trim($_POST['name'])));
        if($name == '')
        {
                unset($name);
        }
    }


    
    if(isset($_POST['login']))
    {
        $login = stripslashes(htmlspecialchars(trim($_POST['login'])));
        if($login == '')
        {
                unset($login);
        }
    }

    
    if(isset($_POST['heslo']))
    {
        $heslo = stripslashes(htmlspecialchars(trim($_POST['heslo'])));
        if($heslo == '')
        {
                unset($heslo);
        }
    }
  
    if(empty($name) or empty($login) or empty($heslo))
    {

header("Location: /registration.php?error=1");
header("Connection: close");
   
   }else{

    require_once '/tools/db.php';

 
    $q1 = mysql_query("SELECT * FROM `users` WHERE `login`='".$login."'");
    $q2 = mysql_query("SELECT * FROM `users` WHERE `name`='".$name."'");
    if(!$q1 or !$q2) { echo mysql_error() . ' - ' . mysql_errno(); }
    else {

        if(mysql_num_rows($q1)==1){
            header("Location: /registration.php?error=2");
            header("Connection: close");
        } elseif(mysql_num_rows($q2)==1){
            header("Location: /registration.php?error=3");
            header("Connection: close");
        } else {
    
            $q3 = mysql_query("INSERT INTO `users`(`name`,`login`,`pass`) VALUES('".$name."','".$login."','".$heslo."')");
            if(!$q3) { echo mysql_error() . ' - ' . mysql_errno(); }
            else {
                echo 'Děkuji za registraci, teď se můžete <a href="index.php">přihlásit</a>.';
                  
                
            }
        }
    }
 }
} else { header("Location: ".$_SERVER['SERVER_ROOT']."registration.php"); }
?>
Fisir
Profil
Reaguji na papalase:
Zaprvé, k escapování se používá funkce mysql_real_escape_string(). Pokud si jako heslo zadám 3<2>7, budu se nakonec muset přihlašovat s heslem 3&lq;2&rq;7. Zadruhé, heslo bys neměl ukládat v plaintextu, ale zahashované. A do třetice všeho, mysql_* funkce jsou zastaralé a budou odstraněny.

Jsi si jistý, že v databázi nemáš více záznamů se stejným jménem? Protože jestli ano, podmínkou == 1 to projde. Potom taky můžeš zkusit nahradit header("Connection: close") za exit(), ale nevím, jestli to bude mít nějaký efekt.
smiesek
Profil
papalas:
já bych kontrolu ověření shodu záznamu v DB dělala za pomocí výběru id záznamu z tabulky, než vybíráním všeho z něčeho, tedy místo:

$q1 = mysql_query("SELECT * FROM `users` WHERE `login`='".$login."'");
    $q2 = mysql_query("SELECT * FROM `users` WHERE `name`='".$name."'")

bych použila formulaci typu:

$q = "SELECT id FROM users WHERE login = '".$login."' AND name = '".$name."'";
Joker
Profil
papalas:
Co je v $name? Čekal bych jméno, ale pak nechápu, proč má být unikátní.

Údaje z formuláře se prohánění řadou funkcí, přičemž ani jedna nedává v daném kontextu smysl. Viz [#2] Fisir.
A i přes ošetření třemi funkcemi když zadám jméno „a”, login „b” a heslo „c'), ('a','b', 'c”, založí to dvakrát uživatele se údaji a, b, c. A pak už mi to dovolí založit libovolné množství dalších uživatelů se stejným jménem, protože podmínka porovnává počet řádků proti jedničce a pro dva, tři, … to projde.

Další co nechápu je, proč se tam unset-ují prázdné proměnné, když se pak kontrolují funkcí empty, která prázdný řetězec a nedefinovanou proměnnou bere stejně. Mimochodem vzhledem k funkci empty není možné mít jako jméno, login ani heslo nulu (0).

A samozřejmě do databáze se nemá ukládat přímo heslo zadané uživatelem.

Potom taky můžeš zkusit nahradit header("Connection: close") za exit(), ale nevím, jestli to bude mít nějaký efekt.
To by tam být mělo a ještě předtím by měl být HTML kód s odkazem pro ty, které to náhodou nepřesměruje.

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