In aceast tutorial puteti invata cum sa creati un site de la zero, care foloseste si baza de date MySQL. Trebuie sa aveti cel putin cunostintele de baza despre PHP, MySQL, HTML si CSS.
Datele despre numele paginilor, titlu, cuvinte cheie si descriere vor fi stocate intr-un tabel dintr-o baza de date MySQL, iar continutul fiecarei pagini va fi salvat in fisiere intr-un director pe server.
Toate aceste date vor putea fi adaugate sau stere dintr-o pagina de administrare.
Acest sistem de script pentru site se mai numeste si CMS, acronim de la Content Management System, o colectie de proceduri prin care continutul, paginile site-ului, pot fi adaugate, sterse si modificate automat dintr-o pagina de administrare.
Exemplul din aceast tutorial este un fel de CMS mai simplu, care da posibilitatea de a adauga in site: categorii, meniuri si continut, precum si stergerea lor din pagina de Admin. Pentru a nu complica prea mult scriptul si necesitatea explicatiilor, nu am adaugat si o procedura de modificare. Ideea fiind sa puteti invata esentialul in modul de creare a unui site cu PHP si MySQL. Continutul paginilor il puteti apoi modifica din fisierele in care a fost salvat.
Accentul este pus pe partea de programare, grafica site-ului pentru modelul prezentat aici o face fiecare. Sistemul permite usor crearea si folosirea unui template HTML
- Scriptul complet il puteti descarca de aici -> Creare site - CMS.
Daca doriti sa invatati cum sa creati un script de site CMS, va sfatuiesc sa cititi cu atentie acest tutorial si sa scrieti personal scriptul din fiecare fisier, dupa codul prezentat in continuare pentru fiecare. Daca doar vreti sa folositi acest model pentru a-l adapta si dezvolta, descarcati arhiva cu tot scriptul si studiati documentatia din el.
In fisierele scriptului gasiti explicatiile necesare intelegerii fiecarei linii de cod si la ce sunt folosite. In acest tutorial este explicat in mare structura si logica scriptului.
Inainte de a incepe crearea unui site, trebuie stabilita structura acestuia, care consta din 3 elemente principale (daca folosim si baza de date):
- structura tabelului (tabelelor) din baza de date.
- structura fisierelor si directoarelor pe server.
- structura paginii (paginilor) siteului, layout-ul.
Luam pe fiecare in parte.
Pentru exemplu de site, relativ simplu, din aceasa lectie, este folosit un singur tabel MySQL, care are urmatoarele coloane:
- id - o coloana de tip INTEGER AUTO_INCREMENT, care va avea un 'id' (numar) unic pentru fiecare pagina adaugata.
- meniu - unde e inregistrat numele meniurilor principale (categoria careia apartine pagina).
- pagina - pentru numele care-l are fisierul ce contine contextul paginii respective.
- titlu - in care e stocat titlul ce va fi adaugat in sectiunea HEAD, folosit si pt. formarea numelui si URL-ul paginii
- descriere - pentru descrierea din meta-tag "description".
- cuv_key - pentru cuvintele cheie care vor fi adaugate la fiecare pagina in meta-tag "keywords".
- data - pentru inregistrarea datei (in format UNIX) la care sunt adaugate paginile.
La structura de pe server sunt folosite 5 fisiere principale si un director pentru stocarea fisierelor unde va fi salvat continutul fiecarei pagini (vor fi prezentate fiecare mai tarziu).
Structura paginii (layout-ul) este creata in "index.php", cu o configuratie impartita in 3 zone principale:
- Top - unde sunt afisate meniurile principale din site,
- Corp - zona in care sunt afisate: intr-o parte link-urile paginilor din categoria respectiva, si in rest continutul acestora
- Subsol - pentru ce vrem sa apara in partea de jos a site-ului.
Aceasta e pe scurt structura site-ului, in continuare creem pe rand fiecare din aceste elemente.
Partea mai simpla, dar esentiala si foarte importanta la un site care foloseste baze de date e proiectarea si scrierea codului pentru crearea tabelelor in baza de date. Pentru acest proiect, care e simplu in ceea ce priveste structura MySQL, am folosit un singur tabel, cu numele "pagini" ce are coloanele prezentate mai sus.
In directorul radacina al site-ului (www sau httpdocs) creem un fisier php (aici numit "creaza_tabel.php") in care se scrie codul PHP de mai jos, pentru tabelul MySQL (explicatiile necesare sunt in documentatia din cod).
<?php // Include fisierul pt. conectare-selectare baza de date include('admin.php'); // Creaza tabelul pagini, cu coloanele necesare si utilizabil cu formatul UTF-8 $sql ='CREATE TABLE `pagini` (id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, meniu varchar(25), pagina varchar(110), titlu varchar(75), descriere varchar(250), cuv_key varchar(200), data int(10)) CHARACTER SET utf8 COLLATE utf8_general_ci'; // Se verifica executia funtiei pentru transmiterea codului SQL if($conn->query($sql)) echo '<br><br><br><center><h4>Tabelul pagini a fost creat</h4></center><br>'; else echo '<br><br><br><center><h4>Tabelul pagini nu a putut fi creat deoarece - '. $conn->error. '</h4></center>';
Pentru a lucra cu MySQL din PHP, trebuie sa scriem datele pentru conectarea scriptului la baza de date.
Deoarece aceste date trebuie folosite in toate paginile care preiau sau transmit valori la MySQL, le scriem intr-un fisier php separat, aici numit "admin.php", pe care-l vom include (cu include()) unde este necesar.
In acest script de tip CMS vom avea nevoie de inca 2 fisiere principale: unul pentru partea de administrare (adaugare, stergere pagini) si altul pentru afisarea continutului. Ambele vor lucra cu baza de date si numele meniurilor.
Pentru a nu crea de mai multe ori aceeasi functie in fisiere diferite, folosim "admin.php", pe care oricum il includem in celelalte fisiere din script, si scriem in el si alte date sau functii generale, precum cele de filtrare, pe care va trebui sa le folosim in fisiere separate. Astfel, codul comun folosit in scripturile din ele il vom scrie cat mai simplu, o singura data, in "admin.php", unde in total adaugam:
- datele pentru conectarea si selectarea bazei de date, numele si parola pentru accesul la functiile paginii de admin (prezentata in partea a doua a tutorialului), o functie pentru selectarea meniurilor principale din tabelul MySQL, deoarece numele meniurilor vor fi necesare atat in fisierul care afiseaza paginile din site cat si in cel de administrare, o functie pentru filtrarea datelor care lucreaza cu MySQL si alta care va fi folosita pentru definirea numelor paginilor din site, utilizate si in crearea link-urilor.
Codul PHP ce trebui scris in "admin.php" e urmatorul.
<?php // De la https://marplo.net/php-mysql/ // Datele pt. autentuificare Administrator $admin ='admin'; $pass ='pass'; // Numele directorrului unde sunt incarcate paginile $dir ='pagini'; // Seteaza extensia folosita pt. fisierele in care sunt salvate contextul paginilor $ext ='.htm'; // Modificati datele pt. conectare la baza de date $host ='localhost'; $utilizator ='root'; $parola ='parola'; $numebd ='nume_bd'; // Seteaza posibilitatea lucrului cu sesiuni session_start(); // Seteaza utilizarea formatului UTF-8 in pagina header('Content-type: text/html; charset=utf-8'); // Conectarea la baza de date $conn = new mysqli($host, $utilizator, $parola, $numebd); if(!$conn) exit('Conectare nereusita la MySQL'); //seteaza conexiunea pt utf-8 $conn->query('SET character_set_client="utf8",character_set_connection="utf8",character_set_results="utf8";'); /*** Functii necesare ***/ // Functia pt. filtrarea variabilelor folosite in lucru cu MySQL function filtr_sql($var){ GLOBAL $conn; // Se verifica daca magic_quotes_gpc() este setat ON // Daca e ON, se aplica stripslashes() variabilei $var, pentru a nu se adauga de 2 ori '\' if(get_magic_quotes_gpc()) { $var = stripslashes($var); } return $conn->real_escape_string($var); } // Functia care preia din MySQL meniurile principale ale site-ului function get_meniu(){ GLOBAL $conn; // Selecteaza coloanele in care numele meniului e acelasi cu numele paginii // Apoi adauga numele meniurilor intr-o variabila tip array $q ='SELECT `meniu` FROM `pagini` WHERE `meniu`=`pagina`'; $result = $conn->query($q); if($result->num_rows ==0) $menu = false; else { $menu = array(); // Elimina caracterele '\' care au fost adaugate de real_escape_string() while($rand = $result->fetch_assoc()){ $menu[] = stripslashes($rand['meniu']); } } return $menu; } // Functia pt filtrarea sirurilor folosite la numele meniurilor sau paginilor // Utilizate la crearea numelor fisierelor si a link-urilor function filtrare($sir){ // Inspirat de la www.tutoriale.far-php.ro // Se converteste numele in litere mici si se scot spatiile de la inceput si sfarsit $sir = trim(strtolower($sir)); // Un array cu lista caracterelor care se inlocuiesc $lista_car = array( 'ă' => 'a', 'î' => 'i', 'â' => 'a', 'ş' => 's', 'ţ' => 't', 'Ă' => 'a', 'Î' => 'i', 'Â' => 'a', 'Ş' => 's', 'Ţ' => 't', 'ã' => 'a', 'â' => 'a', 'é' => 'e', 'î' => 'i', 'í' => 'i', 'n' => 'n', 'ó' => 'o', 's' => 's', '?' => 't', 'ú' => 'u', '-' => '_', ' _ ' => '_', ' _' => '_', '_ ' => '_', ' ' => '_' ); // Se inlocuiesc caracterele de mai sus, parcurgand fiecare element din matrice foreach($lista_car as $litera=>$inlocuire) $sir = str_replace($litera, $inlocuire, $sir); // Pastreaza in sir doar caracterele din expresia regulata (adica litere, cifre si _) $sir = preg_replace('/([^A-Za-z0-9_])/', '', $sir); // Se returneaza gata aranjat return $sir; }
Deoarece in "admin.php" sunt datele importante pentru conectare la baza de date si autentificare administrator, este indicat sa asiguram o protetie sporita acestui fisier. Pentru aceasta folosim .htaccess ca sa blocam accesul extern la el.
Deschideti un editor simplu de text si scrieti in el codul de ma jos, apoi salvati-l in format ASCII cu denumirea .htaccess, fara alta extensie, in acelasi loc unde e si "admin.php".
# Blocheaza accesul extern la admin.php <files admin.php> order allow,deny deny from all </files>
<ul> <li>http://coursesweb.net/html/</li> <li>http://www.marplo.net/html/</li> </ul>
.some_class { display: list-item; }
var obj = { "courses": ["php", "javascript", "ajax"] }; var jsonstr = JSON.stringify(obj); alert(jsonstr); // {"courses":["php","javascript","ajax"]}
$strhtml = '<body><div id="dv1">CoursesWeb.net</div></body>'; $dochtml = new DOMDocument(); $dochtml->loadHTML($strhtml); $elm = $dochtml->getElementById("dv1"); echo $elm->nodeValue; // CoursesWeb.net
I`m living here. - Traiesc /Locuiesc aici.
Estoy viviendo aquí. - Traiesc /Locuiesc aici.