Sunteți pe pagina 1din 14

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

PARTEA IV
Aceasta este partea a patra despre cum să construiești un blog cu PHP și MySQL. Este foarte important să fi
parcurs deja primele trei părți.
Până acum am creat o zonă publică care afișează postările publicate dintr-un tabel de postări din baza de
date MySQL. De asemenea, am finalizat un sistem de înregistrare a utilizatorilor care se ocupă de conectare
atât pentru utilizatorii administratori, cât și pentru utilizatorii normali. În backend, utilizatorul administrator
conectat poate crea acum alți utilizatori administratori, precum și subiecte.

În această secțiune, vom lucra la postările de pe blog. Vom crea o pagină care oferă utilizatorilor (sau
autorilor) administratori conectați un formular pentru a crea o nouă postare pe blog.

Vom crea două fișiere: fișierul posts.php în folderul admin și post_functions.php în folderul admin/includes.
Fișierul posts.php listează toate postările obținute din baza de date într-un format de tabel, în timp ce
post_functions.php conține funcții care efectuează operațiuni pe postări, cum ar fi interogarea acestora din
baza de date și returnarea lor în fișierul posts.php.

Plasați acest cod în fișierul posts.php:


<?php include '../config.php';?>
<?php include ROOT_PATH . '/admin/includes/admin_functions.php';?>
<?php include ROOT_PATH . '/admin/includes/post_functions.php';?>
<?php include ROOT_PATH . '/admin/includes/head_section.php';?>

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


<?php $postari = getToatePostarile();?>
<title>Admin | Gestioneaza Postarile </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'?>

<!-- Afiseaza inregistrarile din BD -->


<div class="table-div" style="width: 80%;">
<!-- Afiseaza mesajele de notificare -->
<?php include ROOT_PATH . '/includes/messages.php'?>

<?php if (empty($postari)): ?>


<h1 style="text-align: center; margin-top: 20px;">Nici o postare in baza de date</h1>
<?php else: ?>
<table class="table">
<thead>
<th>Nr.</th>
<th>Titlu</th>
<th>Autor</th>
<th>Vizualizari</th>
<!-- Doar Administratorii pot publica postari -->
<?php if ($_SESSION['utilizator']['rol'] == "Admin"): ?>
<th><small>Publica</small></th>
<?php endif?>
<th><small>Editeaza</small></th>
<th><small>Sterge</small></th>
</thead>
<tbody>
<?php foreach ($postari as $key => $postare): ?>
<tr>
<td><?php echo $key + 1; ?></td>
<td><?php echo $postare['autor']; ?></td>
<td>
<a target="_blank"
href="<?php echo BASE_URL . 'single_post.php?slug_postare=' . $postare['slug'] ?>">
<?php echo $postare['titlu']; ?>
</a>
</td>
<td><?php echo $postare['vizualizari']; ?></td>

<!-- Doar administratorii pot publica/depublica postari -->


<?php if ($_SESSION['utilizator']['rol'] == "Admin"): ?>
<td>
<?php if ($postare['publicat'] == true): ?>
<a class="fa fa-check btn unpublish"
href="posts.php?unpublish=<?php echo $postare['id'] ?>">
</a>
<?php else: ?>
<a class="fa fa-times btn publish"
href="posts.php?publish=<?php echo $postare['id'] ?>">
</a>
<?php endif?>
</td>
<?php endif?>

<td>
<a class="fa fa-pencil btn edit"
href="create_post.php?edit-post=<?php echo $postare['id'] ?>">
</a>
</td>
<td>
<a class="fa fa-trash btn delete"
href="create_post.php?delete-post=<?php echo $postare['id'] ?>">
</a>
</td>
</tr>
<?php endforeach?>
</tbody>
</table>
<?php endif?>
</div>
<!-- // Afiseaza inregistrarile din BD -->
</div>
</body>
</html>
În secțiunea de sus, am inclus fișierul post_functions.php nou creat.
Să-l deschidem și să adăugăm codul care preia postările din baza de date.

<?php
// variabilele postarii
$id_postare = 0;
$editeazaPostare = false;
$publicat = 0;
$titlu = "";
$slug_postare = "";
$continut = "";
$imagine = "";
$subiect_postare = "";

