Autor | Zpráva | ||
---|---|---|---|
Folly Profil |
#1 · Zasláno: 20. 2. 2011, 01:38:48
Zdravím všechny, chtěl bych Vás poprosit o radu - mám problém s kterým nemůžu pohnout. Mým cílem je klasická registrace a přihlášení uživatelů. Vytvořil jsem si dvě tabulky v jedné databázi, databáze se jmenuje calendar a tabulky: site_user (do ní se ukládá: user_id [číslo uživatele], username [login uživatele] a password [heslo uživatele]), druhá tabulka se jmenuje site_user_info (ta obsahuje: user_id [číslo uživatele, které je stejné s user_id z první tabulky a tyto dvě tabulky jsou pomocí tohoto sloupce navzájem propojeny - relace], kromě user_id tabulka obsahuje ještě nějaké další sloupce s doplňkovými informacemi o uživateli jako je email, tel. číslo atd...) Teď již k samotnému problému: nefunguje mi přihlášení jednotlivých uživatelů - username a password zádávám určitě správně, ale můj skript login.php nechce fungovat a píše mi, že bylo zadáno neplatné uživatelské jméno a heslo. Nejdříve si načtu stránku main.php, která mi vypíše: "Momentálně nejste přihlášeni do systému. Po přihlášeni budete mít přístup k osobnímu nastavení a k online rezervaci jízd." Což je jasné - mám tam podmínku, která pokud nejsem přihlášený vypíše toto hlášení s odkazem na přihlašovací stránku login.php. Kliknu na odkaz, který mi bez problému otevře tuto přihlašovací stránku. Zde ale nastává můj problém, zádám správně username (jméno uživatele) i password (heslo uživatele), ale login.php my vypíše, že bylo zadáno špatné username a password. Chtěl bych Vás moc poprosit o radu, jestli někdo přijdete na to čím to je, byl bych Vám velice vděčný, už tu nad tím celkem dlouhou dobu sedím :(.
Obsah souboru main.php: <?php session_start(); ?> <html> <head> <title>Autoškola Matula Brno - Online rezervace jízd</title> </head> <body> <h1>Systém online rezervace jízd</h1> <?php if (isset($_SESSION['logged']) && $_SESSION['logged'] == 1) { ?> Prihlášený uživatel: <b> <?php echo $_SESSION['username']; ?></b> <br>Nyní mužete upravit svuj uživatelský úcet a informace o sobe<a href="user_personal.php">kliknutím sem</a> <?php } else { ?> <p>Momentálnì nejste pøihlášeni do systému. Po pøihlášeni budete mít pøístup k osobnímu nastavení a k online rezervaci jízd.</p> <p>Pokud jste již registrováni, pøihlaste se <a href="login.php">zde</a>. </p> <?php } ?> </body> </html> Obsah souboru login.php: <?php session_start(); include 'db.inc.php'; $db = mysql_connect(hostitel, uzivatel, heslo) or die ('Nemohu se pripojit. Zkontrolujte prosim pripojení k serveru.'); // Nastavim databazi jako pracovni mysql_select_db(nazev_databaze, $db) or die(mysql_error($db)); // Odfiltrovani prijatych hodnot $username = (isset($_POST['username'])) ? trim($_POST['username']) : ''; $password = (isset($_POST['password'])) ? $_POST['password'] : ''; $redirect = (isset($_REQUEST['redirect'])) ? $_REQUEST['redirect'] : 'main.php'; if (isset($_POST['submit'])) { $nazev_tabulky = "site_user"; // Spojitost se souborem db_site_user_create.php $dotaz = 'SELECT username FROM '.$nazev_tabulky.' WHERE ' . 'username = "' . mysql_real_escape_string($username, $db) . '" AND ' . 'password = PASSWORD("' . mysql_real_escape_string($password, $db) . '")'; $vysledky = mysql_query($dotaz, $db) or die(mysql_error($db)); if (mysql_num_rows($vysledky) > 0) { $row = mysql_fetch_assoc($vysledky); $_SESSION['username'] = $username; $_SESSION['logged'] = 1; header ('Refresh: 5; URL=' . $redirect); echo '<p>Nyní budete pøesmìrováni na pùvodní stránku požadavku.</p>'; echo '<p>Nebudete-li do 5 sekund pøesmìrováni automaticky, ' . '<a href="' . $redirect . '">klepnìte sem</a>.</p>'; die(); } else { // Tyto hodnoty je treba explicitne nastavit $_SESSION['username'] = ''; $_SESSION['logged'] = 0; $error = '<p><strong>Bylo zadáno neplatné uživatelské jméno ' . 'a heslo!</strong> <a href="register.php">Zaregistrujte se ' . 'zde</a>, pokud jste tak již neuèinili.</p>'; } mysql_free_result($vysledky); } ?> <html> <head> <title>Pøihlášení</title> </head> <body> <?php if (isset($error)) { echo $error; } ?> <form action="login.php" method="post"> <table> <tr> <td>Uživatelské jméno:</td> <td><input type="text" name="username" maxlength="20" size="20" value="<?php echo $username; ?>"/></td> </tr><tr> <td>Heslo:</td> <td><input type="password" name="password" maxlength="20" size="20" value="<?php echo $password; ?>"/></td> </tr><tr> <td> </td> <td> <input type="hidden" name="redirect" value="<?php echo $redirect ?>"/> <input type="submit" name="submit" value="Pøihlásit"/> </tr> </table> </form> </body> </html> <?php mysql_close($db); ?> |
||
Tori Profil |
#2 · Zasláno: 20. 2. 2011, 02:02:09
Když si necháte vypsat ten sql dotaz a spustíte ho v PhpMyAdminu (nebo čemkoli podobném), vrací to co má? Jinak všechno vypadá v pořádku..
Mimo dotaz: Není zcela bezpečné používat funkci password(), použila bych spíš sha1 ještě v PHP. A proč při chybě ve formuláři vypisujete zadané heslo? |
||
Folly Profil |
#3 · Zasláno: 20. 2. 2011, 11:01:51
Tori:
Nejprve poslední dotaz - vypisování zadaného hesla ve formuláři už jsem odstranil a nechávám vypsat už jen username. Další věcí je použití funkce password nebo sha1, to se dá snadno předělat a rád si pročtu materiál a password za sha1 popřípadě vyměním. To už jsou kosmetické úpravy mě spíše trápí nefunkčnost toho přihlašování. Zkoušel jsem zadat v PHPMyAdminu ten dotaz, ale vypíše mi, že mám špatnou syntaxi v dotazu, nejspíše to bude tím, že nevím co přesně do SQL dotazu vložit. |
||
Tori Profil |
#4 · Zasláno: 20. 2. 2011, 11:54:03
Folly:
„nevím co přesně do SQL dotazu vložit“ To samé, co jde do databáze, čili dotaz z řádku 20 a násl. (echo $dotaz;). (Je to asi hloupé se na to ptát, ale ta hesla ve sloupci password jsou hašovaná taky sql funkcí password(), že? Omlouvám se, nenapadá mě nic jiného, proč by to nemělo fungovat.) |
||
Folly Profil |
#5 · Zasláno: 20. 2. 2011, 12:13:21
Tori:
Máte pravdu, při ukládáni hesel do databáze je také použita funkce PASSWORD(), takže v tom by problém být neměl. Nicméně teď jsem se opět pokoušel zjistit, proč to nefunguje. Vkládal jsem si do kódu příkazy echo a nějaký text abych viděl kam až se dostanu, viz kód, který opět uvádím níže. A při pokusu o přihlášení se mi vypíše: Resource id #5 - vypise mi prikaz: echo $vysledky; vyhodnotil jsem podminku jestli je username a pass dobre - vypise mi prikaz: echo "<br>vyhodnotil jsem podminku jestli je username a pass dobre"; dotaz do databaze probehl - vypise mi prikaz if($vysledky) { echo "<br>dotaz do databaze probehl<br>"; } 0 - vypise mi prikaz: echo mysql_num_rows($vysledky); Tudíž to vypadá, že problém je v tom, že se v databázi nenajde uživatelem (mnou) zadané heslo, přitom, mám databázi vypsanou a údaje z ní zadávám určitě dobře (myslím tím username a password), vypadá, že chyba musí být někde v dotazu, ale netuším teda vůbec kde, myslím, že je napsán správně. Obsah souboru login.php <?php session_start(); include 'db.inc.php'; $db = mysql_connect(hostitel, uzivatel, heslo) or die ('Nemohu se pripojit. Zkontrolujte prosim pripojení k serveru.'); // Nastavim databazi jako pracovni mysql_select_db(nazev_databaze, $db) or die(mysql_error($db)); // Odfiltrovani prijatych hodnot $username = (isset($_POST['username'])) ? trim($_POST['username']) : ''; $password = (isset($_POST['password'])) ? $_POST['password'] : ''; $redirect = (isset($_REQUEST['redirect'])) ? $_REQUEST['redirect'] : 'main.php'; if (isset($_POST['submit'])) { $nazev_tabulky = "site_user"; // Spojitost se souborem db_site_user_create.php $dotaz = 'SELECT username FROM '.$nazev_tabulky.' WHERE username = "' . mysql_real_escape_string($username, $db) . '" AND password = PASSWORD("' . mysql_real_escape_string($password, $db) . '")'; $vysledky = mysql_query($dotaz, $db) or die(mysql_error($db)); echo $vysledky; echo "<br>vyhodnotil jsem podminku jestli je username a pass dobre"; if($vysledky) { echo "<br>dotaz do databaze probehl<br>"; } echo mysql_num_rows($vysledky); if (mysql_num_rows($vysledky) > 0) { echo "<br>deje se neco"; $_SESSION['username'] = $username; $_SESSION['logged'] = 1; header ('Refresh: 5; URL=' . $redirect); echo '<p>Nyní budete poesmirováni na puvodní stránku požadavku.</p>'; echo '<p>Nebudete-li do 5 sekund poesmirováni automaticky, ' . '<a href="' . $redirect . '">klepnite sem</a>.</p>'; die(); } else { // Tyto hodnoty je treba explicitne nastavit $_SESSION['username'] = ''; $_SESSION['logged'] = 0; $error = '<p><strong>Bylo zadáno neplatné uživatelské jméno ' . 'nebo heslo!</strong> <a href="register.php">Zaregistrujte se ' . 'zde</a>, pokud jste tak již neueinili.</p>'; } mysql_free_result($vysledky); } ?> <html> <head> <title>Poihlášení</title> </head> <body> <?php if (isset($error)) { echo $error; } ?> <form action="login.php" method="post"> <table> <tr> <td>Uživatelské jméno:</td> <td><input type="text" name="username" maxlength="20" size="20" value="<?php echo $username; ?>"/></td> </tr><tr> <td>Heslo:</td> <td><input type="password" name="password" maxlength="20" size="20"/></td> </tr><tr> <td> </td> <td> <input type="hidden" name="redirect" value="<?php echo $redirect ?>"/> <input type="submit" name="submit" value="Poihlásit"/> </tr> </table> </form> </body> </html> <?php mysql_close($db); ?> |
||
panther Profil |
#6 · Zasláno: 20. 2. 2011, 12:23:38
Folly:
co vypíše echo $dotaz ? Je hash hesla v něm stejný jako v DB?
|
||
Folly Profil |
#7 · Zasláno: 20. 2. 2011, 12:32:48
panther:
echo $dotaz vypíše SELECT username FROM site_user WHERE username = "ondra" AND password = PASSWORD("ondra") A hesla v obou případech, jak při zadávání do databáze, tak při čtení z ní kóduju pomocí funkce password(). |
||
Folly Profil |
#8 · Zasláno: 20. 2. 2011, 13:27:44
Tak přihlašování už je funkční, pomalu celej den jsem nad tím seděl a nakonec sem dělal všechny možné zoufalé pokusy a vyřešil jsem to tím, že jsem smazal kódování hesla pomocí SQL funkce PASSWORD() při zadávání hesla do databáze (při registaci uživatele) a následně i při kontrole, zda je username s heslem v databázi. A pomohlo to, tak nevím, jestli jsem měl špatnou syntaxi nebo fakt nevím, každopádně už to frčí a opět moc děkuju Vám všem, co jste se mi tu snažili pomoci. Díky.
|
||
Časová prodleva: 13 let
|
0