Sunteți pe pagina 1din 18

Cum se creează un blog in PHP si baza de date MySQL

PARTEA II
Înainte de a începe partea a doua, asigura-te ca ai terminat prima parte.
Continuăm cu proiectarea bazei de date și autentificarea utilizatorului (înregistrare și autentificare).
Creați o bază de date numită blog-php. În această bază de date, creați 2 tabele: postări și utilizatori folosind
următoarele linii de cod:

CREATE TABLE `utilizatori` (


`id` int AUTO_INCREMENT PRIMARY KEY NOT NULL,
`username` varchar(255) NOT NULL,
`email` varchar(255) NOT NULL,
`rol` enum('Autor','Admin') DEFAULT NULL,
`password` varchar(255) NOT NULL,
`creat_la` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`actualizat_la` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `postari` (


`id` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
`id_utilizator` int DEFAULT NULL,
`titlu` varchar(255) NOT NULL,
`slug` varchar(255) NOT NULL UNIQUE,
`vizualizari` int(11) NOT NULL DEFAULT '0',
`imagine` varchar(255) NOT NULL,
`continut` text NOT NULL,
`publicat` tinyint(1) NOT NULL,
`creat_la` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`actualizat_la` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (`id_utilizator`) REFERENCES `utilizatori` (`id`) ON DELETE NO ACTION ON UPDATE NO
ACTION
) ENGINE=InnoDB DEFAULT CHARSET=latin1

Puteți rula aceste scripturi utilizând PHPMyAdmin. Pe PHPMyAdmin, faceți clic / selectați baza de date în
care doriți să creați aceste tabele (în acest blog-php), apoi faceți clic pe tab-ul SQL din bara de navigație
undeva în partea de sus a paginii. Dacă vedeți vreun script SQL în spațiul de mai jos, eliminați-l și lipiți scriptul
de mai sus în spațiul furnizat și faceți clic pe „Execută” pentru a crea tabelele.
Acum introduceți câțiva utilizatori în tabelul de utilizatori și câteva postări în tabelul de postări. Puteți face
acest lucru executând aceste interogări SQL:

INSERT INTO `utilizatori` (`id`, `username`, `email`, `rol`, `password`, `creat_la`,


`actualizat_la`) VALUES
(1, 'Bogdan', 'bogdan@mymail.com', 'Admin', 'parolamea', '2021-04-16 12:52:58', '2021-04-16
12:52:58')
(Alegeți un utilizator si parola personalizata)

INSERT INTO `postari` (`id`, `id_utilizator`, `titlu`, `slug`, `vizualizari`, `imagine`,


`continut`, `publicat`, `creat_la`, `actualizat_la`) VALUES
(1, 1, '5 Obiceiuri ce iti pot imbunatati viata', '5-obiceiuri-imbunatati-viata', 0,
'banner.jpg', 'Citeste in fiecare zi', 1, '2021-04-12 07:58:02', '2018-04-12 19:14:31'),
(2, 1, 'A doua postare pe blog', 'a-doua-postare', 0, 'banner.jpg', 'Aceasta este continutul
celei de-a doua postari de pe site.', 0, '2021-04-13 11:40:14', '2021-04-13 13:04:36')

Hai să ne conectăm la baza de date, să interogăm baza de date și să afișăm articolele pe pagina web.

În config.php, vom adăuga linii de cod pentru a conecta aplicația la baza de date. După adăugarea codului,
fișierul config.php va arăta astfel:
<?php
session_start();

// conectare la baza de date


$conn = mysqli_connect("localhost", "root", "parola", "blog_php");
if (!$conn) {
die("Eroare conectare la baza de date: " . mysqli_connect_error());
}

// definire constante globale


define ('ROOT_PATH', realpath(dirname(__FILE__)));
define('BASE_URL', 'http://localhost/blog/');
?>

La instalare, utilizatorul root nu are parola, deci cel mai probabil va trebui să folosiți următoarea linie de cod:
$conn = mysqli_connect("localhost", "root", "", "blog_php");

Aceasta returnează un obiect de conectivitate la baza de date $ conn, pe care îl putem folosi în întreaga
aplicație pentru interogarea bazei de date.
Această aplicație a fost structurată astfel încât codul PHP să fie cât mai separat de HTML. Operațiuni
precum interogarea bazei de date și efectuarea unor logici asupra datelor se fac în funcțiile PHP și
rezultatele trimise către HTML să fie afișate. Prin urmare, pentru a obține toate postările din baza de date,
vom face asta într-o funcție și vom returna rezultatele ca o lista asociativă pentru a fi afișată pe pagină.
Prin urmare, vom crea un fișier numit functions.php în folderul includes. Acest fișier va conține toate
funcțiile PHP pentru zona publică. Toate paginile care utilizează oricare dintre funcțiile din acest fișier
trebuie să aibă acest fișier inclus în secțiunea de sus a paginii.
Hai să creăm prima funcție în functions.php. Vom denumi funcția getPublishedPosts () și va prelua toate
postările din tabelul de postări din baza de date și le va returna ca o matrice asociativă:
<?php
/* * * * * * * * * * * * * * *
* Returneaza toate postarile publicate
* * * * * * * * * * * * * * */
function getPostariPublicate() {
// foloseste obiectul global $conn in functie
global $conn;
$sql = "SELECT * FROM postari WHERE publicat=true";
$result = mysqli_query($conn, $sql);

// preia toate postarile intr-o lista (array) asociativa numita $postari


$postari = mysqli_fetch_all($result, MYSQLI_ASSOC);
return $postari;
}

// vom scrie mai multe functii aici...

?>

În secțiunea de sus a fișierului index.php, chiar sub linia care include config.php, adăugați acest cod pentru
a interoga baza de date:
// config.php ar trebui sa fie aici, ca primul inclus

<?php require_once( ROOT_PATH . '/includes/functions.php') ?>

<!-- Preia toate postarile din baza de date -->


<?php $postari = getPostariPublicate(); ?>

Am adăugat două linii de cod. Primul include fișierul functions.php (care deține funcțiile) în fișierul index.php.
A doua linie de cod apelează funcția getPostariPublicate () care interoghează baza de date și returnează
postările recuperate din baza de date într-o variabilă numită $ postari. Acum trebuie să parcurgem și să
afișăm aceste postări pe pagina index.php.
Deschideți din nou fișierul index.php. În secțiunea de conținut, undeva la mijloc, veți găsi o etichetă <hr> și
un comentariu care indică unde va veni mai mult conținut. În spațiu, chiar sub eticheta <hr>, adăugați acest
cod:
<?php foreach ($postari as $postare): ?>
<div class="post" style="margin-left: 0px;">
<img src="<?php echo BASE_URL . 'static/images/' . $postare['imagine']; ?>"
class="post_image" alt="">
<a href="single_post.php?slug-postare=<?php echo $postare['slug']; ?>">
<div class="post_info">
<h3><?php echo $postare['titlu'] ?></h3>
<div class="info">
<span><?php echo date("F j, Y ",
strtotime($postare["creat_la"])); ?></span>
<span class="read_more">Citeste mai mult...</span>
</div>
</div>
</a>
</div>
<?php endforeach ?>
În regulă, nu reîncărcați încă pagina. Vom adăuga stilizarea la această listare a postărilor. Deschideți main.css
și adăugați acest cod la finalul fișierului:
/* Continut */
.content {
margin: 5px auto;
border-radius: 5px;
min-height: 400px;
}
.content:after {
content: "";
display: block;
clear: both;
}
.content .content-title {
margin: 10px 0px;
color: #374447;
font-family: 'Averia Serif Libre', cursive;
}
.content .post {
width: 335px;
margin: 9px;
min-height: 320px;
float: left;
border-radius: 2px;
border: 1px solid #b3b3b3;
position: relative;
}
.content .post .category {
margin-top: 0px;
padding: 3px 8px;
color: #374447;
background: white;
display: inline-block;
border-radius: 2px;
border: 1px solid #374447;
box-shadow: 3px 2px 2px;
position: absolute;
left: 5px; top: 5px;
z-index: 3;
}
.content .post .category:hover {
box-shadow: 3px 2px 2px;
color: white;
background: #374447;
transition: .4s;
opacity: 1;
}
.content .post .post_image {
height: 260px;
width: 100%;
background-size: 100%;
}
.content .post .post_image {
width: 100%;
height: 260px;
}
.content .post .post_info {
height: 100%;
padding: 0px 5px;
font-weight: 200;
font-family: 'Noto Serif', serif;
}
.content .post .post_info {
color: #222;
}
.content .post .post_info span {
color: #A6A6A6;
font-style: italic;
}
.content .post .post_info span.read_more {
position: absolute;
right: 5px; bottom: 5px;
}

Acum puteți reîncărca pagina.


Dacă totul a funcționat bine, veți vedea o singură postare sub formă de miniatură sub titlul „Articole
recente”.

Amintiți-vă că am inserat două înregistrări în baza de date, dar numai una este afișată. Acest lucru se
întâmplă deoarece una dintre înregistrări a avut câmpul publicat setat la fals (adică 0) și, din moment ce
numai articolele publicate pot fi afișate, vedem doar unul, cel publicat.
Postările de acum nu sunt clasificate sub niciun subiect. Să creăm un tabel de subiecte și să formăm o relație
many to many între postări și tabelul subiectelor. Pentru a face acest lucru, vom crea două tabele noi:
subiecte, pentru a stoca subiecte, și tabela postari_subiecte, pentru a gestiona relația dintre postări și
subiecte.
CREATE TABLE `subiecte` ( CREATE TABLE `postari_subiecte` (
`id` int NOT NULL AUTO_INCREMENT PRIMARY KEY, `id_postare` int NOT NULL UNIQUE,
`nume` varchar(255) NOT NULL, `id_subiect` int NOT NULL
`slug` varchar(255) NOT NULL UNIQUE )
)
Ceea ce ne interesează cu adevărat este tabela postari_subiecte. Aceasta este tabela care tratează relația
dintre postări și subiecte. Atunci când o postare este creată sub un anumit subiect, ID-ul postării respective
(id_postare), precum și id-ul subiectului (id_subiect) sub care este creată această postare, sunt inserate în
tabela postari_subiecte.
Să stabilim această relație astfel încât, atunci când o postare este ștearsă, intrarea lor în tabela
postari_subiecte va fi ștearsă automat; nu vrem să păstrăm informații despre relația unei postări când
postarea nu există, nu?
Faceți clic / selectați tabela postari_subiecte, apoi faceți clic pe tabul Structură a barei de navigare
PHPMyAdmin. Apoi, faceți clic pe Vizualizare relație chiar sub tabul Structură (poate fi găsită în altă parte, în
funcție de versiunea vostra de PHPMyAdmin). Apoi completați formularul de mai jos după cum urmează:

Nota: Legătura + Adaugă constrângere este utilizată pentru a adăuga o nouă constrângere.

ON DELETE și ON UPDATE sunt setate la CASCADE și respectiv NO ACTION, astfel încât atunci când o postare
sau un subiect este ștearsă, informațiile despre relația din tabela postari_subeicte sunt șterse automat.
Faceți clic pe Salvează și gata. Tabelele sunt acum legate. Dar pentru a stabili o relație între postări și
subiecte, trebuie să populăm tabelul subiectelor cu subiecte și, în cele din urmă, tabelul postari_subiecte,
care este informația reală despre relație.
Acum să inserăm câteva intrări în cele două tabele:
INSERT INTO `subiecte` (`id`, `nume`, `slug`) VALUES
(1, 'Inspiratie', 'inspiratie'),
(2, 'Motivatie', 'motivatie'),
(3, 'Jurnal', 'jurnal')

INSERT INTO `postari_subiecte` (`id_postare`, `id_subiect`) VALUES


(1, 1),
(2, 2)
Relația definită în tabela postari_subiecte spune că subiectul cu id 1 din tabela subiectelor aparține postării
cu id 1 din tabela postărilor. Același lucru este valabil și pentru subiectul cu id 2 și postarea cu id 2.
Pe fiecare listă de postări de pe pagina index.php, vom afișa subiectul sub care este creată postarea.
Pentru a face acest lucru, trebuie să modificăm getPostariPublicate () pe care l-am creat în functions.php
pentru a interoga subiectul fiecărei postări din baza de date și a returna postarea alături de subiectul
acesteia.
Modificați fișierul functions.php pentru a arăta astfel:
<?php
/* * * * * * * * * * * * * * *
* Returneaza toate postarile publicate
* * * * * * * * * * * * * * */
function getPostariPublicate() {
// foloseste obiectul global $conn in functie
global $conn;
$sql = "SELECT * FROM postari WHERE publicat=true";
$result = mysqli_query($conn, $sql);

// preia toate postarile intr-o lista (array) asociativa numita $postari


$postari = mysqli_fetch_all($result, MYSQLI_ASSOC);

$postari_finale = array();
foreach ($postari as $postare) {
$postare['subiect'] = getPostareSubiect($postare['id']);
array_push($postari_finale, $postare);
}
return $postari_finale;
}

/**********************
*
* Functie ce primeste un ID postare si
* Returneaza subiectul postarii
*/
function getPostareSubiect($id_postare){
global $conn;
$sql = "SELECT * FROM subiecte WHERE id=
(SELECT id_subiect FROM postari_subiecte WHERE id_postare=$id_postare) LIMIT 1";
$result = mysqli_query($conn, $sql);
$subiect = mysqli_fetch_assoc($result);
return $subiect;
}
?>

Acum accesați fișierul index.php. În bucla foreach, direct sub eticheta de imagine <img />, adăugați declarația
if pentru a afișa subiectul. Bucla foreach ar trebui să arate astfel după modificarea:
<?php foreach ($postari as $postare): ?>
<div class="post" style="margin-left: 0px;">
<img src="<?php echo BASE_URL . 'static/images/' . $postare['imagine']; ?>"
class="post_image" alt="">

<!-- Am adaugat acest IF... -->


<?php if (isset($postare['subiect']['nume'])): ?>
<a
href="<?php echo BASE_URL . 'filtered_posts.php?subiect=' .
$postare['subiect']['id'] ?>"
class="btn category">
<?php echo $postare['subiect']['nume'] ?>
</a>
<?php endif ?>

<a href="single_post.php?slug_postare=<?php echo $postare['slug']; ?>">


<div class="post_info">
<h3><?php echo $postare['titlu'] ?></h3>
<div class="info">
<span><?php echo date("F j, Y ",
strtotime($postare["creat_la"])); ?></span>
<span class="read_more">Citeste mai mult...</span>
</div>
</div>
</a>
</div>
<?php endforeach ?>

Acum reîncărcați pagina și veți vedea subiectul afișat în postare.


În interiorul acestei bucle foreach, observați că există două linkuri care, atunci când faceți clic, vă vor duce
la două pagini: filtered_posts.php și single_post.php.
filtered_posts.php este o pagină care listează toate postările sub un anumit subiect atunci când utilizatorul
dă clic pe subiectul respectiv.
single_post.php este o pagină care afișează postarea completă în detaliu împreună cu comentarii atunci
când utilizatorul dă clic pe miniatura postării.
Aceste două fișiere au nevoie de câteva funcții din fișierul functions.php. filtered_posts.php are nevoie de
două funcții numite getPostariPublicateDupaSubiect () și getNumeSubiectDupaID () în timp ce
single_posts.php are nevoie de getPostare () și getToateSubiectele ().
Să începem cu fișierul filtered_posts.php. Deschideți functions.php și adăugați aceste două funcții la lista de
funcții:
/* * * * * * * * * * * * * * * *
* Returneaza toate postarile dintr-un anumit subiect
* * * * * * * * * * * * * * * * */
function getPostariPublicateDupaSubiect($id_subiect) {
global $conn;
$sql = "SELECT * FROM postari ps
WHERE ps.id IN
(SELECT pt.id_postare FROM postari_subiecte pt
WHERE pt.id_subiect=$id_subiect GROUP BY pt.id_postare
HAVING COUNT(1) = 1)";
$result = mysqli_query($conn, $sql);
// preia toate postarile ca o lista asociativa numita $postari
$postari = mysqli_fetch_all($result, MYSQLI_ASSOC);

$postari_finale= array();
foreach ($postari as $postare) {
$postare['subiect'] = getPostareSubiect($postare['id']);
array_push($postari_finale, $postare);
}
return $postari_finale;
}
/* * * * * * * * * * * * * * * *
* Returnează numele subiectului după ID-ul subiectului
* * * * * * * * * * * * * * * * */
function getNumeSubiectDupaID($id)
{
global $conn;
$sql = "SELECT nume FROM subiecte WHERE id=$id";
$result = mysqli_query($conn, $sql);
$subiect = mysqli_fetch_assoc($result);
return $subiect['nume'];
}
Să creăm mai întâi fișierul filtered_posts.php în folderul rădăcină al aplicației (adică blog-php /
filtered_posts.php). Copiați întregul cod de mai jos in fișier:
<?php include('config.php'); ?>
<?php include('includes/functions.php'); ?>
<?php include('includes/header.php'); ?>
<?php
// Ia postarile dintr-un anumit subiect
if (isset($_GET['subiect'])) {
$id_subiect = $_GET['subiect'];
$postari = getPostariPublicateDupaSubiect($id_subiect);
}
?>
<title>Blog | Acasa </title>
</head>
<body>
<div class="container">
<!-- Navbar -->
<?php include( ROOT_PATH . '/includes/navbar.php'); ?>
<!-- // Navbar -->
<!-- content -->
<div class="content">
<h2 class="content-title">
Articole din <u><?php echo getNumeSubiectDupaID($id_subiect); ?></u>
</h2>
<hr>
<?php foreach ($postari as $postare): ?>
<div class="post" style="margin-left: 0px;">
<img src="<?php echo BASE_URL . '/static/images/' . $postare['imagine']; ?>"
class="post_image" alt="">
<a href="single_post.php?slug_postare=<?php echo $postare['slug']; ?>">
<div class="post_info">
<h3><?php echo $postare['titlu'] ?></h3>
<div class="info">
<span><?php echo date("F j, Y ", strtotime($postare["creat_la"]));
?></span>
<span class="read_more">Citeste mai mult...</span>
</div>
</div>
</a>
</div>
<?php endforeach ?>
</div>
<!-- // content -->
</div>
<!-- // container -->

<!-- Footer -->


<?php include( ROOT_PATH . '/includes/footer.php'); ?>
<!-- // Footer -->

Acum reîmprospătați pagina, faceți clic pe subiect și dacă vă duce la o pagină care afișează postări sub acel
subiect, atunci ați făcut cum trebuie.
Să facem același lucru cu single_post.php. Deschideți functions.php și adăugați aceste 2 funcții:
/* * * * * * * * * * * * * * *
* Returneaza o singura postare
* * * * * * * * * * * * * * */
function getPostare($slug){
global $conn;
// Returneaza slug-ul postarii
$slug_postare = $_GET['slug_postare'];
$sql = "SELECT * FROM postari WHERE slug='$slug_postare' AND publicat=true";
$result = mysqli_query($conn, $sql);

// preia rezultatele interogarii ca o lista (array) asociativa


$postare = mysqli_fetch_assoc($result);
if ($postare) {
// preia subiectul de care apartine aceasta postare
$postare['subiect'] = getPostareSubiect($postare['id']);
}
return $postare;
}
/* * * * * * * * * * * *
* Returneaza toate subiectele
* * * * * * * * * * * * */
function getToateSubiectele()
{
global $conn;
$sql = "SELECT * FROM subiecte";
$result = mysqli_query($conn, $sql);
$subiecte = mysqli_fetch_all($result, MYSQLI_ASSOC);
return $subiecte;
}

Acum creați fișierul blog-php / single_post.php și lipiți acest cod în el:


<?php include('config.php'); ?>
<?php include('includes/functions.php'); ?>
<?php
if (isset($_GET['slug_postare'])) {
$postare = getPostare($_GET['slug_postare']);
}
$subiecte = getToateSubiectele();
?>
<?php include('includes/header.php'); ?>
<title> <?php echo $postare['titlu'] ?> | Blog</title>
</head>
<body>
<div class="container">
<!-- Navbar -->
<?php include( ROOT_PATH . '/includes/navbar.php'); ?>
<!-- // Navbar -->

<div class="content" >


<!-- Page wrapper -->
<div class="post-wrapper">
<!-- div pentru intreaga postare-->
<div class="full-post-div">
<?php if ($postare['publicat'] == false): ?>
<h2 class="post-title">Ne pare rau... Aceasta postare nu a fost publicata
inca</h2>
<?php else: ?>
<h2 class="post-title"><?php echo $postare['titlu']; ?></h2>
<div class="post-body-div">
<?php echo html_entity_decode($postare['continut']); ?>
</div>
<?php endif ?>
</div>
<!-- // div pentru intreaga postare -->

<!-- sectiunea de comentarii -->


<!-- va urma aici ... -->
</div>
<!-- // Page wrapper -->

<!-- post sidebar -->


<div class="post-sidebar">
<div class="card">
<div class="card-header">
<h2>Subiecte</h2>
</div>
<div class="card-content">
<?php foreach ($subiecte as $subiect): ?>
<a
href="<?php echo BASE_URL . 'filtered_posts.php?subiect=' .
$subiect['id'] ?>">
<?php echo $subiect['nume']; ?>
</a>
<?php endforeach ?>
</div>
</div>
</div>
<!-- // post sidebar -->
</div>
</div>
<!-- // content -->

<?php include( ROOT_PATH . '/includes/footer.php'); ?>

Hai să aplicăm și o stilizare. Deschideți main.css și adăugați acest cod de stilizare:

/* * * * * * * * *
* Pagina singulara
* * * * * * * * */
.content .post-wrapper {
width: 70%;
float: left;
min-height: 250px;
}
.full-post-div {
min-height: 300px;
padding: 20px;
border: 1px solid #e4e1e1;
border-radius: 2px;
}
.full-post-div h2.post-title {
margin: 10px auto 20px;
text-align: center;
}
.post-body-div {
font-family: 'Noto Serif', serif;
font-size: 1.2em;
}
.post-body-div p {
margin:20px 0px;
}
.post-sidebar {
width: 24%;
float: left;
margin-left: 5px;
min-height: 400px;
}
.content .post-comments {
margin-top: 25px;
border-radius: 2px;
border-top: 1px solid #e4e1e1;
padding: 10px;
}
.post-sidebar .card {
width: 95%;
margin: 10px auto;
border: 1px solid #e4e1e1;
border-radius: 10px 10px 0px 0px;
}
.post-sidebar .card .card-header {
padding: 10px;
text-align: center;
border-radius: 3px 3px 0px 0px;
background: #3E606F;
}
.post-sidebar .card .card-header h2 {
color: white;
}
.post-sidebar .card .card-content a {
display: block;
box-sizing: border-box;
padding: 8px 10px;
border-bottom: 1px solid #e4e1e1;
color: #444;
}
.post-sidebar .card .card-content a:hover {
padding-left: 20px;
background: #F9F9F9;
transition: 0.1s;
}

Arată mai bine acum, nu?

Mai avem un lucru de făcut și vom fi destul de aproape să terminăm cu zona publică: vom implementa
înregistrarea și autentificarea utilizatorilor.
Înregistrarea și autentificarea utilizatorului
Creați două fișiere în folderul rădăcină numit register.php și login.php. Deschideți fiecare dintre ele și copiati
acest cod:
register.php
<?php include('config.php'); ?>
<!-- Codul pentru gestionarea inregistrarii si autentificarii -->
<?php include('includes/registration_login.php'); ?>

<?php include('includes/header.php'); ?>

<title>Blog | Inregistrare </title>


</head>
<body>
<div class="container">
<!-- Navbar -->
<?php include( ROOT_PATH . '/includes/navbar.php'); ?>
<!-- // Navbar -->

<div style="width: 40%; margin: 20px auto;">


<form method="post" action="register.php" >
<h2>Înregistreaza-te pe Blog</h2>
<?php include(ROOT_PATH . '/includes/errors.php') ?>
<input type="text" name="username" value="<?php echo $username; ?>"
placeholder="Utilizator">
<input type="email" name="email" value="<?php echo $email ?>" placeholder="Email">
<input type="password" name="password_1" placeholder="Parola">
<input type="password" name="password_2" placeholder="Confirmare parola">
<button type="submit" class="btn" name="inreg_utilizator">Înregistreaza-te</button>
<p>
Esti deja membru? <a href="login.php">Logheaza-te</a>
</p>
</form>
</div>
</div>
<!-- // container -->
<!-- Footer -->
<?php include( ROOT_PATH . '/includes/footer.php'); ?>
<!-- // Footer -->

login.php
<?php include('config.php'); ?>
<?php include('includes/registration_login.php'); ?>
<?php include('includes/header.php'); ?>
<title>LifeBlog | Sign in </title>
</head>
<body>
<div class="container">
<!-- Navbar -->
<?php include( ROOT_PATH . '/includes/navbar.php'); ?>
<!-- // Navbar -->

<div style="width: 40%; margin: 20px auto;">


<form method="post" action="login.php" >
<h2>Login</h2>
<?php include(ROOT_PATH . '/includes/errors.php') ?>
<input type="text" name="username" value="<?php echo $username; ?>" value=""
placeholder="Utilizator">
<input type="password" name="password" placeholder="Parola">
<button type="submit" class="btn" name="login_btn">Logheaza-te</button>
<p>
Nu esti inca membru? <a href="register.php">Inregistreaza-te</a>
</p>
</form>
</div>
</div>
<!-- // container -->

<!-- Footer -->


<?php include( ROOT_PATH . '/includes/footer.php'); ?>
<!-- // Footer -->

În secțiunile de sus ale ambelor fișiere, am inclus un fișier numit registration_login.php pentru a gestiona
logica înregistrării și autentificării. Acesta este fișierul către care vor fi trimise informațiile despre formularul
de conectare și înregistrare și va comunica cu baza de date. Vom crea în dosarul includes și vom crea acest
cod în interiorul său:
<?php
// declarare variabile
$username = "";
$email = "";
$errors = array();

// Inregistrare utilizator
if (isset($_POST['inreg_utilizator'])) {
// primeste toate valorile scrie in formular
$username = esc($_POST['username']);
$email = esc($_POST['email']);
$password_1 = esc($_POST['password_1']);
$password_2 = esc($_POST['password_2']);

// validarea formularului: ne asiguram ca formularul este corect completat


if (empty($username)) { array_push($errors, "Uhmm...Avem nevoie de numele de
utilizator"); }
if (empty($email)) { array_push($errors, "Oops.. Email-ul lipseste"); }
if (empty($password_1)) { array_push($errors, "Ai uitat parola"); }
if ($password_1 != $password_2) { array_push($errors, "Cele doua parole nu se
potrivesc");}

// Ne asiguram ca un utilizator nu se poate inregistra de doua ori


// email-ul si numele de utilizator trebuie sa fie unice
$user_check_query = "SELECT * FROM utilizatori WHERE username='$username'
OR email='$email' LIMIT 1";

$result = mysqli_query($conn, $user_check_query);


$utilizator = mysqli_fetch_assoc($result);

if ($utilizator) { // daca utilizatorul exista


if ($utilizator['username'] === $username) {
array_push($errors, "Numele de utilizator deja exista");
}
if ($utilizator['email'] === $email) {
array_push($errors, "Email-ul deja exista");
}
}
// inregistreaza utilizator daca nu sunt erori in formular
if (count($errors) == 0) {
$password = md5($password_1);//cripteaza parola inainte de a o salva in baza de date
$query = "INSERT INTO utilizatori (username, email, password, creat_la,
actualizat_la)
VALUES('$username', '$email', '$password', now(), now())";
mysqli_query($conn, $query);

// preia ID-ul utilizatorului creat


$id_utilizator_inreg = mysqli_insert_id($conn);

// pune utilizatorul conectat in sesiune


$_SESSION['utilizator'] = getUtilizatorDupaID($id_utilizator_inreg);

// daca utilizatorul este administrator, redirectioneaza catre zona de administrare


if ( in_array($_SESSION['utilizator']['rol'], ["Admin", "Autor"])) {
$_SESSION['mesaj'] = "Esti logat";
// redirectioneaza catre zona de administrare
header('location: ' . BASE_URL . 'admin/dashboard.php');
exit(0);
} else {
$_SESSION['mesaj'] = "Esti logat";
// redirectioneaza la zona publica
header('location: index.php');
exit(0);
}
}
}

// Logheaza utilizatorul
if (isset($_POST['login_btn'])) {
$username = esc($_POST['username']);
$password = esc($_POST['password']);

if (empty($username)) { array_push($errors, "Este nevoie de numele de utilizator"); }


if (empty($password)) { array_push($errors, "Nu ai pus parola"); }
if (empty($errors)) {
$password = md5($password); // cripteaza parola
$sql = "SELECT * FROM utilizatori WHERE username='$username' and
password='$password' LIMIT 1";

$result = mysqli_query($conn, $sql);


if (mysqli_num_rows($result) > 0) {
// preia id-ul utilizatorului logat
$id_utiliz_logat = mysqli_fetch_assoc($result)['id'];

// pune utilizatorul logat in sesiune


$_SESSION['utilizator'] = getUtilizatorDupaID($id_utiliz_logat);

// daca este Admin, redirectioneaza in zona de administrare


if ( in_array($_SESSION['utilizator']['rol'], ["Admin", "Autor"])) {
$_SESSION['mesaj'] = "Esti logat";
// redirectioneaza la zona de administrare
header('location: ' . BASE_URL . '/admin/dashboard.php');
exit(0);
} else {
$_SESSION['mesaj'] = "Esti logat";
// redirectioneaza la zona publica
header('location: index.php');
exit(0);
}
} else {
array_push($errors, 'Utilizatorul sau parola sunt gresite');
}
}
}
// scapam de valorile din formular
function esc(String $value)
{
// aducem in functie obiectul global de conectare la baza de date
global $conn;

$val = trim($value); // elimina spatiul gol


$val = mysqli_real_escape_string($conn, $value);

return $val;
}
// obtine informatii despre utilizator dupa ID-ul acestuia
function getUtilizatorDupaID($id)
{
global $conn;
$sql = "SELECT * FROM utilizatori WHERE id=$id LIMIT 1";

$result = mysqli_query($conn, $sql);


$utilizator = mysqli_fetch_assoc($result);

return $utilizator;
}
?>

Accesați http://localhost/blog-php/register.php și veți vedea o eroare spunând că fișierul errors.php nu a


fost găsit.
Fișierul errors.php este fișierul cu cod pentru afișarea erorilor de validare a formularului. Creați errors.php
în blog-php /includes și lipiți acest cod în el:
<?php if (count($errors) > 0) : ?>
<div class="message error validation_errors" >
<?php foreach ($errors as $error) : ?>
<p><?php echo $error ?></p>
<?php endforeach ?>
</div>
<?php endif ?>

Deschideți încă o dată main.css să adăugăm ultima bucată de cod de stilizare pentru acest fișier errors.php
și câteva alte elemente:
/* Notificari mesaje */
.message {
width: 100%;
margin: 0px auto;
padding: 10px 0px;
color: #3c763d;
background: #dff0d8;
border: 1px solid #3c763d;
border-radius: 5px;
text-align: center;
}
.error {
color: #a94442;
background: #f2dede;
border: 1px solid #a94442;
margin-bottom: 20px;
}
.validation_errors p {
text-align: left;
margin-left: 10px;
}
.logged_in_info {
text-align: right;
padding: 10px;
}

Acum mesajul de eroare a dispărut. Dați clic pe butonul de înregistrare fără a completa formularul și vedeți
mesajele de eroare redate.
Să creăm un nou utilizator completând formularul de pe pagina register.php și făcând clic pe butonul de
înregistrare. Puteți furniza orice informații valide pentru numele de utilizator, adresa de e-mail și parola;
doar asigurați-vă că vi le amintiți, deoarece le vom folosi pentru a ne conecta foarte curând pe pagina de
autentificare.
Când un utilizator se conectează, va trebui cu siguranță să se poată deconecta. În folderul rădăcină al
aplicației, creați un fișier numit logout.php ce va avea următorul cod:
<?php
session_start();
session_unset($_SESSION['utilizator']);
session_destroy();
header('location: index.php');
?>
De asemenea, atunci când un utilizator se conectează, dorim să afișăm numele și un link sau un buton pentru
ca acesta să se poata deconecta. Pentru zona publică, vom face acest lucru în fișierul banner.php. Deschideți
fișierul banner.php și modificați codul pentru a arăta astfel:
<?php if (isset($_SESSION['utilizator']['username'])) { ?>
<div class="logged_in_info">
<span>Bine ai venit <?php echo $_SESSION['utilizator']['username'] ?></span>
|
<span><a href="logout.php">Deconectare</a></span>
</div>
<?php }else{ ?>
<div class="banner">
<div class="welcome_msg">
<h1>Inspiratia zilei</h1>
<p>
Daca nu lupti pentru visele tale <br>
atunci altcineva te va angaja sa <br>
lupti pentru visele lui! <br>
<span>~ Dhirubhai Ambani</span>
</p>
<a href="register.php" class="btn">Vino alaturi de noi!</a>
</div>
<div class="login_div">

<form action="<?php echo BASE_URL . 'index.php'; ?>" method="post" >


<h2>Login</h2>
<div style="width: 60%; margin: 0px auto;">
<?php include(ROOT_PATH . '/includes/errors.php') ?>
</div>
<input type="text" name="username" value="<?php echo $utilizator; ?>"
placeholder="Utilizator">
<input type="password" name="password" placeholder="Parola">
<button class="btn" type="submit" name="login_btn">Intra in cont</button>
</form>
</div>
</div>

<?php } ?>

Verifică sesiunea pentru a vedea dacă un utilizator este disponibil (conectat). Dacă sunteți conectat, numele
de utilizator este afișat împreună cu linkul de deconectare. Când există un utilizator conectat, bannerul nu
se afișează, deoarece este un fel de ecran de bun venit pentru utilizatorii invitați.
Observați că bannerul are un formular de autentificare și acest banner este inclus în fișierul index.php. Prin
urmare, trebuie să includem și codul care gestionează înregistrarea și autentificarea în fișierul index.php.
Deschideți index.php și adăugați această linie direct sub include pentru functions.php:
<?php require_once( ROOT_PATH . '/includes/registration_login.php') ?>

Și gata cu înregistrarea și autentificarea utilizatorului. În partea a III-a, vom începe lucrul la zona de
administrare.

S-ar putea să vă placă și