Logowanie do strony - może się komuś przyda.

2

Witam

Przy pomocy tego i kilku innych forum stworzyłem sobie logowanie do strony www z zapisem w bazie SQL kiedy konto zostało założone i kiedy było ostatnie logowanie przez danego użytkownika.
Może się komuś przyda.

Po pierwsze strona główna (index)

<!DOCTYPE html>
<html><head>


<meta charset="utf-8"><title>Logowanie do tablicy</title></head><body>    
    

<center>
Proszę o przetestowanie i Państwa opinie. <br><br>
<h1>Formularz logowanie</h1>

<font color="RED" size="5"><br>
<font size="3">
</font></font><form action="login.php" method="post">
<font color="RED" size="5"><font size="3">  <input name="email" placeholder="Email" type="email"><br>
  <input name="password" placeholder="Password" type="password"><br>
  <button type="submit" name="register">Zaloguj</button>
<br>
<a href="http://adres.pl/formularz.html">załóż konto</a><br><br>
<a href="http://adres.pl/kontakt.php">kontakt</a>

<br>
<br>

</HEAD>
<BODY>

</font></font></form></center>
</body></html>

Po drugie formularz do zakładania konta

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>dodaj nowego użytkownika</title>
</head>
<body>
<center>
<h1>Formularz rejestracyjny</h1>
<form action="registration.php" method="post">
  <input type="email" name="email" placeholder="Email"><br>
  <input type="password" name="password1" placeholder="Password"><br>
  <input type="password" name="password2" placeholder="Password"><br>
  <button type="submit" name="register">Zarejestruj</button>
</form>
<br><br>
<a href="index.html">powrót do logowania</a>
</center>
</body>
</html>

Po trzecie kod rejestracji nowego użytkownika

<?php
try
{

require_once("config.php");

  $email =addslashes(trim($_POST['email']));
  $password1 = trim($_POST['password1']);
  $password2 = trim($_POST['password2']);
  $hashPassword = password_hash($password1,PASSWORD_BCRYPT);
 

if ($password1 != $password2){
die ("Wpisane hasła nie są takie same");
}
else{

if( empty( $email ) || empty($password1) || empty($password2)){
header("Location: http://adres.pl/formularz.html");

die ('Wróć i wypełnij wszystkie pola');

}

$stmt = $db->query("SELECT email FROM user where email ='$email'");

$istnienie_uzytkownika = $stmt->rowCount();

if ($istnienie_uzytkownika>0)
  	{  

	echo 'Ten email jest już w bazie';
      		foreach($stmt as $row)
      		{
	        echo '<li>'.$row['email'].'</li>';
      		}
      $stmt->closeCursor();

	}

else 
{
$data_zal=date('Y-m-d H:i:s');
$sth = $db->prepare('INSERT INTO user (email,password, data_zal)VALUE (:email,:password, :data_zal)');
$sth->bindValue(':email', $email, PDO::PARAM_STR);
$sth->bindValue(':password', $hashPassword, PDO::PARAM_STR);
$sth->bindValue(':data_zal', $data_zal, PDO::PARAM_STR);
$sth->execute();
echo "Rejestracja pomyslna! " .$data_zal. " <br>";
echo "<a href='index.html'>powrót do logowania</a>";
}
 
}
}
catch(PDOException $e)
   {
      echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
   }

?>


Po czwarte samo logowanie

<?php
require_once("config.php");
//if(isset($_POST['login'])){
  $email = addslashes(trim($_POST['email']));
  $password = trim($_POST['password']);

  $sth = $db->prepare('SELECT * FROM user WHERE email=:email limit 1');
  $sth->bindValue(':email', $email, PDO::PARAM_STR);
  $sth->execute();
  $user = $sth->fetch(PDO::FETCH_ASSOC);
  if($user){
    if(password_verify($password,$user['password'])){
	$data_log=date('Y=m-d H:i:s');
	//$emaill = trim($_POST['email']);
//
//UPDATE tabela SET pole = 'nowa_wartosc' WHERE pole = 'szukana_wartosc'
$sth = $db->prepare('UPDATE user SET data_log = :data_log WHERE email = :email');
$sth->bindValue(':data_log', $data_log, PDO::PARAM_STR);
$sth->bindValue(':email', $email, PDO::PARAM_STR);
$sth->execute();
//
      echo "<h3>Uzytkownik zalogowany pomyslnie</h3>";
	header("Location: http://strona_do_ktorej_sie_logujesz");
    }else{
      echo "<h3>Nieprawidlowe haslo</h3>";
      echo "<a href='index.html'>powrót do logowania</a>";
    }
  }else{
    echo "<h3>Nie znaleziono uzytkownika</h3>";
    echo "<a href='index.html'>powrót do logowania</a>";
  }
//}
?>

W pliku config podałem takie dane:

<?php
try{
  $db = new PDO('mysql:host=localhost;dbname=nazwa', 'nazwa', 'haslo');

}
catch (PDOException $e){
  die ("Error connecting to database!");
}

do tego utworzyłem jeszcze bazę SQL z polami:
id, email (jako login), password, data_zal, data_log

Pozdrawiam

3
  • if ($password1 != $password2){ - powinieneś wykorzystać operator !==, poczytaj sobie o różnicach między jednym a drugim.
  • empty() nie jest tym samym co strlen() - do sprawdzania ciągów znaków powinieneś wykorzystywać to drugie (ponownie: polecam rzucić okiem do dokumentacji, która opisuje różnice).
  • $db->query("SELECT email FROM user where email ='$email'"); - dlaczego nie przez bindValue()?
  • date('Y=m-d H:i:s'); - tutaj chyba miało być Y-m-d.
  • echo "Rejestracja pomyslna! " .$data_zal. " <br>"; - nie wiesz czy rejestracja się udała, ponieważ tego nie sprawdzasz.

Może się komuś przyda.

Uważam, że to miłe, że chciałeś się podzielić wynikami swojej pracy - musisz jednak pamiętać, że jesteś początkującym, stąd Twój kod może zarówno pomóc, jak i zaszkodzić (poprzez np. naukę złych nawyków czy też pokazywanie kodu zawierającego "oczywiste" błędy).

Zauważ dodatkowo, że wrzuciłeś sam, suchy kod: początkującym on się nie przyda, ponieważ i tak nic nie zrozumieją (dlaczego password_verify()?, dlaczego tu jest zakomentowany fragment?, dlaczego zmienna nazywa się $sth?), a z kolei cała reszta potrafi już doskonale budować formularze w czystym PHPie.

Tym niemniej, jak na początkującego, Twój kod jest napisany całkiem nieźle - miejscami wykorzystane bindowanie zmiennych do zapytań, hashowanie haseł, logi - warte pochwalenia, warte sprawdzenia, lecz raczej nieprzydatne innym ;-)

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