/* - - - - - - - - - -
- Functii postare
- - - - - - - - - - -*/
// Preia toate inregistrarile din BD
function getToatePostarile()
{
global $conn;

// Administratorii pot vedea toate postarile


// Autorii pot vedea doar postarile lor
if ($_SESSION['utilizator']['rol'] == "Admin") {
$sql = "SELECT * FROM postari";
} elseif ($_SESSION['utilizator']['rol'] == "Autor") {
$user_id = $_SESSION['utilizator']['id'];
$sql = "SELECT * FROM postari WHERE id_utilizator=$id_utilizator";
}
$result = mysqli_query($conn, $sql);
$postari = mysqli_fetch_all($result, MYSQLI_ASSOC);

$postari_finale = array();
foreach ($postari as $postare) {
$postare['autor'] = getAutorPostareDupaID($postare['id_utilizator']);
array_push($postari_finale, $postare);
}
return $postari_finale;
}
// preia autorul / username de la postare
function getAutorPostareDupaID($id_utilizator)
{
global $conn;
$sql = "SELECT username FROM utilizatori WHERE id=$id_utilizator";
$result = mysqli_query($conn, $sql);
if ($result) {
// returneaza username
return mysqli_fetch_assoc($result)['username'];
} else {
return null;
}
}
Acum accesați http://localhost/blog-php/login.php și conectați-vă cu numele de utilizator și parola pe care
le-ați creat în ultimul tutorial. Dacă nu vă conectați, veți întâlni erori.
După conectare, accesați http://localhost/blog-php/admin/posts.php
Dacă totul a mers bine, veți vedea că pagina are 2 postări (cele pe care le-am creat mai devreme), afișate
într-un tabel.
În acest moment, putem interoga baza de date pentru postări și le putem lista într-un format tabelar. Hai
să facem un formular pentru crearea de fapt a postărilor. Creați un fișier create_post.php în dosarul de
administrator (admin) și scrieți acest cod:
<?php include('../config.php'); ?>
<?php include(ROOT_PATH . '/admin/includes/admin_functions.php'); ?>
<?php include(ROOT_PATH . '/admin/includes/post_functions.php'); ?>
<?php include(ROOT_PATH . '/admin/includes/head_section.php'); ?>
<!-- Preia toate subiectele -->
<?php $subiecte = getToateSubiectele(); ?>
<title>Admin | Creeaza postare</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') ?>

<!-- formularul de mijloc - pentru a crea si edita -->


<div class="action create-post-div">
<h1 class="page-title">Creeaza / Editeaza postare</h1>
<form method="post" enctype="multipart/form-data" action="<?php echo BASE_URL . 'admin/create_post.php'; ?>" >
<!-- valideaza erorile din formular -->
<?php include(ROOT_PATH . '/includes/errors.php') ?>

<!-- daca se editeaza postarea, este nevoie de ID pentru identificarea acesteia -->
<?php if ($editeazaPostare === true): ?>
<input type="hidden" name="post_id" value="<?php echo $id_postare; ?>">
<?php endif ?>

<input type="text" name="title" value="<?php echo $titlu; ?>" placeholder="Titlu">


<label style="float: left; margin: 5px auto 5px;">Imagine</label>
<input type="file" name="featured_image" >
<textarea name="body" id="body" cols="30" rows="10"><?php echo $continut; ?></textarea>
<select name="topic_id">
<option value="" selected disabled>Alege subiect</option>
<?php foreach ($subiecte as $subiect): ?>
<option value="<?php echo $subiect['id']; ?>">
<?php echo $subiect['nume']; ?>
</option>
<?php endforeach ?>
</select>

<!-- Doar administratorii pot vedea campul de Publicare -->


<?php if ($_SESSION['utilizator']['rol'] == "Admin"): ?>
<!-- afiseaza o caseta de bifat in caz ca postul este publicat sau nu -->
<?php if ($publicat == true): ?>
<label for="publish">
Publica
<input type="checkbox" value="1" name="publish" checked="checked">&nbsp;
</label>
<?php else: ?>
<label for="publish">
Publica
<input type="checkbox" value="1" name="publish">&nbsp;
</label>
<?php endif ?>
<?php endif ?>

<!-- Daca editeaza postarea, afiseaza butonul de actualizare -->


<?php if ($editeazaPostare === true): ?>
<button type="submit" class="btn" name="update_post">ACTUALIZEAZA</button>
<?php else: ?>
<button type="submit" class="btn" name="create_post">Salveaza postare</button>
<?php endif ?>

</form>
</div>
<!-- // formularul de mijloc - pentru a crea si edita -->
</div>
</body>
</html>

<script>
CKEDITOR.replace('body');
</script>

