Author Avatar

Fabrizio S.

0

Share post:

Script per creare un Blog con PHP e Database

Inizieremo in questo capitolo a mostrarvi quali sono i passi se volete creare un blog che sia tutto vostro, insomma vi offriamo la possibilità di scrivere il codice sorgente di un blog dalla prima all’ultima riga. Ovviamente sappiamo benissimo che già oggi esistono dei CMS come WP che sono altamente configurabili e personalizzabili, ma talune rarissime volte questo non basta e ci vogliono degli script che siano totalmente configurabili e questo articolo va in questo senso , ossia vi offriamo e vi guidiamo alla creazione di un endoscheletro di un blog che poi voi possiate incrementare a vostra volta.

Ma prima facciamoci alcune domande. La Prima è ovviamente cos’e’ questo blog che vogliamo andare a realizzare?

Un blog è un particolare tipo di CMS , ossia un’applicazione che gira nel web , quindi con delle determinate regole ben stabilite, che implementa l’equivalente di un tradizionale diario.

Nel blog alcuni utenti sono abilitati a scrivere dei messaggi, questi messaggi si chiamano in gergo post, da postare appunto. Tali post hanno quindi un contenuto che viene fatto leggere ai visitatori che si recano a leggere in quel determinato sito.

Ed i problemi a cui andremo incontro per fare questa realizzazione quali sono?

  • I post devono essere memorizzati in un file oppure direttamente in un database, vedremo entrambi gli esempi
  • Gli eventuali commenti dei visitatori devono essere a loro volta memorizzati
  • I post devono essere modificabili, quindi bisogna predisporre degli update.

In conclusione cosa ci server?

 

Beh diciamo alcune conoscenze specifiche di linguaggio PHP, di Mysql, di HTML e di CSS, ma soprattutto ci serve un hosting per potere fare girare il nostro blog. In giro ce ne sono molti gratuiti a cui possiamo tranquillamente chiedere , oppure ovviamente ci sono anche quelli a pagamento anche per pochi euro.

 

L’applicazione sarà costituita da una serie di file e cartelle, inclusi in un’unica directory che chiameremo Crea Blog , ma ovviamente ognuno puo’ mettere il nome che ritiene piu’ opportuno. Ci sarà poi la pagina principale o home page, ossia quella pagina a cui accederà un utente quando arriverà nel nostro blog, che chiameremo indice.php, ci sarà inoltre una pagina per l’inserimento dei post, che chiameremo inserisci.php, una pagina per l’accesso all’archivio complessivo dei post, archivio php e gli ultimi due file saranno uno per le configurazioni config.php e uno per le funzioni ossia funzioni.php

Analizziamo adesso quale sarà la pagina principale del nostro blog che andremo a realizzare, ossia l’indice.

Vi gettiamo a dritto il codice della pagina che è

1<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN”
2″http://www.w3.org/TR/XHTML1/DTD/XHTML1-strict.dtd”>
3<?php
4require(“config.php”);
5require(“funzioni.php”);
6?>
7<html>
8<head>
9<title><?php echo $TITOLO; ?></title>
10<link rel=”stylesheet” type=”text/css” href=”stile.php” />
11</head>
12<body>
13<div id=”intestazione”>
14<h1><?php echo $TITOLO; ?></h1>
15<h2>di <?php echo $UTENTE; ?></h2>
16<div id=”menu”>
17<a href=”indice.php”>Home</a>
18<a href=”inserisci.php”>Inserisci</a>
19<a href=”archivio.php”>Archivio</a>
20</div>
21</div>
22<div id=”blog”>
23<?php
24$contenuto = leggi(1, 5); // (* \label{line:PHP_chiamata-leggi} *)

i26f (count($contenuto) > 0) {
27foreach ($contenuto as $post) {
28echo “<div class=\”post\”>\n<h3>”, $post[2], “</h3>\n”;
29echo “<p>”, $post[3], “</p>\n”;
30echo “<p class=\”info\”>Pubblicato il: “, $post[1],
31” da “, $UTENTE, “</p>\n</div>\n”;
32}
33}
34?>
35</div>
36<hr/>
37</body>
38</html>

analizziamola in dettaglia cominciando dalla riga 24 dove fa la sua comparsa la funzione leggi, questa funzione verrà definita in seguito in un apposito file , con il compito di restituire un array conentente il numero di post indicati nel suo secondo argomento, a partire da quello che nel blog occupa la posizione identificata dal primo argomento.

Nel caso l’array contenesse dei valori viene eseguita la funzione foreach che ha il compito di scorrere tutti gli elementi dell’array e visualizzarne il contenuto. Tali valori verranno cosi’ di volta in volta passati alla variabile post che è come contenuto un array avente i seguenti campi in rigoroso ordine

 

identificatore ossia un indice crescente

data la data in cui è stato scritto il post

il titolo ossia il titolo che abbiamo dato al post

il contenuto quello che il post contiene al suo interno

 

Per il momento ci fermiamo qui di passo in passo vi verrà tutto piu’ chiaro. Ma prima di terminare vi vogliamo mostrare l’organigramma di quello che stiamo realizzando.

Schema del blog realizzato

 

alla base di tutto sta indice.php che legge i dati archiviati da un archivio che potrà essere un file memorizzato nel nostro server oppure una soluzione piu’ raffinata che potrebbe essere quella di utilizzare un database mysql

.L’Archivio.php richiama i file dal database e li visualizza in indice php, ma archivio.php diciamo che sarà il nostro cuore pulsante del sistema in quanto non si limiterà a fare questo, ma si occuperà anche di prendere i dati da inserisci.php, file che si occuperà della memorizzazione dei file nel database di riferimento. Insomma del resto l’organigramma creato è di per se’ abbastanza esplicativo

 

 

La Pagina di archiviazione dei Post

 

E adesso che abbiamo visto come inserirli i post vediamo anche come sia possibile archiviarli, nel modo piu’ semplice che abbiamo mai visto. Innanzi tutto dobbiamo precisare cosa in realtà sia un archivio. Diciamo che come dice la parola stessa l’archivio è un luogo , in questo caso del web , dove sia possibile trovare contenuti vecchi., in una parola passati.

Vediamo il listato di archivio.php e poi iniziamo a spiegarvelo con un’unica precisazione che è quella che per il momento stiamo considerando di memorizzare il tutto sun un file di testo e non su un database, dopo vi faremo vedere anche come espletare questa seconda funzione.

 

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN”
“http://www.w3.org/TR/XHTML1/DTD/XHTML1-strict.dtd”>
<?php
require(“config.php”);
require(“funzioni.php”);
?>
<html>
<head>
<title><?php echo $TITOLO; ?></title>
<link rel=”stylesheet” type=”text/css” href=”stile.php” />
</head>
<body>
<div id=”intestazione”>
<h1><?php echo $TITOLO; ?></h1>
<h2>di <?php echo $UTENTE; ?></h2>
<div id=”menu”>
<a href=”indice.php”>Home</a>
<a href=”inserisci.php”>Inserisci</a>
<a href=”archivio.php”>Archivio</a>
</div>
</div>

1.
2. <div id=”blog”>
3.<h1>Archivio dei post</h1>
4.<?php
5.$numero = numeroPost();
6.$pagine = ceil($numero / $POSTPERPAGINA);

7.if (!isset($_GET[“pagina”]))
8.$pagina = 1;
9.else
10.$pagina = $_GET[“pagina”];

11.$contenuto = leggi(($pagina – 1) * $POSTPERPAGINA + 1, $POSTPERPAGINA); // (* \label{line:PHP_chiamata-leggi} *)

12.if (count($contenuto) > 0) {
13. foreach ($contenuto as $post) {
14.echo “<div class=\”post\”>\n<h3>”, $post[2], “</h3>\n”;
15.echo “<p>”, $post[3], “</p>\n”;
16.echo “<p class=\”info\”>Pubblicato il: “, $post[1],
17.” da “, $UTENTE, “</p>\n</div>\n”;
18.}
19.}

21.echo “<p>Pagine: “;
22.for ($i = 1; $i <= $pagine; $i++)
23.echo “<a href=\””, $_SERVER[“PHP_SELF”], “?pagina=”, $i, “\”>”,
24.$i, “</a> “;
25.echo “</p>\n”;
26.?>
</div>
<hr/>
</body>
</html>

 

Consideriamo il rigo if (!isset($_GET[“pagina”])) questo rigo in pratica ci fa capire quale pagina da visualizzare è stata richiesta dall’utente, se questo valore non è stato caricato gli verrà asseganto il valore 1 perche’ vorrà dire che l’utente ha semplicemente digitato il link archivio

 

Mentre la variabile $pagine si occuperà di calcolare il contenuto di pagine di cui è costituito l’archivio ( pari al numero totale di post pubblicati diviso per il numero d post visualizzabili su una singola pagina. Di Seguito , la variabile $contenuto viene riempita con i post di contenuto nella pagina specificata nella variabile $pagina e il loro testo viene emesso come nelle pagine d’indice

 

Veniamo a considerare un altro file abbastanza importante il file di configurazione del blog config .php Il File conterrà il nome dell’utente e la password da utilizzare per aggiungere nuovi post, il titolo del blog e informazioni sulla personalizzazione del sito : in qusto esempio , ci limitato a colori e font da usare.

 

<?php
// opzioni di configurazione del blog

// utente
$UTENTE = “lituo nome da Amministratorer”;
$PASSWORD = “segreta”;

// memorizzazione dei post
$BLOGFILE = “db/blog.txt”;

// titolo del blog
$TITOLO = “Blog di Prova”;
// URL del blog
$URL = “http://www.miosito.com”;

// post per pagina
$POSTPERPAGINA = 5;

// colori
$COLSFONDO = “white”;
$COLTESTO = “black”;
$COLINTESTAZIONE = “#99C1FF”;
$COLMENU = “#99C1FF”;
// font
$FONT = “Arial”;
?>

 

Come potete il file di configurazione da alcune informazioni essenziali ossia qual’e’ il nome utente e la relativa password, dove sono memorizzati i post, il titolo del blog, il numero di post da visualizzare per ogni pagina e li eventuali colori dello sfondo, del testo, e dell’intestazione, il font utilizzato è l’arial ovviamente tutti questi parametri sono modificabili a piacimento di colui che scrive il codice.

 

Per la memorizzazione dei post per il momento abbiamo scelto un file di testo con i record a lunghezza variabile, cioè in questo modo ogni post contiene una riga di testo che va a terminare con il carattere a capo automatico che corrisponde al /n, a sua volta all’interno di ogni riga abbiamo introdotto uni carattere di separazione che è il #. In modo tale da separare i campi che costituiscono un post che saranno nell’ordine

  • identificatore id
  • data e ora di creazione
  • titolo
  • contenuto

Effettivamente piu’ che un blog qui siamo andati a creare una sorta di twitter.. Insomma potremmo andare nel nostro file di testo php e trovarci scritto qualcosa del genere

 

1#2009-09-12, 12:23# Questo blog funziona che è una meraviglia# è una cosa fantastica, venite a trovarci, vi aspettiamo numerosi

2#2009-09-13, 15:44# Ciao mondo,# Questo è il mio primo articolo su questo blog.

 

Ovviamente poi nel testo convertiremo i /n con gli xhtml <br>.

La gestione dei post

Questa lezione si articolerà su tre punti o su tre funzione

  • registra
  • leggi
  • numeroPost

con queste tre funzioni sarà possibile gestire tutto il post e andiamo brevemente a mostrarvele per una maggiore comprensione di quello che di fatto siamo andati a fare.

 

Ma iniziamo proprio da utente Valido() questa funzione si limita a verificare che i dati passati come parametri alla funzione ($utente e $password)

 

function utenteValido($utente, $password) {
global $UTENTE, $PASSWORD;
return ($utente == $UTENTE && $password == $PASSWORD);
}

Insomma questa è, vediamo ora la funzione registra, questa funzione dovrà avere principalmente la funzione di leggere il file, scrivere in testa il nuovo post, e poi scrivere il contenuto precedente di seguito.

Questo è il suo codice

 

function registra($titolo, $testo) {
global $BLOGFILE;
$contenuto = file($BLOGFILE); // leggo il contenuto
// creo il nuovo id
$penultimo = explode(“#”, $contenuto[0]);
$ultimo = $penultimo[0] + 1;
$fp = fopen($BLOGFILE, “w”); // apro il file in scrittura
// elimino eventuali caratteri di a capo e entità
// non conformi con HTML
$titolo = rendiConforme($titolo);
$testo = rendiConforme($testo);
// compongo la riga da registrare contenente il nuovo post
$post = $ultimo . “#” . date(“Y-m-d, G:i”)
. “#” . $titolo . “#” . $testo . “\n”;
fwrite($fp, $post); // scrivo il post
if (count($contenuto) > 0) { // se il blog contiene già qualcosa
foreach ($contenuto as $post) {
// riscrivo, di seguito, tutti i post precedenti
fwrite($fp, $post);
}
}

fclose($fp); // chiudo il file
}

Come potete vedere ci siamo procurati di suddividere la funzione in tre parti distinte , la prima parte diciamo che grosso modo rappresenta la parte preparatoria della funzione, nella quale vengono preparati i dati necessari per la composizione del post,: si legge il contenuto del file, si calcola l’identificare dell’ultimo post, si riapre il file per la scrittura ( in questo modo viene cancellato e andrà riscritto) e si utilizza la funzione rendiConforme() per eliminare caratteri non voluti nel titolo e nel testo del post.

 

Ci vogliamo solamente soffermare un attimo sulla funzione explode ma solamente giusto per fare un richiamo.

Supponiamo che in ingresso la funzione explode riceva una stringa del tipo

“1#2009-08-01, 12:22#Ciao Mondo# Ciao come stai io tutto bene e tu

A questo punto la funzione explode separerà la stringa ricevuta in ingresso e produrrà in uscita la seguente stringa

 

[0] => 1

[1] => “2009-08-01”

[2] => Ciao mondo
Insomma ogni volta che trova il separatore che abbiamo introdotto al primo capito questa prende e crea di conseguenza un array. Vi vogliamo mostrare anche la funzione rendiConforme ma solamente perche’ è intrisa di codice php
function rendiConforme($testo) {
$testo = nl2br(htmlentities(stripslashes($testo)));
$testo = str_replace(“\r\n”, “”, $testo); // sistemi windows
$testo = str_replace(“\n”, “”, $testo); // sistemi unix
$testo = str_replace(“\r”, “”, $testo); // sistemi MacOS

return $testo;
}

 

Lo riconoscete? No? allora è meglio che diate una buona ripassata al buon vecchio codice PHP.E veniamo dunque alla funzione piu’ importante e sicuramente la piu’ semplice dell’intero panorama del nostro blog, beh diciamo almeno una delle piu’ semplici. Stiamo parlando della funzione leggi.

 


function leggi($da, $quanti = NULL) {
global $BLOGFILE;
$risultato = array();
$contenuto = file($BLOGFILE); // leggo il contenuto
if (is_null($quanti))
$quanti = count($contenuto);

for ($i = $da; ($i – $da < $quanti) && ($i <= count($contenuto)); $i++) {
// estraggo un post dal file e lo aggiungo all’array $risultato
$post = explode(“#”, $contenuto[$i – 1]); //(* \label{line:PHP_leggi-explode} *)
$risultato[] = $post;
}

return $risultato;
}

è abbastanza auto esplicativa, l’unica nota che vi vogliamo fare tenere presente è la condizione sul ciclo for , che estrae i post specificati dal file. Si osservi che , oltre a verificare che l’indice $i non vada oltre gli $n post a partire dal valore della variabile $da, è necessario anche verificare che esso non vada oltre al numero totale di post contenuti nell’array (istruizione $i <= count($contenuto)

 

ci sarebbe anche da spiegare la funzione numeroPost ma insomma vi abbiamo detto funzione ma è una funzione per modo di dire dato che è

 

function numeroPost() {
global $BLOGFILE;
$blog = file($BLOGFILE);

// restituisco il numero di righe del file
return count($blog);
}

Lo Stile

E veniamo adesso ad occuparci dello stile ossia una mera opera di abbellimento del nostro blog. Insomma qualcosa di molto evitabile ossia se non lo facciamo funziona tutto perfettamente, ma se non lo facciamo dopo una prima visita nessuno ritornerà piu’ a visitarci, quindi nel dubbio, lo facciamo assolutamente.. Il Foglio di stile in genere sono in formato css, infatti sono appunto fogli di stile css, lo sono anche a questo giro che invece abbiamo utilizzato un file php, insomma abbiamo un po’ mascherato il tutto ma il risultato è sempre il solito e il gioco che abbiamo fatto è abbastanza evidente, nel dubbio cmq riconsultare nuovamente la nostra guida sui CSS.

 

<?php
header(“Content-type: text/css”);
include(“config.php”);
?>

body {
background-color: <?php echo $COLSFONDO; ?>;
color: <?php echo $COLTESTO; ?>;
}

#intestazione {
color: <?php echo $COLSFONDO; ?>;
background-color: <?php echo $COLINTESTAZIONE; ?>;
}

#menu {
color: <?php echo $SFONDO; ?>;
background-color: <?php echo $COLMENU; ?>;
float: left;
display: block;
width: 100%;
}

#menu a {
margin: 5px;
color: <?php echo $COLSFONDO; ?>;
font-weight: bold;
}

.post {
border: thin dashed <?php echo $COLMENU; ?>;
padding: 5px;
}

#blog {
width: 600px;
}

il Database

Quello che abbiamo visto fino ad adesso andava bene, anzi benissimo nel senso che funzionava alla perfezione senza pero’ l’ausilio di altri interventi, ma non era assolutamente la soluzione migliore.La soluzione migliore gioco di parole a parte è sicuramente quella che prevede l’utilizzo dei database e siccome stiamo utilizzando il php , il database da utilizzare in questione è sicuramente il mysql. Quindi creiamo nel nostro phpadmin il seguente codice sql

DROP TABLE IF EXISTS posts;

CREATE TABLE posts (
id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
data DATETIME NOT NULL,
titolo VARCHAR(255),
testo TEXT
);

DROP TABLE IF EXISTS utenti;

CREATE TABLE utenti (
utente VARCHAR(20),
password VARCHAR(32)
);

INSERT INTO utenti VALUES (‘CapitanBlogger’, md5(‘segreta’));

 

nella tabella post memorizzeremo i post che andranno ad essere pubblicati nel blog

nella tabella utenti tabella di supporto , utilizzata per contenere i dati di autenticazione dell’utente o di piu’ utenti.

a questo punto pero’ dobbiamo anche modificare alcune funzioni in pratica quella registra e leggi.. Iniziamo con la registra che cosi’ diventa

function registra($titolo, $testo) {
$conn = dbConnect();
$titolo = nl2br(htmlentities($titolo));
$testo = nl2br(htmlentities($testo));
$data = date(“Y-m-d H:i:s”);

$sql = “INSERT INTO posts(data, titolo, testo) VALUES(‘”
. $data . “‘, ‘” . $titolo . “‘, ‘” . $testo . “‘)”;
mysql_query($sql) or die(“Errore nella query: ”
. $sql . “\n” . mysql_error());

mysql_close($conn);
}

 

