In questa lezione impari a
- scrivere ed eseguire uno script PHP con XAMPP
- inserire PHP dentro una pagina HTML
- usare variabili, tipi di dato e operatori
- lavorare con le stringhe e le date
- leggere i messaggi di errore di PHP
PHP è un linguaggio che gira sul server: Apache esegue il codice e al browser arriva solo il risultato, cioè HTML (lezione 1). Lo usa una grossa fetta dei siti del mondo, da WordPress a Wikipedia. È facile da iniziare e si integra benissimo con MySQL.
Il primo script
Nella cartella C:\xampp\htdocs crea la cartella corso: lì metterai tutti gli esercizi. Dentro crea il file ciao.php con Visual Studio Code:
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<title>Primo script</title>
</head>
<body>
<h1>Biblioteca scolastica</h1>
<p>Oggi è il <?php echo date('d/m/Y'); ?>.</p>
<p>Sono le ore <?= date('H:i') ?>.</p>
</body>
</html>
Apri http://localhost/corso/ciao.php (XAMPP deve avere Apache avviato). Vedrai la data di oggi. Ora fai Visualizza sorgente: al posto del PHP c'è solo il testo prodotto, Oggi è il 04/10/2026.
- Il codice PHP sta tra
<?phpe?>. Tutto quello che è fuori viene mandato al browser così com'è. echoscrive nella pagina.<?= … ?>è la forma corta di<?php echo … ?>: comodissima dentro l'HTML.- Ogni istruzione finisce con il punto e virgola
;.
Un file che contiene solo PHP inizia con <?php e di solito non si chiude con ?>: così si evita di mandare per sbaglio spazi o righe vuote al browser.
Se l'ora è sbagliata di una o due ore, PHP usa il fuso orario sbagliato. Si sistema con
date_default_timezone_set('Europe/Rome');all'inizio dello script, oppure una volta per tutte nel filephp.inidi XAMPP (date.timezone=Europe/Rome).
Variabili
<?php
$titolo = 'Se questo è un uomo';
$anno = 1947;
$copie = 4;
$disponibile = true;
$prezzo = 12.50;
echo $titolo;
- Le variabili iniziano sempre con il dollaro
$. - Non si dichiara il tipo: PHP lo capisce dal valore (è un linguaggio a tipizzazione dinamica).
- I nomi distinguono maiuscole e minuscole:
$annoe$Annosono due variabili diverse.
I tipi di dato
| Tipo | Esempio | Note |
|---|---|---|
string |
'Primo Levi' |
testo |
int |
1947 |
numero intero |
float |
12.5 |
numero decimale (si scrive con il punto) |
bool |
true, false |
vero o falso |
array |
['Calvino', 'Levi'] |
elenco di valori (lezione 8) |
null |
null |
nessun valore: è quello che arriva da una colonna NULL del database |
Per vedere tipo e contenuto di una variabile, mentre si sviluppa, c'è var_dump:
<?php
$anno = 1947;
var_dump($anno); // int(1947)
var_dump('1947'); // string(4) "1947"
var_dump(3 > 2); // bool(true)
I commenti si scrivono con
//(fino alla fine della riga) oppure/* ... */(su più righe).
Stringhe
Le stringhe si scrivono tra apici singoli o doppi, e la differenza conta:
<?php
$nome = 'Giulia';
echo 'Ciao $nome'; // Ciao $nome (apici singoli: tutto è testo)
echo "Ciao $nome"; // Ciao Giulia (apici doppi: le variabili vengono sostituite)
echo 'Ciao ' . $nome; // Ciao Giulia (il punto unisce le stringhe)
- Il punto
.è l'operatore di concatenazione (in altri linguaggi è il+). .=aggiunge in fondo:$html .= '<li>...</li>';.- Negli apici doppi, per una variabile "attaccata" ad altro testo o per un elemento di array si usano le graffe:
"{$libro['titolo']}".
Alcune funzioni utili:
| Funzione | Risultato |
|---|---|
strlen($s) |
lunghezza in byte (le lettere accentate contano 2: per i caratteri usa mb_strlen) |
strtoupper($s), strtolower($s) |
maiuscolo, minuscolo (per le accentate: mb_strtoupper) |
trim($s) |
toglie gli spazi all'inizio e alla fine: fondamentale per i dati dei form |
str_contains($s, 'x') |
true se $s contiene x (PHP 8) |
str_replace('a', 'b', $s) |
sostituisce |
substr($s, 0, 10) |
i primi 10 caratteri |
ucfirst($s) |
prima lettera maiuscola |
number_format(1234.5, 2, ',', '.') |
1.234,50, numero all'italiana |
Operatori
<?php
$copie = 4;
$fuori = 3;
$disponibili = $copie - $fuori; // 1
$media = 35 / 14; // 2.5
$resto = 10 % 3; // 1 (resto della divisione)
$copie++; // ora vale 5
$copie += 2; // ora vale 7
I confronti restituiscono true o false:
| Operatore | Significato |
|---|---|
== |
uguale nel valore ('5' == 5 è vero) |
=== |
uguale nel valore e nel tipo ('5' === 5 è falso) |
!=, !== |
diverso, diverso nel valore o nel tipo |
<, >, <=, >= |
minore, maggiore… |
&& (o and), || (o or), ! |
e, o, non |
Usa sempre
===e!==: i confronti "larghi" di PHP riservano sorprese (0 == 'abc'era vero fino a PHP 7). Con il triplo uguale sai esattamente cosa stai confrontando.
L'operatore ?? (null coalescing) dà un valore di riserva quando una variabile non esiste o è null. Lo useremo di continuo con i form:
<?php
$nazionalita = null;
echo $nazionalita ?? 'non indicata'; // non indicata
Date
Le date dal database arrivano come stringhe '2026-09-25'. Per mostrarle all'italiana:
<?php
$data = '2026-09-25';
echo date('d/m/Y', strtotime($data)); // 25/09/2026
// la scadenza a 30 giorni
echo date('d/m/Y', strtotime($data . ' +30 days')); // 25/10/2026
strtotime trasforma una data in un numero (i secondi dal 1° gennaio 1970); date la riformatta. I simboli principali: d giorno, m mese, Y anno a 4 cifre, H ore, i minuti.
Quando qualcosa va storto
PHP segnala gli errori nella pagina, con il numero di riga:
Parse error: syntax error, unexpected identifier "echo" in C:\xampp\htdocs\corso\prova.php on line 4
- Parse error: errore di scrittura. Spesso manca il
;alla fine della riga precedente a quella indicata, o una parentesi o un apice. - Warning: Undefined variable $nme: hai scritto male il nome di una variabile. Lo script continua, ma il valore è vuoto.
- Fatal error: Uncaught Error: Call to undefined function: funzione inesistente o scritta male. Lo script si ferma.
Su XAMPP gli errori sono visibili, ed è giusto: servono per correggere. Su un sito pubblico invece vanno nascosti (
display_errors = Off), perché rivelano percorsi e dettagli utili a un attaccante.
Esercizi
Esercizio 1 – Scheda del libro. Crea scheda.php con le variabili $titolo, $autore, $anno e $copie di un libro a tua scelta e mostra:
1984 di George Orwell (1949) – 5 copie, pubblicato 77 anni fa.
Gli anni passati si calcolano con l'anno corrente, date('Y').
Mostra la soluzione
<?php
$titolo = '1984';
$autore = 'George Orwell';
$anno = 1949;
$copie = 5;
$anni_fa = date('Y') - $anno;
?>
<!DOCTYPE html>
<html lang="it">
<head><meta charset="UTF-8"><title><?= $titolo ?></title></head>
<body>
<p><strong><?= $titolo ?></strong> di <?= $autore ?> (<?= $anno ?>) –
<?= $copie ?> copie, pubblicato <?= $anni_fa ?> anni fa.</p>
</body>
</html>
Il calcolo sta in cima, nel PHP; l'HTML sotto si limita a mostrare i valori con <?= ?>. Tenere separati calcoli e presentazione rende il file molto più leggibile.
Esercizio 2 – Prevedi l'output. Senza eseguire il codice, scrivi cosa stampa ogni echo. Poi verifica.
<?php
$a = '10';
$b = 3;
echo $a . $b, '<br>';
echo $a + $b, '<br>';
echo "Totale: $a$b", '<br>';
echo 'Totale: $a', '<br>';
echo $a == 10 ? 'uguale' : 'diverso', '<br>';
echo $a === 10 ? 'identico' : 'non identico';
Mostra la soluzione
103
13
Totale: 103
Totale: $a
uguale
non identico
- Il
.unisce come testo:'10'e3diventano103. - Il
+fa la somma: PHP converte'10'in numero,13. - Negli apici doppi le variabili si sostituiscono, nei singoli no.
'10' == 10è vero (stesso valore),'10' === 10è falso (una è stringa, l'altro intero).condizione ? a : bè l'operatore ternario: unifin una riga.echoaccetta più valori separati da virgole.
Esercizio 3 – Il prestito. Dato $data_prestito = '2026-09-20', mostra la data del prestito e la scadenza (30 giorni dopo) in formato italiano, e quanti giorni mancano alla scadenza a partire da oggi. Suggerimento: la differenza tra due strtotime è in secondi; un giorno ha 86400 secondi.
Mostra la soluzione
<?php
$data_prestito = '2026-09-20';
$scadenza = strtotime($data_prestito . ' +30 days');
$giorni = (int) floor(($scadenza - strtotime('today')) / 86400);
echo 'Prestito: ' . date('d/m/Y', strtotime($data_prestito)) . '<br>';
echo 'Scadenza: ' . date('d/m/Y', $scadenza) . '<br>';
if ($giorni >= 0) {
echo "Mancano $giorni giorni.";
} else {
echo 'In ritardo di ' . -$giorni . ' giorni!';
}
La scadenza è il 20/10/2026. strtotime('today') è la mezzanotte di oggi, così il conto non dipende dall'ora. (int) trasforma il risultato in intero. L'if lo vediamo per bene nella prossima lezione.