Esercitazione su Fondamenti di PHP
- Sintassi di Base
- Strutture di Controllo
- Funzioni
- Variabili e Tipi di Dati
- Array e Cicli
Esercizio
Creare una funzione in PHP chiamata calcolaSomma, che accetta due parametri numerici e ritorna la loro somma.
Utilizzare la struttura di controllo if all’interno della funzione per verificare che i parametri passati siano effettivamente numeri. Se uno dei due parametri non è un numero, la funzione dovrà ritornare il messaggio “Input non valido“.
Infine, creare un array di numeri e utilizzare un ciclo foreach per sommare tutti gli elementi dell’array utilizzando la funzione creata in precedenza.
Soluzione
<?php
function calcolaSomma($a, $b) {
if (is_numeric($a) && is_numeric($b)) {
return $a + $b;
} else {
return "Input non valido";
}
}
$numeri = array(1, 2, 3, 4, 5);
$somma = 0;
foreach ($numeri as $numero) {
$somma = calcolaSomma($somma, $numero);
}
echo "La somma dei numeri nell'array è: " . $somma;
?>
In questo esercizio:
- Creiamo una funzione
calcolaSommache prende due parametri e, usando una struttura di controlloif, verifica che siano numeri prima di sommarli. - Creiamo un array
$numericontenente alcuni valori numerici. - Utilizziamo un ciclo
foreachper passare attraverso ogni elemento dell’array$numeri, e sommiamo ogni elemento all’accumulatore$sommausando la funzionecalcolaSomma. - Infine, stampiamo il risultato con
echo.
Esercitazione su OOP in PHP
- Creazione di Classi e Oggetti
- Ereditarietà
- Polimorfismo
- Incapsulamento
- Costruttori e Distruttori
Esercizio
Creare una classe chiamata Persona con le seguenti proprietà: nome, cognome, e età.
Implementare un costruttore che prenda tre parametri per inizializzare le proprietà dell’oggetto.
Creare una sottoclasse chiamata Studente che erediti da Persona e abbia una proprietà aggiuntiva: corsoDiStudi.
Implementare il polimorfismo creando un metodo chiamato presentati() in entrambe le classi, che per la Persona restituisce una stringa del tipo “Sono Mario Rossi e ho 35 anni”, mentre per lo Studente “Sono Mario Rossi, ho 20 anni e studio Ingegneria”.
Utilizzare l’incapsulamento per proteggere la proprietà età in modo che possa essere impostata solo attraverso un metodo che preveda il controllo che l’età sia un valore positivo.
Soluzione
<?php
class Persona {
protected $nome;
protected $cognome;
protected $eta;
public function __construct($nome, $cognome, $eta) {
$this->nome = $nome;
$this->cognome = $cognome;
$this->setEta($eta);
}
protected function setEta($eta) {
if ($eta > 0) {
$this->eta = $eta;
}
}
public function presentati() {
return "Sono " . $this->nome . " " . $this->cognome . " e ho " . $this->eta . " anni";
}
}
class Studente extends Persona {
private $corsoDiStudi;
public function __construct($nome, $cognome, $eta, $corsoDiStudi) {
parent::__construct($nome, $cognome, $eta);
$this->corsoDiStudi = $corsoDiStudi;
}
public function presentati() {
return "Sono " . $this->nome . " " . $this->cognome . ", ho " . $this->eta . " anni e studio " . $this->corsoDiStudi;
}
}
// Esempio di utilizzo
$persona = new Persona("Mario", "Rossi", 35);
echo $persona->presentati(); // Output: Sono Mario Rossi e ho 35 anni
$studente = new Studente("Luca", "Bianchi", 20, "Ingegneria");
echo $studente->presentati(); // Output: Sono Luca Bianchi, ho 20 anni e studio Ingegneria
?>
In questo esercizio:
- Creiamo una classe
Personacon le proprietànome,cognomeeetà, e un costruttore per inizializzarle. La proprietàetàè protetta attraverso l’incapsulamento ed è impostata solo attraverso un metodo che controlla che il valore sia positivo. - Creiamo una sottoclasse
Studenteche estendePersonae aggiunge una nuova proprietàcorsoDiStudi. - Implementiamo il polimorfismo attraverso il metodo
presentati()in entrambe le classi, che restituisce una stringa di presentazione differente perPersonaeStudente. - Infine, presentiamo un esempio di utilizzo delle classi create.
Esercitazione su Interazione con il Database in PHP
- Connessione a MySQL con PDO
- Esecuzione di Query SQL
- Prepared Statements
- CRUD (Create, Read, Update, Delete)
Esercizio
Creare una semplice applicazione PHP per gestire un elenco di studenti in un database. Ogni studente ha un ID, un nome, un cognome e un indirizzo email. L’applicazione deve permettere di:
- Creare un nuovo studente (INSERT)
- Leggere l’elenco degli studenti dal database (SELECT)
- Aggiornare le informazioni di uno studente esistente (UPDATE)
- Eliminare uno studente dal database (DELETE)
Utilizzare PDO per connettersi a un database MySQL e eseguire le query SQL necessarie. Inoltre, assicurarsi di utilizzare Prepared Statements per evitare SQL Injection.
Soluzione
<?php
try {
$pdo = new PDO('mysql:host=localhost;dbname=studenti', 'root', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die('Connection failed: ' . $e->getMessage());
}
// CREATE
function createStudent($nome, $cognome, $email) {
global $pdo;
$stmt = $pdo->prepare('INSERT INTO studenti (nome, cognome, email) VALUES (:nome, :cognome, :email)');
$stmt->execute([':nome' => $nome, ':cognome' => $cognome, ':email' => $email]);
}
// READ
function getStudents() {
global $pdo;
$stmt = $pdo->query('SELECT * FROM studenti');
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
// UPDATE
function updateStudent($id, $nome, $cognome, $email) {
global $pdo;
$stmt = $pdo->prepare('UPDATE studenti SET nome = :nome, cognome = :cognome, email = :email WHERE id = :id');
$stmt->execute([':id' => $id, ':nome' => $nome, ':cognome' => $cognome, ':email' => $email]);
}
// DELETE
function deleteStudent($id) {
global $pdo;
$stmt = $pdo->prepare('DELETE FROM studenti WHERE id = :id');
$stmt->execute([':id' => $id]);
}
// Example Usage
createStudent('Mario', 'Rossi', 'mario.rossi@example.com');
$students = getStudents();
updateStudent(1, 'Mario', 'Rossini', 'mario.rossini@example.com');
deleteStudent(2);
?>
In questa esercitazione:
- Creiamo una connessione al database
studentiutilizzando la classePDOdi PHP. - Definiamo quattro funzioni, una per ogni operazione CRUD:
createStudent($nome, $cognome, $email): Inserisce un nuovo studente nel database.getStudents(): Legge e restituisce tutti gli studenti presenti nel database.updateStudent($id, $nome, $cognome, $email): Aggiorna le informazioni di uno studente esistente nel database.deleteStudent($id): Rimuove uno studente dal database.
- Tutte le query SQL sono eseguite utilizzando prepared statements per evitare attacchi di SQL Injection.
- Infine, presentiamo un esempio di utilizzo delle funzioni create.
Esercitazione su Gestione dei Form in PHP
- Creazione di Form HTML
- Gestione dei Dati Inviati via POST o GET
- Validazione dei Dati Inseriti
- Upload di File
Esercizio
Creare un form HTML che permetta all’utente di inserire il proprio nome, cognome, indirizzo email e caricare una foto profilo. Il form deve essere inviato al server utilizzando il metodo POST. Sul server, il codice PHP dovrà:
- Validare che tutti i campi siano stati compilati
- Validare che l’indirizzo email sia in un formato valido
- Validare che il file caricato sia un’immagine e non superi una dimensione di 2MB
- Se tutte le validazioni passano, salvare l’immagine in una cartella e memorizzare i dati dell’utente in un file di testo
Soluzione
<!-- Form HTML -->
<form action="upload.php" method="post" enctype="multipart/form-data">
Nome: <input type="text" name="nome" /><br>
Cognome: <input type="text" name="cognome" /><br>
Email: <input type="email" name="email" /><br>
Foto Profilo: <input type="file" name="foto" /><br>
<input type="submit" value="Invia" />
</form>
<?php
// upload.php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$nome = $_POST['nome'];
$cognome = $_POST['cognome'];
$email = $_POST['email'];
$foto = $_FILES['foto'];
if (empty($nome) || empty($cognome) || empty($email) || empty($foto)) {
echo "Tutti i campi sono obbligatori.";
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo "Formato email non valido.";
} elseif ($foto['size'] > 2000000 || !in_array($foto['type'], ['image/jpeg', 'image/png', 'image/gif'])) {
echo "Il file deve essere un'immagine di dimensioni inferiori a 2MB.";
} else {
move_uploaded_file($foto['tmp_name'], 'uploads/' . $foto['name']);
$data = "Nome: $nome, Cognome: $cognome, Email: $email, Foto: " . $foto['name'] . "\n";
file_put_contents('utenti.txt', $data, FILE_APPEND);
echo "Dati salvati correttamente.";
}
}
?>
In questa esercitazione:
- Creiamo un form HTML con campi per il nome, cognome, indirizzo email e un campo per caricare una foto profilo. Questo form invierà i dati al file
upload.phputilizzando il metodo POST. - Nel file
upload.php, il codice PHP riceve i dati inviati via POST e valida che tutti i campi siano stati compilati, che l’indirizzo email sia in un formato valido e che il file caricato sia un’immagine con una dimensione non superiore a 2MB. - Se tutte le validazioni passano, il file immagine viene salvato in una cartella denominata
uploads(è necessario assicurarsi che questa cartella esista e sia scrivibile) e i dati dell’utente vengono memorizzati in un file di testoutenti.txt. - In caso contrario, viene visualizzato un messaggio di errore appropriato.
Esercitazione su Sessioni e Cookies in PHP
- Inizializzazione di una Sessione
- Creazione e Lettura di Cookies
- Autenticazione Utente
Esercizio
Creare un sistema di autenticazione utente che fa uso di sessioni e cookies.
- Creare una pagina di login dove l’utente può inserire username e password.
- Se l’utente è autenticato con successo, inizializzare una sessione e creare un cookie che memorizza il suo username.
- Se l’utente ritorna al sito e ha il cookie, dovrebbe essere riconosciuto e non necessitare di loggarsi nuovamente.
- Creare una pagina di logout che distrugge la sessione e cancella il cookie.
Soluzione
<?php
// login.php
session_start();
if (isset($_POST['username']) && isset($_POST['password'])) {
$username = $_POST['username'];
$password = $_POST['password'];
// Simuliamo un controllo con username e password statici
if ($username == 'admin' && $password == 'admin') {
$_SESSION['user'] = $username;
setcookie('username', $username, time() + (86400 * 30), "/");
header('Location: welcome.php');
} else {
echo "<h4>Credenziali non valide</h4>";
}
}
?>
<!-- Form di login -->
<form action="" method="post">
Username: <input type="text" name="username" /><br />
Password: <input type="password" name="password" /><br />
<input type="submit" value="Login" />
</form>
<?php
// welcome.php
session_start();
if (isset($_SESSION['user']) || isset($_COOKIE['username'])) {
echo "<h4>Benvenuto, " . (isset($_COOKIE['username']) ? $_COOKIE['username'] : $_SESSION['user']) . "!</h4>";
echo '<a href="logout.php">Logout</a>';
} else {
header('Location: login.php');
}
?>
<?php
// logout.php
session_start();
// Distruggi la sessione
session_destroy();
// Cancella il cookie
setcookie('username', '', time() - 3600, '/');
// Reindirizza alla pagina di login
header('Location: login.php');
?>
In questa esercitazione:
- Creiamo una semplice pagina di login con un form per l’inserimento di username e password. Per semplicità, stiamo utilizzando credenziali statiche (‘admin’, ‘admin’) come esempio di verifica.
- Se l’utente viene autenticato con successo, inizializziamo una sessione e creiamo un cookie che memorizza il suo username.
- Creiamo una pagina welcome.php che verifica se l’utente è loggato tramite sessione o cookie. Se lo è, viene mostrato un messaggio di benvenuto; altrimenti, viene reindirizzato alla pagina di login.
- Infine, creiamo una pagina logout.php che distrugge la sessione e cancella il cookie, quindi reindirizza l’utente alla pagina di login.
Esercitazione su File Handling ed Error Handling in PHP
- Lettura e Scrittura di File
- Manipolazione dei File e delle Directory
- Gestione degli Errori
Esercizio
Creare uno script PHP che faccia il seguente:
- Creare un nuovo file chiamato data.txt se non esiste già.
- Scrive nel file i dati: “Nome: John, Età: 25”.
- Legge il file e stampa il contenuto.
- Rinomina il file in updated_data.txt.
- Mostra un messaggio di errore personalizzato se il file non può essere letto.
Soluzione
<?php
// Step 1: Creare un nuovo file chiamato "data.txt" se non esiste già.
$filename = "data.txt";
if (!file_exists($filename)) {
$file = fopen($filename, "w");
fclose($file);
}
// Step 2: Scrive nel file i dati: "Nome: John, Età: 25".
file_put_contents($filename, "Nome: John, Età: 25");
// Step 3: Legge il file e stampa il contenuto.
if (is_readable($filename)) {
$content = file_get_contents($filename);
echo "Contenuto del file: " . $content . "<br>";
} else {
die("Errore: il file $filename non può essere letto.<br>");
}
// Step 4: Rinomina il file in "updated_data.txt".
$newFilename = "updated_data.txt";
if (rename($filename, $newFilename)) {
echo "Il file è stato rinominato con successo in $newFilename.<br>";
} else {
echo "Errore durante il tentativo di rinominare il file.<br>";
}
// Step 5: Mostra un messaggio di errore personalizzato se il file non può essere letto.
set_error_handler(function($errno, $errstr) {
echo "Errore personalizzato: [$errno] $errstr<br>";
});
// Creiamo un errore per dimostrazione
fopen("file_inesistente.txt", "r");
?>
In questa esercitazione:
- Nello Step 1, lo script verifica se un file chiamato “data.txt” esiste. Se non esiste, lo crea.
- Nello Step 2, lo script scrive la stringa “Nome: John, Età: 25” nel file “data.txt”.
- Nello Step 3, lo script tenta di leggere il contenuto del file “data.txt”. Se il file è leggibile, stampa il contenuto; altrimenti, stampa un messaggio di errore.
- Nello Step 4, lo script rinomina il file “data.txt” in “updated_data.txt“.
- Nello Step 5, definiamo una funzione di gestione degli errori personalizzata con
set_error_handler. Per dimostrare questo, abbiamo simulato un errore cercando di aprire un file inesistente, il che attiverà il gestore di errori personalizzato.
Esercitazione su Uso di Composer in PHP
- Installazione di Composer
- Gestione delle Dipendenze
- Autoloading delle Classi
Esercizio
Creare uno script PHP che faccia il seguente:
- Installare Composer sul proprio sistema se non è già installato.
- Creare un nuovo progetto PHP e inizializzare Composer.
- Aggiungere una dipendenza a guzzlehttp/guzzle usando Composer.
- Utilizzare l’Autoloading di Composer per includere le classi nel tuo progetto.
- Creare una classe HttpClient che usa Guzzle per fare una semplice richiesta GET a https://jsonplaceholder.typicode.com/posts/1 e stampare la risposta.
Soluzione
Seguire i seguenti passaggi per risolvere l’esercizio:
# Step 1: Installazione di Composer
# Visita il sito ufficiale di Composer per le istruzioni di installazione:
# https://getcomposer.org/download/
# Step 2: Creare un nuovo progetto PHP e inizializzare Composer
mkdir mio_progetto
cd mio_progetto
composer init
# Step 3: Aggiungere una dipendenza a guzzlehttp/guzzle usando Composer
composer require guzzlehttp/guzzle
# Step 4: Utilizzare l'Autoloading di Composer per includere le classi nel tuo progetto
# Composer genera automaticamente il file di autoloading. Dovete solo includerlo nel vostro script PHP:
require 'vendor/autoload.php';
# Step 5: Creare una classe HttpClient che usa Guzzle per fare una semplice richiesta GET
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
class HttpClient {
private $client;
public function __construct() {
$this->client = new Client();
}
public function fetchPost($id) {
$response = $this->client->get("https://jsonplaceholder.typicode.com/posts/{$id}");
return json_decode($response->getBody(), true);
}
}
// Uso della classe HttpClient per fare una richiesta GET
$httpClient = new HttpClient();
$post = $httpClient->fetchPost(1);
print_r($post);
?>
In questa soluzione, nello Step 1, l’utente è guidato alla pagina di download di Composer per istruzioni dettagliate.
Da Step 2 a Step 5, abbiamo un esempio concreto che mostra come creare un nuovo progetto PHP, inizializzare Composer, gestire le dipendenze, usare l’autoloading di Composer e creare una semplice classe per effettuare richieste HTTP utilizzando la libreria Guzzle.
Esercitazione su Testing in PHP
- Introduzione a PHPUnit
- Scrittura e Esecuzione di Test Unitari
Esercizio
Creare una classe chiamata Calculator che ha i metodi per addizione, sottrazione, moltiplicazione e divisione. Scrivere test unitari per questa classe utilizzando PHPUnit per assicurarsi che i metodi funzionino come previsto.
- Installare PHPUnit nel proprio progetto.
- Creare la classe Calculator con i seguenti metodi:
add,subtract,multiply, edivide. - Scrivere test unitari per la classe Calculator utilizzando PHPUnit.
- Eseguire i test unitari e verificare che tutti passino.
Soluzione
Seguire i seguenti passaggi per risolvere l’esercizio:
# Step 1: Installazione di PHPUnit
# Installare PHPUnit tramite Composer:
composer require --dev phpunit/phpunit
# Step 2: Creare la classe Calculator
# Creare un file chiamato Calculator.php e inserire il seguente codice:
<?php
class Calculator {
public function add($a, $b) {
return $a + $b;
}
public function subtract($a, $b) {
return $a - $b;
}
public function multiply($a, $b) {
return $a * $b;
}
public function divide($a, $b) {
if ($b == 0) {
throw new \InvalidArgumentException("Divider cannot be zero");
}
return $a / $b;
}
}
?>
# Step 3: Scrivere test unitari per la classe Calculator
# Creare un file chiamato CalculatorTest.php e inserire il seguente codice:
<?php
use PHPUnit\Framework\TestCase;
class CalculatorTest extends TestCase {
public function testAdd() {
$calculator = new Calculator();
$this->assertEquals(5, $calculator->add(2, 3));
}
public function testSubtract() {
$calculator = new Calculator();
$this->assertEquals(1, $calculator->subtract(3, 2));
}
public function testMultiply() {
$calculator = new Calculator();
$this->assertEquals(6, $calculator->multiply(2, 3));
}
public function testDivide() {
$calculator = new Calculator();
$this->assertEquals(2, $calculator->divide(6, 3));
}
public function testDivideByZero() {
$this->expectException(\InvalidArgumentException::class);
$calculator = new Calculator();
$calculator->divide(6, 0);
}
}
?>
# Step 4: Eseguire i test unitari e verificare che tutti passino
# Dal terminale, eseguire il seguente comando:
./vendor/bin/phpunit CalculatorTest.php
In questa soluzione:
- Nello Step 1, viene fornito il comando per installare PHPUnit tramite Composer.
- Nello Step 2, è mostrata la creazione della classe Calculator con metodi per addizione, sottrazione, moltiplicazione e divisione.
- Nello Step 3, viene creata una classe di test CalculatorTest che estende la classe base TestCase di PHPUnit, e vengono scritti vari test per la classe Calculator.
- Nello Step 4, viene fornito il comando per eseguire i test unitari attraverso PHPUnit e verificare che tutti passino.