come potete vedere grazie al mysql è addirittura diventata piu’ semplice della funzione registra antecedente.

la funzione leggi invece diventa


function leggi($da, $quanti = NULL) {
$conn = dbConnect();
$risultato = array();

$sql = “SELECT * FROM posts WHERE id >= ” . $da;
if (!is_null($quanti))
$sql .= ” AND id <= ” . ($da + $quanti);
$sql .= ” ORDER BY data DESC”;
$risposta = mysql_query($sql) or die(“Errore nella query: ”
. $sql . “\n” . mysql_error());

while ($riga = mysql_fetch_row($risposta)) {
$risultato[] = $riga;
}
mysql_close($conn);

return $risultato;
}

e questa è la funzione leggi. mentre la funzione numero post deve essere sostituita con la seguente.

 

function numeroPost() {
$conn = dbConnect();
$sql = “SELECT MAX(id) as numero FROM posts”;
$risposta = mysql_query($sql) or die(“Errore nella query: ”
.
$sql . “\n” . mysql_error());
$numero = mysql_fetch_row($risposta);
mysql_close($conn);

return $numero[0];
}

mentre la funzione di connessione diventa

function dbConnect() {
$conn = mysql_connect(“localhost”, “CapitanBlogger”, “mysql_segreta”)
or die(“Errore nella connessione al db: ” . mysql_error());
mysql_selectdb(“test”)
or die(“Errore nella selezione del db: ” . mysql_error());
return $conn;
}

alla quale ovviamente voi dovrete sostituire i vostri dati, questi sono solo di esempio

non commentiamo piu’ di tanto gli script che ci sembrano veramente molto auto esplicativi, in ogni caso per dubbi o incertezze potete rivolgervi al forum cliccando sull’apposita voce sulla destra, saremo lieti di venire incontro alle vostre esigenze.

 

 

La Conclusione

A questo punto non ci rimane che tirare un po’ le somme del nostro progetto, quindi abbiamo visto come attraverso un po’ di programmazione php e un file di testo oppure un database sia possibile costruire un blog che ovviamente non sarà quello dello wordpress ma sarà cmq un database funzionante e anche con una sua propria grafica. Il tutto insomma funzionale al progetto che avevamo prospettato. La logica o meglio il prospetto seguito è il seguente

 

Organigramma del blog che abbiamo realizzato

Quindi una pagina indice che si scambia i dati con inserisci.php che cicla su stessa quando riceve un metodo post e aggiunge l’articolo ad un sistema di archiviazione che possa essere un file di testo oppure piu’ semplicemente un database. Abbiamo visto come sia inoltre possibile passare con delle semplici istruzioni da un file di testo ad un database mysql e ovviamente abbiamo mostrato qualche funzione mysql piu’ ricercata che ci ha permesso di semplificare le nostre operazione.

Per ogni buon conto potrete trovare il codice shareware qui. Il capitolo è il terzo e la cartella plwblog

 

E con questo concludiamo per chi avesse dubbi o chiarimenti si puo’ recare nel nostro forum e ampliare la discussione con noi, nel caso saremmo lieti di rispondere ai vostri eventuali dubbi o perplessità

Rendere sicuro Wordpress da attacchi Hacker con .htaccess
Bloccare gli spam e gli spammer con i plugins AVH , Captcha e Language comments