Wyświetlanie błędów logowania w określonym miejscu

0

Witam. Mam mały problem co do ładnego wyświetlania błędów typu niepoprawne hasło itd. Mianowicie nie mam pojęcia jak wygodnie i skutecznie wyświetlić poprzednią stronę z wpisanymi wcześniej danymi i gdzieś pod formularzem komunikat o błędzie. To samo tyczyło by się rejestracji. Uproszczona wersja mojego kodu logowania wygląda tak:

<?
session_start();

if ($_GET['out'] == '1') {
  session_unset();
  session_destroy();
  header('Location: index.php');
}

if ($_POST['wyslane']) {

  include 'db.php';
  $tabela = 'users';

  $login = trim($_POST['login']);
  $haslo = trim($_POST['haslo']);

  if (strlen($login) < 3 or strlen($login) > 30 or !eregi("^[a-zA-Z0-9_.]+$", $login)) {
    mysql_close($polaczenie);
    echo('Wpisz poprawny login');
    exit;
  }

  if ($haslo == '') {
    mysql_close($polaczenie);
    echo('Wpisz poprawne hasło');
    exit;
  }

  $haslo = md5($haslo);

  $wynik=mysql_query("SELECT * FROM $tabela WHERE login='$login' and haslo='$haslo'");

  if (mysql_num_rows($wynik) == 1) {
    $informacja = mysql_fetch_array($wynik);
    $_SESSION["login"] = $informacja["login"];
    mysql_close($polaczenie);
    header('Location: index.php ');
  } else {
    mysql_close($polaczenie);
    echo('Niepoprawny login lub hasło');
    exit;
  }
  
  mysql_close($polaczenie);
}

if (!isset($_SESSION['login'])) {
  echo('
    <form action="login.php" method="post">
    <input type="hidden" name="wyslane" value="TRUE" />
    
    <p>Login: <input type="text" name="login" /></p>
    <p>Hasło: <input type="password" name="haslo" /></p>
    <p><input type="submit" value="zaloguj" /></p>
    </form>
  ');
} else {
  echo('<a href="login.php?out=1">Wyloguj (' . $_SESSION['login'] . ')</a>');
}
?>

taki kod jest za pomocą Include(); wstawiony gdzieś po lewej stronie i jak widać gdy tylko coś jest nie tak to pokaże się biały ekran z treścią błędu. Próbowałem zamiast treści błędu zrobić coś takiego:

err.php

  $e = $_GET['e'];
  
  if ($e) {
    echo('<p class="err"><br>');
  }
  
  if ($e == '1') { echo('Proszę podać poprawny login'); }
  if ($e == '2') { echo('Proszę podać poprawne hasło'); }
  if ($e == '3') { echo('Błędny login lub hasło'); }
  
  
  if ($e) {
    echo('<br><br></p><br>');
  }

index.php

<table width=100% cellspacing=0 cellpadding=0 border=0>
<tr>
<td><? include('login.php') ?></td>
<td><? include('err.php') ?> Następnie właściwa treść strony.</td>
</tr>
</table>

login.php

...
  if ($haslo == '') {
    mysql_close($polaczenie);
    header('location: index.php?e=2');
    exit;
  }
...

Skutkowało to wczytaniem strony głównej z błędem na samej górze. Rozwiązanie to jednak jest mało wygodne i praktyczne na dłuższą metę. Najbardziej zależy mi na tym aby błędy te mogły wyświetlić się na określonej podstronie i w określonym miejscu. Fajnie też było by gdyby wprowadzone dane po wyświetleniu błędu pozostały w formularzu. Proszę was bardzo o pomoc w rozwiązaniu tego problemu. Z góry dziękuję za wszelką pomoc.

P.S. Jeśli chodzi o AJAX to jestem całkowicie zielony.

0

tak na szybko i "brudno"

if (!isset($_SESSION['login'])) {
  echo('
    <form action="login.php" method="post">
    <input type="hidden" name="wyslane" value="TRUE" />
 
    <p>Login: <input type="text" name="login" value="' . @$_POST['login'] .'" /></p>
    <p>Hasło: <input type="password" name="haslo"  value="' . @$_POST['haslo'] .'" /></p>
    <p><input type="submit" value="zaloguj" /></p>
    </form>
  ');
} else {
  echo('<a href="login.php?out=1">Wyloguj (' . $_SESSION['login'] . ')</a>');
} 
1

A undefined index czasami nie wyrzuca?
W php nie wyświetla się poprzedniej strony, tylko generuje nową, identyczną do poprzedniej / zmodyfikowaną.
Nie możesz w sesji ustawić sobie zmiennej 'login_message'? Jeśli jest ustawiona, to ją wyświetl (i usuń z sesji?) - użytkownik próbował się zalogować, jeśli jest pusta to jest to pierwsza próba logowania.
Poza tym

  • Kod dziurawy jak sito.
  • Od php 5.3 funkcja eregi została porzucona.
  • mysql / msqli sux (to już chyba powinno być wywalane przed twarz każdemu zakładającemu tu temat).
  • Do czego służą tabele w html?
    Złe nawyki trzeba tępić od początku...
    Szczerze proponuję zainteresowanie się jakimś frameworkiem php.
0

Dzięki za szybką reakcję. Pomysł no_solution_found wydawał się prosty i ciekawy ale niestety nie działa.

wskaźnik napisał(a)

Nie możesz w sesji ustawić sobie zmiennej 'login_message'? Jeśli jest ustawiona, to ją wyświetl (i usuń z sesji?)

Dobry pomysł. Działa jak trzeba.

wskaźnik napisał(a)

Login przefiltrowany od razu a hasło w md5 więc gdzie jeszcze SQL injection może tu zaszkodzić?

wskaźnik napisał(a)
  • Od php 5.3 funkcja eregi została porzucona.

A co powinienem zastosować aby nie było przestarzałe?

wskaźnik napisał(a)
  • mysql / msqli sux (to już chyba powinno być wywalane przed twarz każdemu zakładającemu tu temat).

Obadam i zobaczę z czym to się je.

wskaźnik napisał(a)
  • Do czego służą tabele w html?

To jest pytanie retoryczne?

1

zamiast eregi - preg_match

1 użytkowników online, w tym zalogowanych: 0, gości: 1