Autor Zpráva
Martin Buchta
Profil
Zdravím, mám problém s přihlášením v PHP na mých stránkách. Kód ze stránek:
<?php
  session_start();
  include "../funkce.php";
  head();
  echo "<title>Přihlášení uživatele</title>";
  menu();
  levy();
  pravy();
  reklama();
?>
    <h1>Přihlášení uživatele</h1>
    <hr /><br />
<?php    
function formular() {
    ?>
    <form action="user/loginn.php" method="post">
      <input type="hidden" name="frm" value="frm" />
      <table>
        <tr>
          <td class="hidden" width="140">přihlašovací jméno:<br />
            <input type="text" name="usr_name" class="text_pole" size="15" />
          </td>
        </tr>
        <tr>
          <td class="hidden">heslo:<br />
            <input type="password" name="usr_passw" class="text_pole" size="15" />
          </td>
        </tr>
        <tr>
          <td><input type="submit" value="přihlásit" /></td>
        </tr>
      </table>
    </form>
    <form action="user/registrace.php" method="post">
      <input type="submit" value="registrovat" />
    </form>
    <?php
  }
  //test odeslání formuláře
  $frm=$HTTP_POST_VARS[frm];
  if(!$frm) {
    formular();
    konec();
    exit();
    }
  //ověření uživatelského jména a hesla
  $dbhost="*****"; // Databázovžý server
  $dbusr="****";  //     -||-    login
  $dbpassw="*****";     //     -||-    heslo
  $dbname="*****"; //Jméno databáze
 //připojení k databázovému serveru
  if(@$link=mysql_pconnect($dbhost,$dbusr,$dbpassw)) 
    echo "<p class='nadpis'>Spojení se serverem bylo úspěšně navázáno.</p>"; 
  else die("<p class='nadpis'>Server nepřipojen !!!</p>");
  $usr_name=$HTTP_POST_VARS[usr_name];
  $usr_passw=$HTTP_POST_VARS[usr_passw];
  //$usr_passw=md5($usr_passw);
  $dotaz = "SELECT * FROM users WHERE login='$usr_name' AND passw='$usr_passw'";
  $result=mysql_query($dotaz,$link);
  $pocet = mysql_num_rows($result);
  if($pocet==1) {
    echo "<p class='nadpis'>Přihlášení proběhlo korektně</p>";
    $login_ok="1";
    session_register("login_ok");
    $_SESSION['login_ok'] = $login_ok;
    }
  else {
    formular();
    echo "<p class='nadpis'>Přihlášení nebylo úspěšné</p>";
    }
    
  konec();
?>


Na webu mi to píše, že mám na řádku s zjištěním počtu záznamů bychbu: Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in /data/web/virtuals/4202/virtual/www/user/loginn.php on line 60.

1)Co mám udělat, ať se mohu přihlásit?
2) V jaké proměnné je uloženo uživatelské jméno a heslo když se uživatel přihlásil?
3) Jaký kód mám dát na stránky, který mají uživatele odhlásit?

4) Díky.

Moderátor Davex: Vkládej prosím kódy mezi značky [pre] a [/pre] (stačí kliknout na ).
Moderátor Davex: Titulek „Přihlášení PHP - problém“ nevystihuje podstatu dotazu. Příště zkus prosím vymyslet lepší.
Davex
Profil
Můžeš začít tím, že budeš místo deset let zastaralého pole $HTTP_POST_VARS používat pole $_POST a místo nedefinovaných konstant frm, usr_name, usr_passw budeš používat řetězce 'frm', 'usr_name', 'usr_passw'.

Pokud to nepomůže, tak může být chyba v SQL dotazu - viz PHP FAQ.
Martin Buchta
Profil
Zkusil jsem to upravit, když tam dám apostrofy, tak se mi to nechce připojit k serveru. Prosím, upravete mi ten kód, ať funguje. Děkuji.
Davex
Profil
/* původně
  $frm=$HTTP_POST_VARS[frm];
  if(!$frm) {
*/
  if (empty($_POST['frm'])) {

...

$_POST['usr_name']     // původně $HTTP_POST_VARS[usr_name]
$_POST['usr_passw']     // původně $HTTP_POST_VARS[usr_passw]
Martin Buchta
Profil
<?php
  session_start();
  include "../funkce.php";
  head();
  echo "<title>Přihlášení uživatele</title>";
  menu();
  levy();
  pravy();
  reklama();
?>
    <h1>Přihlášení uživatele</h1>
    <hr /><br />
<?php    
function formular() {
    ?>
    <form action="user/loginn.php" method="post">
      <input type="hidden" name="frm" value="frm" />
      <table>
        <tr>
          <td class="hidden" width="140">přihlašovací jméno:<br />
            <input type="text" name="usr_name" class="input" size="15" />
          </td>
        </tr>
        <tr>
          <td class="hidden">heslo:<br />
            <input type="password" name="usr_passw" class="input" size="15" />
          </td>
        </tr>
        <tr>
          <td><input type="submit" value="přihlásit" /></td>
        </tr>
      </table>
    </form>
    <form action="user/registrace.php" method="post">
      <input type="submit" value="registrovat" />
    </form>
    <?php
  }
  //test odeslání formuláře
 if (empty($_POST['frm'])) {
    formular();
    konec();
    exit();
    }
  //ověření uživatelského jména a hesla
  $dbhost="***"; // Databázovžý server
  $dbusr="****";  //     -||-    login
  $dbpassw="****";     //     -||-    heslo
  $dbname="***"; //Jméno databáze
 //připojení k databázovému serveru
  if(@$link=mysql_pconnect($dbhost,$dbusr,$dbpassw)) 
    echo "<p class='nadpis'>Spojení se serverem bylo úspěšně navázáno.</p>"; 
  else die("<p class='nadpis'>Server nepřipojen !!!</p>");
  $usr_name=$_POST['usr_name'];     // původně $HTTP_POST_VARS[usr_name]
  $usr_passw=$_POST['usr_passw'];     // původně $HTTP_POST_VARS[usr_passw]
  //$usr_passw=md5($usr_passw);
  $dotaz = "SELECT * FROM users WHERE login='$usr_name' AND passw='$usr_passw'";
  $result=mysql_query($dotaz,$link);
  $pocet = mysql_num_rows($result);
  if($pocet==1) {
    echo "<p class='nadpis'>Přihlášení proběhlo korektně</p>";
    $login_ok="1";
    session_register("login_ok");
    $_SESSION['login_ok'] = $login_ok;
    }
  else {
    formular();
    echo "<p class='nadpis'>Přihlášení nebylo úspěšné</p>";
    }
    
  konec();
?>

Moderátor Joker: O tlačítko vedle, pro vložení kódu je .

Opravdu nevím, co s tím je, prosím, poraďte. Script je na webu www.metinshop.cz/user/loginn.php
Joker
Profil
Davex:
Pokud to nepomůže, tak může být chyba v SQL dotazu - viz PHP FAQ.
Přidal jsem k danému bodu i tuhle chybovou hlášku.
Martin Buchta
Profil
nevím, zkoušel jsem to různě upravovat a nešlo. Prosím, zkuste ten kód upravit, ať jde. Zkoušel jsem opravdu vše, co mě napadlo.
Joker
Profil
Martin Buchta:
A co vypíše to mysql_error?
Jak vypadá už sestavený SQL dotaz, který se posílá do databáze?

Dále koukám, že jediná informace která se pak čte je počet vrácených řádků. To jde rovnou poslat dotaz SELECT COUNT, přečíst si jen ten počet a ušetřit si kupu přenášených dat.
(Na druhou stranu pokud je v plánu číst ještě další údaje z databáze, je to správně takhle).

Mimochodem, co escapovat věci posílané do SQL dotazu? Když zadám jméno „' or 1=1 limit 1 --“, budu přihlášen.

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