Autor Zpráva
TheAzer
Profil
Zdravím .. Včera se mi podařila vytvořit do MySQL tabulka "registrace". Tabulka v pohodě funguje a uživatel se do tabulky zapíše. Ale teď potřebuju formulář, kterej se nějak zpracuje a zkontroluje tu tabulku "registrace" a uživatele přihlásí a pak přidávání komentářů jen registrovaným uživatelům . Prostě jednoduše ten "login" se nějak zpracuje s tou "registrací" , ale prostě nevím jak by se ty dvě tabulky mohly domluvit, moc stím skušenosti nemám ,ale hodilo by se mi to ..
Alphard
Profil
Zkuste se podívat na Nejčastější potíže s PHP (FAQ) » Registrace uživatelů
TheAzer
Profil
Jo, stím by se dalo něco dělat .. :-)


No takže mám už kód, ale ještě to nějak přeci musím spojit s tou databází ne ?
<?php
$path = "/";  // máte-li stránky v rootu, nechte bezezměny, pokud je provozujete v nějakém podadresáři, zadejte jeho jméno
              // např. stránky mám na moje-domena.cz/adresar/, tak zadám $path = "/adresar/";
 
// funkce pro ošetření vstupních dat od uživatele
// viz http://cz.php.net/manual/en/info.configuration.php#ini.magic-quotes-gpc
function db_escape($str) 
{ 
    return mysql_real_escape_string(@get_magic_quotes_gpc() ? stripslashes($str) : $str);
} 
 
 
include "pripojeni_db.php"; // soubor pripojeni_db.php zajistí připojení k databázi a výběr databáze, se kterou pracujeme
session_start();  // tohle je nezbytné a je nutné uvést tuto funkci na všech stránkách, kam se přihlášený uživatel dostane
                  // možnost nastavit automatické spouštění session_start() nechávám stranou
 
// zjistíme, co chce uživatel dělat
if (isset($_SESSION['username']) && isset($_GET['logout']))
{
    // uživatel je přihlášen a chce se odhlásit, takže smažeme údaje o přihlášení
    $_SESSION = array();
    if (isset($_COOKIE[session_name()]))
    {
        setcookie(session_name(), '', time()-42000, '/');
    }
    session_unset();
    session_destroy();
    // a přesměrujeme na index.php
    header("location:.$path."index.php]http://".$_SERVER['SERVER_NAME'].$path."index.php", TRUE, 303);
    exit;
}
elseif (isset($_SESSION['username']))
{
    //session_regenerate_id(); // ochrana před session fixation, lze vynechat
    // uživatel je přihlášen a nechce se odhlásit, zde zobrazíme obsah pro registrované
    // můžeme využit include apod.
 
    // tohle informuje uživatele, že je přihlášen a vypíše odkaz pro odhlášení
    // můžeme to ale přemístit do includovaného souboru (kam se nám hodí)
    echo "<p>Přihlášen: $_SESSION[username] <a href=\".$path."index.php?logout=1\">odhlásit</a></p>\n]http://".$_SERVER['SERVER_NAME'].$path."index.php?logout=1\">odhlásit</a></p>\n";
}
else
{
    // uzivatel není přihlášen
    // pokud odeslal přihlašovací údaje, snaží se přihlásit
    if (isset($_POST['username']) && isset($_POST['password']))
    {
        // ošetříme vstupní údaje od uživatele
        // funkce trim() má význam hlavně u hesla, ořeže bílé znaky (např. mezery) na začátku a konci řetězce
        $username = db_escape(trim($_POST['username']));
        $password = db_escape(trim($_POST['password']));
 
        // zjistíme, jestli je v databázi daný uživatel a jestli se prokazuje platným heslem
        // více o ukládání hesel, např. o tzv. solení, najdete na http://php.vrana.cz/ukladani-hesel.php
        $result = mysql_query("SELECT COUNT(*) FROM users WHERE username = '$username' AND password = sha1('$password')");
 
        if (mysql_result($result, 0))  // předpokládáme, že dotaz proběhl úspěšně, pokud ne, bude stejně vráceno false
                                       // true (a splnění podmínky) nastane pouze tehdy, když v databázi existuje správná kombinace uživatelského jména a hesla
        {
            // uložíme potřebné SESSION proměnné
            $_SESSION['username'] = $username;
            $_SESSION['cas_prihlaseni'] = time(); // čas, kdy se uživatel přihlásil, pozor, nejedná se o čas poslední akce, nevím, jestli ho využijete, může být smazán
 
            // po přihlášení uživatele přesměrujeme na index.php
            header ("location:.$path."index.php]http://".$_SERVER['SERVER_NAME'].$path."index.php", TRUE, 303);
            exit;  // aby bylo pravidlům učiněno zadost, zde stejně končí podmínka a jiná nemůže být splněna
        }
        else
        {
            // uživatel zadal neplatné přihlašovací údaje
            // přesměrujeme ho na index.php a zobrazíme chybovou hlášku
            header ("location:.$path."index.php?incorrect_login=1]http://".$_SERVER['SERVER_NAME'].$path."index.php?incorrect_login=1", TRUE, 303);
            exit;
        }
    }
    else
    {
      // uživatel není přihlášen a ani neodeslal přihlašovací formulář, tak mu ho zobrazíme
      echo "<div>";
      if (isset($_GET['incorrect_login']))
      {
          echo "<p style=\"color: #F00\">Zadali jste neplatné uživatelské jméno nebo heslo</p>\n";
      }
      // zobrazíme formulář pro přihlášení
      ?>
      <form action="index.php" method="post">
        Jméno:  <input name="username" type="text"><br>
        Heslo: <input name="password" type="password"><br>
        <input name="submit" type="submit" value="Přihlásit">
      </form>
      </div>
      <?php
    }
}
?>



Zpět, zpet, zpět, už jsem pochopil princip ,ale pořád mi to píše, že jsem zadal špatné jméno, nebo heslo, co mám dělat ?
Kajman
Profil
TheAzer:
ještě to nějak přeci musím spojit s tou databází ne ?

Viz. řádek 13
TheAzer
Profil
Já už to propojený mám ,ale píše mi to, že je špatný jméno, nebo heslo, ale já to v datábázi normálně mám .


Pořád mi to píše : "Zadali jste neplatné uživatelské jméno nebo heslo"
Kajman
Profil
TheAzer:
ale já to v datábázi normálně mám

Máte tam heslo normálně čitelné, nebo prohnané použitou hashovací funkcí sha1?
TheAzer
Profil
V kolonce "password" je napsáno e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4
Alphard
Profil
Nejlépe vypsat si dotaz na 55. řádku a porovnat skutečné vstupy s databází.
TheAzer
Profil
Nerozumím !
Alphard
Profil
$result = mysql_query($q="SELECT COUNT(*) FROM users WHERE username = '$username' AND password = sha1('$password')");
echo htmlspecialchars($q, ENT_QUOTES);
echo sha1($password);
Porovnat s db.
TheAzer
Profil
A jak to mám jako porovnat ?
pcmanik
Profil
TheAzer:
Otvor si databázu cez phpMyAdmin a spusti tam ten dotaz.
TheAzer
Profil
Není to jedno ? To neexistuje nějakej hotovej příklad ?
Vždyť přece potřebuju jen jedinou věc abych napsal někoho mezi uživatele a on se pak v loginu přihlásil a mohl vkládat komentáře . To je vše !
pcmanik
Profil
TheAzer:
Odpoveď si dostal už v [#2] príspevku, neviem aký iný príklad si ty predstavuješ.
Porovnal si tie dáta s databázou? Je to práca na kratšie ako čo ti trvalo napísať svoj posledný príspevok.
A keď si bol o niečo požiadaný, tak to asi neni jedno.
TheAzer
Profil
Dobře, vyzkouším to znovu .


Tam to jsem hodil do SQL dotazu : "
 MySQL hlásí: Dokumentace
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '$result = mysql_query($q="SELECT COUNT(*) FROM users WHERE username = '$username' at line 2 
"


Chyba

SQL-dotaz: Dokumentace

$result = mysql_query(
$q = "SELECT COUNT(*) FROM users WHERE username = '$username' AND password = sha1('$password')"
);

MySQL hlásí: Dokumentace
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '$result = mysql_query($q="SELECT COUNT(*) FROM users WHERE username = '$username' at line 1 
Alphard
Profil
Kód vypadá přesně jako v [#3]? V textu SQL chyby by vůbec nemělo být nějaké $result = .... Hledal jsem, jestli někde není chybně ukončený řetězec, ale nic nevidím.
pcmanik
Profil
TheAzer:
Čo si vlastne spustil na tom servery? Lebo takto to vyzera že ty si v databáže spustil ten jeden riadok ($result = ...), namiesto samotného sql dotazu.
TheAzer
Profil
Tak co mám teda dělat ? Nešlo by manuálně vytvořit uživatele



INSERT INTO users (id, username, password)
VALUES (
NULL, 'nick', ('heslo')
);

A pak ho skusit přihlásit ?


Spustil jsem tohle :
$result = mysql_query("SELECT COUNT(*) FROM users WHERE username = '$username' AND password = sha1('$password')");


Už mi to napsalo tohle "#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '$result = mysql_query("SELECT COUNT(*) FROM users WHERE username = '$username' A' at line 1"
TheAzer
Profil
!!!!!!!!!! VYŘEŠENO FUNGUJE !!!!!!!!!!!!!!!!!!!!

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