Documente Academic
Documente Profesional
Documente Cultură
Cum Se Creeaza Un Blog in PHP Si Baza de Date MySQL - Partea II
Cum Se Creeaza Un Blog in PHP Si Baza de Date MySQL - Partea II
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:
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:
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();
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);
?>
Î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
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;
}
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')
$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="">
$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 -->
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);
/* * * * * * * * *
* 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;
}
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'); ?>
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 -->
Î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']);
// Logheaza utilizatorul
if (isset($_POST['login_btn'])) {
$username = esc($_POST['username']);
$password = esc($_POST['password']);
return $val;
}
// obtine informatii despre utilizator dupa ID-ul acestuia
function getUtilizatorDupaID($id)
{
global $conn;
$sql = "SELECT * FROM utilizatori WHERE id=$id LIMIT 1";
return $utilizator;
}
?>
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">
<?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.