## PHP ### Introduzione a PHP PHP (Hypertext Preprocessor) è un linguaggio di scripting lato server ampiamente utilizzato per lo sviluppo web. È incorporato direttamente nei file HTML e viene eseguito sul server, generando contenuti dinamici. **Struttura di Base di un File PHP**: ```php <?php echo "Ciao, mondo!"; ?> ``` ### Variabili in PHP Le variabili in PHP sono prefissate dal simbolo `$` e non hanno bisogno di essere dichiarate con un tipo specifico. **Esempio di variabili**: ```php $nome = "Mario"; $eta = 25; $prezzo = 19.99; $isOnline = true; ``` **Concatenazione di stringhe**: ```php echo "Ciao, " . $nome . "!"; // Output: Ciao, Mario! ``` ### Array Gli array sono utilizzati per memorizzare più valori in una sola variabile. PHP supporta array indicizzati, associativi (dizionari) e multidimensionali. #### Array Indicizzati Gli array indicizzati usano numeri interi come chiavi. **Creazione di un array**: ```php $frutti = ["mela", "banana", "pera"]; // o $frutti = array("mela", "banana", "pera"); ``` **Accesso agli elementi**: ```php echo $frutti[1]; // Output: banana ``` **Aggiungere elementi**: ```php $frutti[] = "arancia"; ``` **Funzioni utili**: - `count($frutti)` per ottenere il numero di elementi. - `array_push($frutti, "uva")` per aggiungere elementi alla fine. #### Array Associativi (Dizionari) Gli array associativi utilizzano chiavi per identificare i valori. **Creazione e accesso**: ```php $etaPersone = [ "Mario" => 30, "Luigi" => 25, "Peach" => 28 ]; echo $etaPersone["Luigi"]; // Output: 25 ``` **Iterazione con `foreach`**: ```php foreach ($etaPersone as $nome => $eta) { echo "$nome ha $eta anni.<br>"; } ``` **Funzioni utili per i dizionari**: - `array_keys($etaPersone)` per ottenere tutte le chiavi. - `array_values($etaPersone)` per ottenere tutti i valori. - `isset($etaPersone["Mario"])` per controllare se una chiave esiste. - `unset($etaPersone["Peach"])` per rimuovere un elemento. #### Array Multidimensionali Gli array multidimensionali sono array che contengono altri array. **Creazione e accesso**: ```php $studenti = [ "classeA" => ["Mario", "Luigi"], "classeB" => ["Peach", "Toad"] ]; echo $studenti["classeA"][1]; // Output: Luigi ``` **Iterazione**: ```php // scorro le classi foreach ($studenti as $classe => $alunni) { echo "Alunni di $classe:<br>"; // per ogni classe scorro gli alunni al loro interno foreach ($alunni as $alunno) { echo "- $alunno<br>"; } } ``` ### Costrutti Principali I costrutti condizionali e i cicli sono fondamentali per controllare il flusso del programma. #### Condizioni: `if`, `else if`, `else` ```php $eta = 20; if ($eta >= 18) { echo "Sei maggiorenne."; } elseif ($eta == 17) { echo "Sei quasi maggiorenne."; } else { echo "Sei minorenne."; } ``` Ecco una versione più dettagliata del paragrafo sui cicli, con un approfondimento su `foreach` e sugli altri cicli in PHP: ### Cicli in PHP I cicli sono costrutti essenziali per eseguire blocchi di codice ripetutamente fino a quando una condizione specifica è vera. PHP offre vari tipi di cicli: `while`, `do-while`, `for`, e `foreach`. #### Ciclo `while` Il ciclo `while` esegue un blocco di codice fintanto che una condizione è vera. La condizione viene valutata all'inizio di ogni iterazione, quindi se la condizione è falsa all'inizio, il ciclo non verrà eseguito. **Sintassi ed esempio**: ```php $i = 0; while ($i < 5) { echo "Il valore di i è: $i<br>"; $i++; } // Output: // Il valore di i è: 0 // Il valore di i è: 1 // Il valore di i è: 2 // Il valore di i è: 3 // Il valore di i è: 4 ``` #### Ciclo `do-while` Il ciclo `do-while` è simile a `while`, ma la condizione viene valutata alla fine di ogni iterazione, il che garantisce che il blocco di codice venga eseguito almeno una volta. **Sintassi ed esempio**: ```php $i = 0; do { echo "Il valore di i è: $i<br>"; $i++; } while ($i < 5); // Output identico al ciclo `while` ``` #### Ciclo `for` Il ciclo `for` è utile quando si conosce in anticipo il numero di iterazioni. Include un contatore iniziale, una condizione di continuazione e un incremento/decremento. **Sintassi ed esempio**: ```php for ($i = 0; $i < 5; $i++) { echo "Il valore di i è: $i<br>"; } // Output: // Il valore di i è: 0 // Il valore di i è: 1 // Il valore di i è: 2 // Il valore di i è: 3 // Il valore di i è: 4 ``` #### Ciclo `foreach` Il ciclo `foreach` è specificamente progettato per iterare su array e array associativi. È particolarmente utile perché permette di accedere direttamente ai valori senza preoccuparsi di contatori o indici. **Sintassi di base**: ```php foreach ($array as $valore) { // Esegue il codice per ogni elemento dell'array } ``` **Sintassi per array associativi**: ```php foreach ($arrayAssociativo as $chiave => $valore) { // Esegue il codice per ogni coppia chiave-valore } ``` **Esempi pratici**: 1. **Array indicizzato**: ```php $frutti = ["mela", "banana", "pera"]; foreach ($frutti as $frutto) { echo "Frutto: $frutto<br>"; } // Output: // Frutto: mela // Frutto: banana // Frutto: pera ``` 2. **Array associativo (dizionario)**: ```php $prezziFrutti = [ "mela" => 1.5, "banana" => 0.75, "pera" => 1.2 ]; foreach ($prezziFrutti as $frutto => $prezzo) { echo "Il prezzo di una $frutto è $prezzo euro.<br>"; } // Output: // Il prezzo di una mela è 1.5 euro. // Il prezzo di una banana è 0.75 euro. // Il prezzo di una pera è 1.2 euro. ``` ### Confronto tra i Cicli - **`while` e `do-while`**: Utili quando non si conosce esattamente il numero di iterazioni e si basa tutto su una condizione. - **`for`**: Ideale per situazioni in cui il numero di iterazioni è noto in anticipo. - **`foreach`**: Perfetto per iterare su array e array associativi in modo semplice e leggibile. **Esempio pratico complesso con `foreach`**: Supponiamo di avere un array multidimensionale con i dati degli studenti e le loro materie: ```php $studenti = [ "Mario" => ["Matematica" => 28, "Storia" => 30, "Informatica" => 27], "Luigi" => ["Matematica" => 25, "Storia" => 28, "Informatica" => 30], "Peach" => ["Matematica" => 30, "Storia" => 30, "Informatica" => 29] ]; foreach ($studenti as $nome => $materie) { echo "Studente: $nome<br>"; foreach ($materie as $materia => $voto) { echo " - $materia: $voto<br>"; } echo "<br>"; } // Output: // Studente: Mario // - Matematica: 28 // - Storia: 30 // - Informatica: 27 // // Studente: Luigi // - Matematica: 25 // - Storia: 28 // - Informatica: 30 // // Studente: Peach // - Matematica: 30 // - Storia: 30 // - Informatica: 29 ``` ### Variabili `$_GET` e `$_POST` Le variabili globali `$_GET` e `$_POST` sono array superglobali in PHP utilizzati per raccogliere dati inviati dall'utente attraverso un form o tramite URL. Entrambi sono strumenti fondamentali per gestire l'input nei siti e nelle applicazioni web. #### Cos'è `$_GET`? `$_GET` è un array associativo superglobale che raccoglie i dati inviati tramite il metodo GET. Il metodo GET invia i dati attraverso l'URL, quindi è visibile all'utente e ai motori di ricerca. Questo lo rende ideale per operazioni come la ricerca e la navigazione, ma meno sicuro per l'invio di dati sensibili. **Esempio di un form che utilizza il metodo GET**: ```html <form method="GET" action="pagina.php"> <label for="nome">Nome:</label> <input type="text" name="nome" id="nome"> <input type="submit" value="Invia"> </form> ``` **Accesso ai dati in PHP**: ```php // Supponiamo che l'URL sia: pagina.php?nome=Mario if (isset($_GET['nome'])) { $nome = htmlspecialchars($_GET['nome']); echo "Il nome ricevuto è: " . $nome; // Output: Il nome ricevuto è: Mario } ``` **Considerazioni sulla sicurezza**: - I dati inviati tramite `$_GET` sono visibili nell'URL e possono essere memorizzati nei log del server o **condivisi attraverso i link**. - È importante utilizzare `htmlspecialchars()` per prevenire attacchi XSS (Cross-Site Scripting). ### Cos'è `$_POST`? `$_POST` è un array associativo superglobale che raccoglie i dati inviati tramite il metodo POST. Questo metodo invia i dati attraverso il corpo della richiesta HTTP, rendendoli più sicuri e meno visibili rispetto al metodo GET. È utilizzato per operazioni che richiedono sicurezza, come l'invio di password o di moduli di registrazione. **Esempio di un form che utilizza il metodo POST**: ```html <form method="POST" action="pagina.php"> <label for="email">Email:</label> <input type="email" name="email" id="email"> <input type="submit" value="Invia"> </form> ``` **Accesso ai dati in PHP**: ```php if (isset($_POST['email'])) { $email = htmlspecialchars($_POST['email']); echo "L'email ricevuta è: " . $email; // Output: L'email ricevuta è: email@example.com } ``` **Considerazioni sulla sicurezza**: - Anche se i dati non sono visibili nell'URL, è essenziale validare e sanitizzare gli input per proteggersi da attacchi come l'injection. - Per prevenire attacchi XSS, `htmlspecialchars()` può essere usato per convertire i caratteri speciali in entità HTML. - L'uso di `filter_var()` e `filter_input()` è raccomandato per validare input come email, numeri e URL. **Differenze tra `$_GET` e `$_POST`**: - **Visibilità**: `$_GET` invia i dati attraverso l'URL, mentre `$_POST` li invia nel corpo della richiesta HTTP. - **Lunghezza**: I dati inviati con `$_GET` hanno un limite di lunghezza (dipende dal browser e dal server), mentre con `$_POST` la quantità di dati è maggiore. - **Sicurezza**: `$_POST` è generalmente più sicuro per l'invio di dati sensibili, mentre `$_GET` è più appropriato per trasmettere informazioni che non necessitano di protezione. #### Esempio Completo di Validazione e Sanitizzazione Quando si raccolgono dati dagli utenti, è importante effettuare una validazione completa per assicurarsi che siano conformi alle aspettative. **Esempio di un form di registrazione**: ```html <form method="POST" action="pagina_registrazione.php"> <label for="username">Username:</label> <input type="text" name="username" id="username" required> <label for="password">Password:</label> <input type="password" name="password" id="password" required> <input type="submit" value="Registrati"> </form> ``` **Elaborazione dei dati con PHP**: ```php if ($_SERVER['REQUEST_METHOD'] === 'POST') { $username = htmlspecialchars($_POST['username']); $password = htmlspecialchars($_POST['password']); // Validazione semplice if (!empty($username) && !empty($password)) { echo "Registrazione avvenuta con successo per l'utente: " . $username; } else { echo "Tutti i campi sono obbligatori."; } } ``` **Buone pratiche di sicurezza**: - **Sanitizzazione**: Usa `htmlspecialchars()` o `filter_var()` per sanitizzare i dati. - **Validazione**: Verifica sempre che i dati siano nel formato corretto (ad esempio, usa `FILTER_VALIDATE_EMAIL` per le email). - **Protezione da attacchi XSS**: Converti i caratteri speciali in entità HTML per impedire l'inserimento di codice dannoso. ### Funzioni di Output - **`echo`**: Stampa una o più stringhe. - **`var_dump`**: Stampa il contenuto di una variabile, molto utile per visualizzare in fase di programmazione il contenuto di un array `var_dump($_POST)` ### Manipolazione delle Stringhe PHP offre una vasta gamma di funzioni per manipolare le stringhe. **Funzioni comuni**: - **`strlen()`**: Lunghezza della stringa. - **`strtoupper()` / `strtolower()`**: Conversione in maiuscolo/minuscolo. - **`substr()`**: Estrazione di una sottostringa. - **`str_replace()`**: Sostituzione di testo. ```php echo str_replace("mondo", "PHP", "Ciao, mondo!"); // Output: Ciao, PHP! ``` **Divisione e Unione di Stringhe**: - **`explode()`**: ```php $parti = explode(",", "mela,banana,pera"); ``` - **`implode()`**: ```php echo implode(" - ", $parti); // Output: mela - banana - pera ``` **Trattamento degli input**: - **`trim()`**: Rimuove gli spazi bianchi. - **`nl2br()`**: Converte le nuove righe in `<br>` per l'output HTML. ### Commenti in PHP I commenti sono importanti per rendere il codice più leggibile. **Commento su una riga**: ```php // Questo è un commento su una riga ``` **Commento su più righe**: ```php /* Questo è un commento su più righe */ ```