Autor Zpráva
Folly
Profil
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
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
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
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
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
Folly:
co vypíše echo $dotaz? Je hash hesla v něm stejný jako v DB?
Folly
Profil
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
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.

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: