| 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: 15 let
|
|||
0