Professional Documents
Culture Documents
Cum Se Creeaza Un Blog in PHP Si Baza de Date MySQL - Partea III
Cum Se Creeaza Un Blog in PHP Si Baza de Date MySQL - Partea III
PARTEA III
Aceasta este partea a treia despre cum să construiești un blog cu PHP și MySQL. Este foarte important să
parcurgeți în totalitate partea I si II.
În ultimele două părți ale acestui proiect, am terminat de creat zona publică. Am configurat baza de date,
am introdus unele date în tabelele bazei de date și am putut să le interogăm și să le afișăm pe pagină.
Dar nu vrem întotdeauna să creăm utilizatori, postări, subiecte folosind un client de baze de date precum
PHPMyAdmin, nu-i așa? Vrem o interfață pe site și un utilizator conectat cu privilegii de administrator pentru
a face acest lucru.
Când un utilizator cu privilegii de administrator se conectează, acesta este
redirecționat automat către tabloul de bord al administratorului. Dar nu am creat
încă un utilizator de administrator în sistemul nostru. Vom face asta imediat.
În folderul blog-php/admin, creați un fișier numit dashboard.php.
<?php include('../config.php'); ?>
<?php include(ROOT_PATH . '/admin/includes/admin_functions.php'); ?>
<?php include(ROOT_PATH . '/admin/includes/head_section.php'); ?>
<title>Admin | Dashboard</title>
</head>
<body>
<div class="header">
<div class="logo">
<a href="<?php echo BASE_URL .'admin/dashboard.php' ?>">
<h1>Blog - Admin</h1>
</a>
</div>
<?php if (isset($_SESSION['utilizator'])): ?>
<div class="user-info">
<span><?php echo $_SESSION['utilizator']['username'] ?></span>
<a href="<?php echo BASE_URL . '/logout.php'; ?>" class="logout-btn">Deconectare</a>
</div>
<?php endif ?>
</div>
<div class="container dashboard">
<h1>Bine ai venit</h1>
<div class="stats">
<a href="users.php" class="first">
<span>43</span> <br>
<span>Utilizatori noi inregistrati</span>
</a>
<a href="posts.php">
<span>43</span> <br>
<span>Postari publicate</span>
</a>
<a>
<span>43</span> <br>
<span>Comentarii publicate</span>
</a>
</div>
<br><br><br>
<div class="buttons">
<a href="users.php">Adauga utilizatori</a>
<a href="posts.php">Adauga postari</a>
</div>
</div>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<!-- Fonturi Google -->
<link href="https://fonts.googleapis.com/css?family=Averia+Serif+Libre|Noto+Serif|Tangerine" rel="stylesheet">
<!-- Font awesome -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" />
<!-- ckeditor -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/ckeditor/4.8.0/ckeditor.js"></script>
<!-- stilizare -->
<link rel="stylesheet" href="../static/css/admin_styling.css">
Reîncărcați pagina dashboard.php din browser. Acum, mesajul de eroare care rămâne este pentru un singur
fișier (admin_functions.php). Vom ajunge la acesta în curând.
Odată ajunși în backend, utilizatorul poate crea, citi, actualiza și șterge utilizatori,
postări și subiecte. Să începem cu utilizatorii. În folderul de administrare (admin),
creați un fișier numit users.php, deschideți-l și scrieți următorul cod:
<?php include('../config.php'); ?>
<?php include(ROOT_PATH . '/admin/includes/admin_functions.php'); ?>
<?php
// Preia toti administratorii din baza de date
$administratori = getAdministratori();
$roluri = ['Admin', 'Autor'];
?>
<?php include(ROOT_PATH . '/admin/includes/head_section.php'); ?>
<title>Admin | Gestioneaza utilizatori</title>
</head>
<body>
<!-- admin navbar -->
<?php include(ROOT_PATH . '/admin/includes/navbar.php') ?>
<div class="container content">
<!-- Meniul din stanga -->
<?php include(ROOT_PATH . '/admin/includes/menu.php') ?>
<!-- Formular din mijloc - pentru a crea si edita -->
<div class="action">
<h1 class="page-title">Creeaza/Editeaza Administrator Utilizator</h1>
<!-- Daca editeaza utilizatorul curent, este nevoie pentru ID pentru a identifica utilizatorul -->
<?php if ($editeazaUtilizatorul === true): ?>
<input type="hidden" name="admin_id" value="<?php echo $admin_id; ?>">
<?php endif ?>
<!-- daca editeaza utilizatorul curent, afiseaza butonul de actualizare in loc de cel de creare -->
<?php if ($editeazaUtilizatorul === true): ?>
<button type="submit" class="btn" name="update_admin">ACTUALIZARE</button>
<?php else: ?>
<button type="submit" class="btn" name="create_admin">Salvare utilizator</button>
<?php endif ?>
</form>
</div>
<!-- // Formularul din mijloc - pentru a crea si edita -->
Atât trebuie să facem în fișierul users.php. Crearea, editarea și ștergerea unui utilizator va fi făcută în acest
fișier.
La începutul fișierului users.php, apelăm o funcție getAdministratori() care returnează o listă cu toți
utilizatorii de administrare din baza de date. Această funcție trebuie definită în fișierul admin_functions.php
pe care nu l-am creat încă, dar îl puteți vedea inclus în fișierul users.php chiar înainte de apelul funcției.
În folderul admin/includes, creați admin_functions.php și adăugați acest cod:
<?php
// Variabile Admin utilizator
$admin_id = 0;
$editeazaUtilizatorul = false;
$username = "";
$rol = "";
$email = "";
// variabile generale
$errors = [];
/* - - - - - - - - - -
- Actiunile administratorilor
- - - - - - - - - - -*/
// daca utilizatorul apasa butonul de creare admin
if (isset($_POST['create_admin'])) {
creeazaAdmin($_POST);
}
// Daca apasa pe editare amin
if (isset($_GET['edit-admin'])) {
$editeazaUtilizatorul = true;
$admin_id = $_GET['edit-admin'];
editeazaAdmin($admin_id);
}
// daca apasa pe actualizare admin
if (isset($_POST['update_admin'])) {
actualizeazaAdmin($_POST);
}
// Daca apasa pe stergere admin
if (isset($_GET['delete-admin'])) {
$admin_id = $_GET['delete-admin'];
stergeAdmin($admin_id);
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* - Returneaza toti utilizatorii administrator si rolurile corespunzatoare
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
function getAdministratori(){
global $conn, $roluri;
$sql = "SELECT * FROM utilizatori WHERE rol IS NOT NULL";
$result = mysqli_query($conn, $sql);
$utilizatori = mysqli_fetch_all($result, MYSQLI_ASSOC);
return $utilizatori;
}
/* * * * * * * * * * * * * * * * * * * * *
* - Scapa de valoarea trimisa din formular, astfel incat sa impiedice injectia SQL
* * * * * * * * * * * * * * * * * * * * * */
function esc(String $value){
global $conn;
$val = trim($value);
$val = mysqli_real_escape_string($conn, $value);
return $val;
}
// Primeste un sir de tipul "Ana are mere"
// si returneaza "ana-are-mere"
function executaSlug(String $string){
$string = strtolower($string);
$slug = preg_replace('/[^A-Za-z0-9-]+/', '-', $string);
return $slug;
}
?>
Reîncărcați pagina dashboard.php din browser și mesajul de eroare ar fi trebuit să dispară.
Următorul pas este să includem pagina navbar.php și pagina menu.php. Acestea sunt segmente repetitive
de la paginile de administrare, la fel cum a fost cazul în zona publică.
Deci, creați aceste 2 fișiere în folderul admin/includes: navbar.php și menu.php.
navbar.php
<div class="header">
<div class="logo">
<a href="<?php echo BASE_URL .'admin/dashboard.php' ?>">
<h1>Blog - Admin</h1>
</a>
</div>
<div class="user-info">
<span><?php echo $_SESSION['utilizator']['username'] ?></span> <a href="<?php echo BASE_URL .
'/logout.php'; ?>" class="logout-btn">Deconectare</a>
</div>
</div>
menu.php
<div class="menu">
<div class="card">
<div class="card-header">
<h2>Actiuni</h2>
</div>
<div class="card-content">
<a href="<?php echo BASE_URL . 'admin/create_post.php' ?>">Creeaza postari</a>
<a href="<?php echo BASE_URL . 'admin/posts.php' ?>">Gestioneaza postarile</a>
<a href="<?php echo BASE_URL . 'admin/users.php' ?>">Gestioneaza utilizatorii</a>
<a href="<?php echo BASE_URL . 'admin/topics.php' ?>">Gestioneaza subiectele</a>
</div>
</div>
</div>
Acum, hai să creăm stilizarea pentru secțiunea de administrare. În folderul blog-php /static /css /, creați un
fișier numit admin_styling.css și adăugați acest cod:
/* * * * * * * * * *
* Setari implicite
* * * * * * * * * */
* { margin: 0px; padding: 0px; }
a { text-decoration: none; }
h1, h2, h3, h4, h5, h6 { font-family: 'Noto Serif', serif; }
/* forms */
form { width: 60%; margin: 5px auto; padding-bottom: 50px; }
form input[type=file], input[type=email], input[type=password], input[type=text],
form select, form textarea {
width: 100%;
display: block;
padding: 13px 13px;
font-size: 1em;
margin: 5px auto 10px;
border-radius: 3px;
box-sizing : border-box;
background: transparent;
border: 1px solid #3E606F;
}
input[type="checkbox"] { height: 20px; float: left; }
form button { float: right; margin-left: 24%; }
form input:focus { outline: none; }
label { margin-top: 20px; float: left; }
/* tables */
table { border-collapse: collapse; width: 70%; margin: 20px auto; }
th, td { padding: 8px; text-align: left; border: 1px solid #ddd; }
th { text-align: center;}
/* buttons */
.btn {
color: white;
background: #4E6166;
text-align: center;
border: none;
border-radius: 5px;
display: block;
letter-spacing: .1em;
padding: 13px 20px;
text-decoration: none;
}
/* * * * * * * * * *
* Antet
* * * * * * * * * */
.header {
padding: 15px 45px;
font-family: 'Noto Serif', serif;
color: white;
background: black;
}
.header .logo { width: 50%; float: left; }
.header .logo h1 { color: white; }
.header .user-info { width: 10%; margin-top: 10px; float: right;}
.header .logout-btn { color: red; text-decoration: none; }
.header:after{ content: ""; display: block; clear: both; }
/* * * * * * * * * *
* Panou de control / Dashboard
* * * * * * * * * */
.container {
width: 95%;
margin: 5px auto 50px;
border: 1px solid #BFBCB3;
padding: 10px 0px 50px;
}
.container:after { content: ""; display: block; clear: both; }
.container.dashboard h1 { text-align: center; margin: 25px; }
.container.dashboard .stats a {
display: inline-block;
padding: 30px;
margin: 5px;
width: 25%;
text-align: center;
border-radius: 3px;
border: 1px solid #BFBCB3;
}
.container.dashboard .stats a.first { margin-left: 25px; }
.container.dashboard .stats a:hover { cursor: pointer; background-color: #E1E1E1; }
.container.dashboard .buttons { margin-left: 15px; }
.container.dashboard .buttons a {
display: inline-block;
margin: 10px;
text-decoration: none;
color: #444;
padding: 10px 25px;
border: none;
background-color: #0E7D92;
color: white;
}
/* * * * * * * * * *
* Continutul paginii
* * * * * * * * * */
.container.content .menu { width: 16%; float: left; padding: 40px 10px; }
/* Meniu actiuni */
.container.content .menu .card .card-header {
padding: 10px;
text-align: center;
border-radius: 3px 3px 0px 0px;
background: #3E606F;
}
.container.content .menu .card .card-header h2 { color: white; }
.container.content .menu .card .card-content a {
display: block;
box-sizing: border-box;
padding: 8px 10px;
border-bottom: 1px solid #e4e1e1;
color: #444;
}
.container.content .menu .card .card-content a:hover {
padding-left: 20px; background: #F9F9F9; transition: 0.1s;
}
/* div actiuni (la mijloc) */
.container.content .action { width: 35%; float: left; text-align: center; }
.container.content .action form { width: 90%; }
.container.content .action .page-title { margin: 25px; }
.container.content .action.create-post-div { width: 80%; }
/* div tabel (Afiseaza inregistrarile din baza de date) */
.table-div { float: left; width: 47%; }
.table-div .message { width: 90%; margin-top: 20px; }
.table-div table { width: 90%; }
.table-div a.fa { color: white; padding: 3px; }
.table-div .edit { background: #004220; }
.table-div .delete { background: #F70E1A; }
.table-div .publish { background: red; }
.table-div .unpublish { background: green; }
/* * * * * * * * * *
* Erori de validare
* * * * * * * * * */
.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;}
Acesta afișează mesaje de notificare pentru a oferi utilizatorului feedback despre acțiunile sale.
Pagina users.php are deja un formular atât pentru crearea și actualizarea unui utilizator administrator, cât și
un tabel pentru listarea și ștergerea utilizatorilor. Mai rămâne doar să adăugăm funcțiile PHP care efectuează
aceste acțiuni. Deci, deschideți fișierul admin_functions.php și adăugați acest cod direct după Acțiunile
Administratorilor (după declarațiile if) din partea de sus a paginii și înainte de funcția getAdministratori ():
/* - - - - - - - - - - - -
- functii administrare
- - - - - - - - - - - - -*/
/* * * * * * * * * * * * * * * * * * * * * * *
* - Primeste date din formular
* - Creaza noi utilizatori de administrare
* - Returneaza toti utilizatorii admin dupa rol
* * * * * * * * * * * * * * * * * * * * * * */
function creeazaAdmin($request_values){
global $conn, $errors, $role, $username, $email;
$username = esc($request_values['username']);
$email = esc($request_values['email']);
$password = esc($request_values['password']);
$passwordConfirmation = esc($request_values['passwordConfirmation']);
if(isset($request_values['role'])){
$rol = esc($request_values['role']);
}
// validare formular: se asigura ca formularul este completat corect
if (empty($username)) { array_push($errors, "Este nevoie de nume de utilizator"); }
if (empty($email)) { array_push($errors, "Oops.. nu ai scris emailul"); }
if (empty($rol)) { array_push($errors, "Este necesar un rol pentru utilizatori");}
if (empty($password)) { array_push($errors, "Ai uitat sa pui parola"); }
if ($password != $passwordConfirmation) { array_push($errors, "Parolele nu se potrivesc"); }
// Asigura ca se introduce de mai multe ori un nume de utilizator
// Email-ul si utilizatorii ar trebui sa fie unici
$verif_utiliz_query = "SELECT * FROM utilizatori WHERE username='$username'
OR email='$email' LIMIT 1";
$result = mysqli_query($conn, $verif_utiliz_query);
$utilizator = mysqli_fetch_assoc($result);
if ($utilizator) { // daca exista
if ($user['username'] === $username) {
array_push($errors, "Utilizatorul deja exista");
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* - Primeste cererea de administrator din formular si actualizeaza BD
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
function actualizeazaAdmin($request_values){
global $conn, $errors, $rol, $username, $isEditingUser, $admin_id, $email;
// preia ID-ul administratorului pentru actualizare
$admin_id = $request_values['admin_id'];
// seteaza starea de editare la fals
$editeazaUtilizatorul = false;
$username = esc($request_values['username']);
$email = esc($request_values['email']);
$password = esc($request_values['password']);
$passwordConfirmation = esc($request_values['passwordConfirmation']);
if(isset($request_values['role'])){
$rol = $request_values['role'];
}
// inregistreaza utilizator daca nu sunt erori in formular
if (count($errors) == 0) {
$password = md5($password);
Codul pe care tocmai l-am adăugat are 3 părți principale: inițializarea variabilelor utilizatorului de
administrare, acțiunile utilizatorului de administrare și funcțiile utilizatorului de administrare, în această
ordine. Vom folosi același format atunci când adăugăm codul pentru Subiecte. Deocamdată, putem deja
crea, citi, actualiza și șterge un utilizator.
Acum accesați http://localhost/blog-php/admin/users.php. Creați un utilizator și atribuiți rolul de
Administrator. Asigurați-vă că vă amintiți numele de utilizator și parola acestui utilizator de administrare,
deoarece în viitor ne vom conecta folosind aceste date.
De exemplu: nume de utilizator: popescu, e-mail: popescu@test.com, parolă: ionpopescu.
topics.php
<?php include('../config.php'); ?>
<?php include(ROOT_PATH . '/admin/includes/admin_functions.php'); ?>
<?php include(ROOT_PATH . '/admin/includes/head_section.php'); ?>
<!-- Preia toate subiectele din BD -->
<?php $subiecte = getToateSubiectele(); ?>
<title>Admin | Gestioneaza subiectele</title>
</head>
<body>
<!-- admin navbar -->
<?php include(ROOT_PATH . '/admin/includes/navbar.php') ?>
<div class="container content">
<!-- meniu lateral -->
<?php include(ROOT_PATH . '/admin/includes/menu.php') ?>
Apoi scriem codul PHP în interiorul admin_functions.php pentru a efectua operațiile pe subiect.
Următorul cod are trei secțiuni. Fiecare secțiune a fost etichetată deasupra folosind un comentariu, Cele trei
sunt variabile, acțiuni și funcții. Deci, în fișierul admin_functions.php, adăugați următorul cod, dar asigurați-
vă că îl împărțiți corespunzător, după cum se indică mai jos, folosind comentariile.
<?php
// Variabile Admin utilizator
// ......aici ar trebui sa fie variabilele .....
// Variabilele subiectelor
$id_subiect = 0;
$editeazaSubiectul = false;
$nume_subiect = "";
/* - - - - - - - - - -
- Actiunile administratorilor
- - - - - - - - - - -*/
//...
/* - - - - - - - - - -
- Actiuni subiect
- - - - - - - - - - -*/
//Daca utilizatorul apasa pe butonul de creare subiect
if (isset($_POST['create_topic'])) { creeazaSubiect($_POST); }
// Daca utilizatorul apasa pe butonul de editare
if (isset($_GET['edit-topic'])) {
$editeazaSubiectul = true;
$id_subiect = $_GET['edit-topic'];
editeazaSubiect($id_subiect);
}
// Daca utilizatorul apasa pe butonul de actualizare
if (isset($_POST['update_topic'])) {
actualizeazaSubiect($_POST);
}
// if user clicks the Delete topic button
if (isset($_GET['delete-topic'])) {
$id_subiect = $_GET['delete-topic'];
stergeSubiect($id_subiect);
}
/* - - - - - - - - - - - -
- functii administrare
- - - - - - - - - - - - -*/
//......
/* - - - - - - - - - -
- Functii subiecte
- - - - - - - - - - -*/
// Preia toate subiectele din BD
function getToateSubiectele() {
global $conn;
$sql = "SELECT * FROM subiecte";
$result = mysqli_query($conn, $sql);
$subiecte = mysqli_fetch_all($result, MYSQLI_ASSOC);
return $subiecte;
}
function creeazaSubiect($request_values){
global $conn, $errors, $nume_subiect;
$nume_subiect = esc($request_values['topic_name']);
// creeaza slug: daca subiectul este " Sfaturi Prietenesti", returneaza "sfaturi-prietenesti" ca slug
$slug_subiect = executaSlug($nume_subiect);
// valideaza formularul
if (empty($nume_subiect)) {
array_push($errors, "Este nevoie de numele subiectului");
}
// Ne asiguram ca nici un subiect nu este salvat de doua ori.
$query_verifica_subiect = "SELECT * FROM subiecte WHERE slug='$slug_subiect' LIMIT 1";
$result = mysqli_query($conn, $query_verifica_subiect);
if (mysqli_num_rows($result) > 0) { // daca exista subiect
array_push($errors, "Subiectul deja exista");
}
// inregistreaza subiectul daca nu sunt erori in formular
if (count($errors) == 0) {
$query = "INSERT INTO subiecte (nume, slug)
VALUES('$nume_subiect', '$slug_subiect')";
mysqli_query($conn, $query);