De multe ori, pentru o postare pe blog, va trebui să scriem un text în caractere aldine, cursive, subliniate,
titluri, liste ordonate și neordonate, precum și să încărcăm imagini. Pentru a face acest lucru, vom avea
nevoie de un ckeditor care să ofere o zonă de text „bogat” cu aceste caracteristici. Pentru asta, trebuie să
includem scriptul (codul) plugin-ului ckeditor, lucru pe care l-am făcut deja în fișierul head_section.php.
Pentru a activa acest ckeditor într-o zonă text, trebuie făcute 3 lucruri:
1. Trebuie să includem scriptul sursă CKEditor (așa cum am făcut deja în fișierul head_section.php)
2. Trebuie să avem o zonă text și să-i dăm un id (spunem id = „body”, așa cum am făcut în acest caz)
3. În cele din urmă, trebuie să inițializăm textarea cu acest script (așa cum am făcut în create_post.php):
<script>
CKEDITOR.replace('body');
</script>

Deschideți http://localhost/blog-php/admin/create_post.php în browser și veți vedea textarea


transformată.
Vom folosi același formular pentru a crea și edita postări. Ceea ce ne rămâne acum este să scriem funcțiile
responsabile de crearea, editarea, actualizarea și ștergerea postărilor. Facem asta în post_functions.php.

Deschideți post_functions.php și adăugați următoarele funcții și instrucțiuni if:


/* - - - - - - - - - -
- actiunile de postare
- - - - - - - - - - -*/
// data utilizatorul apasa pe butonul de creare postare
if (isset($_POST['create_post'])) { creeazaPostare($_POST); }
// daca utilizatorul apasa pe butonul de Editare
if (isset($_GET['edit-post'])) {
$editeazaPostare = true;
$id_postare = $_GET['edit-post'];
editeazaPostare($id_postare);
}
// daca utilizatorul apasa butonul de actualizare
if (isset($_POST['update_post'])) {
actualizeazaPostare($_POST);
}
// daca se apasa pe butonul de stergere
if (isset($_GET['delete-post'])) {
$id_postare = $_GET['delete-post'];
stergePostare($id_postare);
}

/* - - - - - - - - - -
- continuare functii postare
- - - - - - - - - - -*/
function creeazaPostare($request_values)
{
global $conn, $errors, $titlu, $imagine, $id_subiect, $continut, $publicat;
$titlu = esc($request_values['title']);
$continut = htmlentities(esc($request_values['body']));
if (isset($request_values['topic_id'])) {
$id_subiect = esc($request_values['topic_id']);
}
if (isset($request_values['publish'])) {
$publicat = esc($request_values['publish']);
}
// creeaza slug:
$slug_postare = executaSlug($titlu);
// valideaza formular
if (empty($titlu)) { array_push($errors, "Este necesar titlul postarii"); }
if (empty($continut)) { array_push($errors, "Nu ai pus continut"); }
if (empty($id_subiect)) { array_push($errors, "Trebuie sa setezi subiectul postarii"); }
// preia numele imaginii
$imagine = $_FILES['featured_image']['name'];
if (empty($imagine)) { array_push($errors, "Este necesara o imagine"); }
// folderul unde se salveaza imaginea
$target = "../static/images/" . basename($imagine);
if (!move_uploaded_file($_FILES['featured_image']['tmp_name'], $target)) {
array_push($errors, "Eroare de incarcare. Verificati setarile serverului ");
}
// Asigura ca nici o postare nu este salvata de doua ori
$query_verifica_postare = "SELECT * FROM postari WHERE slug='$slug_postare' LIMIT 1";
$result = mysqli_query($conn, $query_verifica_postare);

if (mysqli_num_rows($result) > 0) { // daca exista postari


array_push($errors, " Deja exista o postare cu acest titlu.");
}
// creeaza postare daca nu sunt erori in formular
if (count($errors) == 0) {
$query = "INSERT INTO postari (id_utilizator, titlu, slug, imagine, continut, publicat, creat_la, actualizat_la) VALUES(1,
'$titlu', '$slug_postare', '$imagine', '$continut', $publicat, now(), now())";
if(mysqli_query($conn, $query)){ // daca postarea a fost creata cu succes
$id_postare_indeserata = mysqli_insert_id($conn);
// creeaza relatii intre postare si subiect
$sql = "INSERT INTO postari_subiecte (id_postare, id_subiect) VALUES($id_postare_inserata, $id_subiect)";
mysqli_query($conn, $sql);

$_SESSION['message'] = "Postarea a fost creata cu succes";


header('location: posts.php');
exit(0);
}
}
}

/* * * * * * * * * * * * * * * * * * * * *
* - Preia ID-ul postarii ca parametru
* - Preia postarea din baza de date
* - seteaza campurile formularului pentru editare
* * * * * * * * * * * * * * * * * * * * * */
function editeazaPostare($role_id)
{
global $conn, $titlu, $slug_postare, $continut, $publicat, $editeazaPostare, $id_postare;
$sql = "SELECT * FROM postari WHERE id=$role_id LIMIT 1";
$result = mysqli_query($conn, $sql);
$postare = mysqli_fetch_assoc($result);
// seteaza valorile din formular pentru a fi actualizate
$titlu = $postare['titlu'];
$continut = $postare['continut'];
$publicat = $post['publicat'];
}
function actualizeazaPostare($request_values)
{
global $conn, $errors, $id_postare, $titlu, $imagine, $id_subiect, $continut, $publicat;

$titlu = esc($request_values['title']);
$continut = esc($request_values['body']);
$id_postare = esc($request_values['post_id']);
if (isset($request_values['topic_id'])) {
$id_subiect = esc($request_values['topic_id']);
}
// creeaza slug
$slug_postare = executaSlug($titlu);

if (empty($titlu)) { array_push($errors, "Este nevoie de titlu"); }


if (empty($continut)) { array_push($errors, "Nu ai pus continut"); }
// daca s-a adaugat o alta imagine
if (isset($_POST['featured_image'])) {
// preia numele imaginii
$imagine = $_FILES['featured_image']['name'];
// folderul de salvare
$target = "../static/images/" . basename($imagine);
if (!move_uploaded_file($_FILES['featured_image']['tmp_name'], $target)) {
array_push($errors, "Eroare de incarcare. Verificati setarile serverului");
}
}

// inregistreaza subiectul daca nu sunt erori in formular


if (count($errors) == 0) {
$query = "UPDATE postari SET titlu='$titlu', slug='$slug_postare', vizualizari=0, imagine='$imagine', continut='$continut',
publicat=$publicat, actualizat_la=now() WHERE id=$id_postare";
// ataseaza subiectul la postare in tabela postari_subiecte
if(mysqli_query($conn, $query)){ // daca postarea a fost creata cu succes
if (isset($topic_id)) {
$id_postare_inserata = mysqli_insert_id($conn);
// creeaza relatia dintre postare si subiect
$sql = "INSERT INTO postari_subiecte (id_postare, id_subiect) VALUES($id_postare_inserata, $id_subiect)";
mysqli_query($conn, $sql);
$_SESSION['message'] = "Postarea a fost creata cu succes";
header('location: posts.php');
exit(0);
}
}
$_SESSION['message'] = "Postare actualizata cu succes";
header('location: posts.php');
exit(0);
}
}
// sterge postare
function stergePostare($id_postare)
{
global $conn;
$sql = "DELETE FROM postari WHERE id=$id_postare";
if (mysqli_query($conn, $sql)) {
$_SESSION['message'] = "Postarea a fost stearsa cu succes";
header("location: posts.php");
exit(0);
}
}

Acum putem crea, citi, actualiza și șterge postări.

Un ultim lucru, hai să adăugăm codul pentru a publica / anula publicarea postării. În același fișier
post_functions.php, adăugați acest cod:
/* - - - - - - - - - -
- continuare la actiunile de postare
- - - - - - - - - - -*/
// daca utilizatorul apasa pe butonul de publicare
if (isset($_GET['publish']) || isset($_GET['unpublish'])) {
$message = "";
if (isset($_GET['publish'])) {
$message = "Postarea publicata cu succes";
$id_postare = $_GET['publish'];
} else if (isset($_GET['unpublish'])) {
$message = "Postarea nu mai este publica";
$id_postare = $_GET['unpublish'];
}
comutaPostarePublicata($id_postare, $message);
}
//.....

// sterge postare
//.....

function comutaPostarePublicata($id_postare, $message)


{
global $conn;
$sql = "UPDATE postari SET publicat = !publicat WHERE id=$id_postare";
if (mysqli_query($conn, $sql)) {
$_SESSION['message'] = $message;
header("location: posts.php");
exit(0);
}
}

Acest lucru permite utilizatorului (admin) să publice / sau să anuleze o postare.

Aici se termina seria de 4 tutoriale pentru crearea unui blog.

Iată câteva capturi de ecran din proiect:

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