Vai al contenuto

PHP: primi passi

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 <?php e ?>. Tutto quello che è fuori viene mandato al browser così com'è.
  • echo scrive 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 file php.ini di 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: $anno e $Anno sono 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' e 3 diventano 103.
  • 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: un if in una riga. echo accetta 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.