PHP - alfredocentinaro.it https://www.alfredocentinaro.it/category/lezioni/php/ Sito personale di Alfredo Centinaro, ingegnere informatico, insegnante, musicista. Programmazione, appunti, esercizi, sistemi e reti, tpsit, esami di stato, arduino Sun, 30 Mar 2025 15:31:50 +0000 it-IT hourly 1 https://wordpress.org/?v=6.9.4 https://www.alfredocentinaro.it/wp-content/uploads/2022/01/logo_alfredocentinaro-150x150.png PHP - alfredocentinaro.it https://www.alfredocentinaro.it/category/lezioni/php/ 32 32 CRUD in PHP con fetch API e JavaScript https://www.alfredocentinaro.it/lezioni/php/crud-in-php-con-fetch-api-e-javascript/ Sun, 30 Mar 2025 14:46:36 +0000 https://www.alfredocentinaro.it/?p=8270 Una mini tutorial con operazioni CRUD realizzate in PHP e la funzione Fetch API in JavaScript. La tecnologia dei microservizi, che abbiamo già commentato qui, fonda la sua funzionalità sulla possibilità di reperire o inviare dati in modo asincrono al server di interesse. Occorrono quindi dei punti di accesso a cui far collegare il JavaScript ... Leggi tutto

L'articolo CRUD in PHP con fetch API e JavaScript proviene da alfredocentinaro.it.

]]>
Una mini tutorial con operazioni CRUD realizzate in PHP e la funzione Fetch API in JavaScript.

La tecnologia dei microservizi, che abbiamo già commentato qui, fonda la sua funzionalità sulla possibilità di reperire o inviare dati in modo asincrono al server di interesse. Occorrono quindi dei punti di accesso a cui far collegare il JavaScript per effettuare le operazioni. Questi accessi sono le API, interfacce invocabili attraverso tecnologie come Fech o Ajax che consentono le operazioni CRUD necessarie all’evoluzione di un software web.

In questo articolo vogliamo realizzare e commentare un’interfaccia API JS/PHP che implementa le operazioni CRUD di creazione, lettura, aggiornamento e cancellazione di un record da tabella di articoli. L’esempio è semplice e didattico, ovviamente. Per dare un pizzico di interfaccia gradevole è stato usato comunque Bootstrap e un CSS minimale. L’alunno che volesse riproporre in una verifia o anche ad uno scritto di esame di stato, può tranquillamente bypassare la grafica e limitarsi ai tag html essenziali corredati degli id necessari al funzionamento del codice js.

Esempio di pagina

Il database

Cominciamo con preparare il nostro database con una tabella dove agire con le CRUD. Lo realizziamo volutamnte semplice per non complicare il codice. Nel nosro caso realizziamo una semplice tabella con 3 campi, di cui id è chiave numerica incrmentale. Aggiungiamo qualche dato di esempio.

CREATE TABLE `articoli` (
  `id` int NOT NULL,
  `nome` varchar(60) NOT NULL,
  `descrizione` varchar(120) DEFAULT NULL
) ENGINE=InnoDB 

--
-- Dump dei dati per la tabella `articoli`
--

INSERT INTO `articoli` (`id`, `nome`, `descrizione`) VALUES
(1, 'Philips Monitor 278E', 'Monitor 27\" curvo'),
(2, 'JoyAccess Tastiera wireless', 'Tastiera wireless con mouse e chiave bluetooth rosa');

La pagina HTML

La pagina HTML di prova contiene in pratica la possibilità di chiamare tutte le funzionalità CRUD in esame. E’ costituita da una tabella che si aggiorna effettuando il read da database, due link/bottoni aggiorna ed elimina, una form minimale per inserire nuovi articoli. Il bottone aggiorna apre una finestra modale. In realtà questa è nascosta nel codice della pagina stessa. Nalla modale si carica i dati del record da aggiornare e consente quindi le operazioni di update. Tutta la grafica è fatta con Bootstrap, la nota libreria e una paletta di colori ispirata da quelli della nota catena di mobili svedese. Il lettore che volesse affrontare l’esercizio per un compito o esame può tralasciare i dettagli di grafica e limitarsi solo ai necessari tag html spartani.

Essendo tutto su una unica pagina non ha pretesa di realismo di un software comune.

<!DOCTYPE html>
<html lang="it">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>API Test</title>
    <link href="css/style.css" rel="stylesheet">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">

</head>
<body>


<div class="container">
  <div class="row">
    <div class="col"></div>
    <div class="col-10">



    <div class="box">    
        <h2>Read</h2>
        <table class="table table-striped">
        <thead>
            <tr>
            <th>ID</th>
            <th>Nome</th>
            <th>Descrizione</th>
            <th>Azioni</th>
            </tr>
        </thead>
        <tbody id="articoli">
        </tbody>
        </table>

    </div>

    <div class="box"> 
        <h2>Create</h2>
        <form class="mb-3 col-sm-4">

            <div class="mb-3">
            <label for="nome" class="form-label">Nome</label>
            <input type="text" class="form-control" id="nome" placeholder="nome articolo">
            </div>
            <div class="mb-3">
            <label for="descrizione" class="form-label">Descrizione</label>
            <textarea class="form-control" id="descrizione" rows="3"></textarea>
            </div>
            <button id="inserisci" type="button" class="btn btn-primary btn-brown">Inserisci</button>
        </form>
    </div>



    <!-- Modal -->
    <div class="modal fade" id="aggiornaModale" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
    <div class="modal-dialog">
        <div class="modal-content">
        <div class="modal-header">
            <h2 class="modal-title fs-5" id="exampleModalLabel">Update</h2>
            <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
        </div>
        <div class="modal-body">

        
            <div class="mb-3">
            <label for="nome" class="form-label">ID</label>
            <input type="text" class="form-control" id="aggiornaid" placeholder="nome articolo">
            </div>      
            <div class="mb-3">
            <label for="nome" class="form-label">Nome</label>
            <input type="text" class="form-control" id="aggiornanome" placeholder="nome articolo">
            </div>
            <div class="mb-3">
            <label for="descrizione" class="form-label">Descrizione</label>
            <textarea class="form-control" id="aggiornadescrizione" rows="3"></textarea>
            </div>
            


        </div>
        <div class="modal-footer">
            <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Chiudi</button>
            <button type="button" class="btn btn-primary btn-brown" id="bottoneAggiorna">Aggiorna</button>
        </div>
        </div>
    </div>
    </div>
        </div>
        <div class="col"></div>
    </div>
    </div>


<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
<script src="js/script.js"></script>
</body>
</html>

Per completezza, condivido anche il codice del foglio di stile

:root{
    --colore1: #f8d115;
    --colore2: #fbe444;
    --colore3: #04348c;
    --colore4: #978466;
    --colore5: #96aac1;
    --colore6: #043794; 
}

body
{
    background-color: var(--colore5);
}

.box
{
    background-color: var(--colore2);
    border: 1px solid var(--colore3);
    border-radius: 1rem;
    color:  var(--colore6);
    padding: 1rem;
    margin-top: 1rem;
}



#articoli.th, td {
    padding: 8px;
    text-align: left;
}

.btn-brown{
    background-color: var(--colore4) !important;
}

.btn-brown:hover, .btn-brown:active{
    background-color: var(--colore5) !important;    
}

Lo script JavaScript

Per utilizzare il codice va sicuramente visto l’url dove è depositato il file api.php. Nel nostro esempio agiamo in localhost su una macchina offline sostanzialmente. Per comodità abbiamo una struttura di cartelle api e magazzino annidate.


const apiUrl = "http://localhost/api/magazzino/api.php";

function _create() {
    const nome = document.querySelector("#nome").value;
    const descrizione = document.querySelector("#descrizione").value;

    const parametri = new URLSearchParams({ nome, descrizione });
    const opzioni = { method: "POST", body: parametri };

    fetch(apiUrl, opzioni)
        .then(response => response.json())
        .then(() => _read())
        .catch(error => console.error("Errore inserimento:", error));
}

function _read() 
{
    fetch(apiUrl)
        .then(response => response.json())
        .then(data => {
            //console.log(data);
            const articoli = document.querySelector("#articoli");
            articoli.innerHTML ='';
            
            data.forEach(articolo => {
                //console.log(articolo);
                const tr = document.createElement("tr");
                
                const td_nome = document.createElement("td");
                td_nome.textContent = articolo.nome;
                tr.appendChild(td_nome);

                const td_id = document.createElement("td");
                td_id.textContent = articolo.id;

                const td_descrizione = document.createElement("td");
                td_descrizione.textContent = articolo.descrizione;

                const td_azione = document.createElement("td");
              
                const bottone_update = document.createElement("a");
                bottone_update.href = "#"
                bottone_update.textContent = "Aggiorna";
                bottone_update.setAttribute("data-bs-toggle","modal");
                bottone_update.setAttribute("data-bs-target", "#aggiornaModale");
                bottone_update.setAttribute("data-id", articolo.id);
                bottone_update.classList.add("aggiorna");
                bottone_update.addEventListener("click", fillUpdate);

                const bottone_delete = document.createElement("a");
                bottone_delete.href = "#";
                bottone_delete.textContent = "Elimina";
                bottone_delete.setAttribute("data-id", articolo.id);
                bottone_delete.addEventListener("click", _delete);

                td_azione.appendChild(bottone_update);
                td_azione.appendChild(document.createTextNode(" | "));
                td_azione.appendChild(bottone_delete); 
                
                tr.appendChild(td_id);
                tr.appendChild(td_nome);
                tr.appendChild(td_descrizione);
                tr.appendChild(td_azione);

                articoli.appendChild(tr);

            }); 
        })
        .catch(error => console.error("Errore lettura:", error));
}

function _readById(id) 
{
    const parametri = new URLSearchParams({ id });
    
    //Il GET non consente un body con i parametri che vanno passati direttamente nell'URL
    const urlParametrico = apiUrl + "?" + parametri.toString(); 
    return fetch(urlParametrico)
        .then(response => response.json())
        .catch(error => console.error("Errore lettura:", error));
}

function fillUpdate(event) {
    const dataId = event.target.getAttribute("data-id");

    _readById(dataId) //il fetch torna direttamente dalla funzione readById
        .then(data => {
            document.querySelector("#aggiornaid").value = data[0].id;
            document.querySelector("#aggiornanome").value = data[0].nome;
            document.querySelector("#aggiornadescrizione").value = data[0].descrizione;
        })
        .catch(error => console.error("Errore nel caricamento dati per aggiornamento:", error));
}

function _update() {
    const id = document.querySelector("#aggiornaid").value;
    const nome = document.querySelector("#aggiornanome").value;
    const descrizione = document.querySelector("#aggiornadescrizione").value;

    const parametri = new URLSearchParams({ id, nome, descrizione });
    const opzioni = { method: "PUT", body: parametri };

    fetch(apiUrl, opzioni)
        .then(response => response.json())
        .then(() => _read())
        .catch(error => console.error("Errore aggiornamento:", error));
}

function _delete(event) {
    const id = event.target.getAttribute("data-id");
    if (confirm("Sei sicuro di voler eliminare questo articolo?")) 
    {
        const parametri = new URLSearchParams({ id });
        const opzioni = { method: "DELETE", body: parametri };

        fetch(apiUrl, opzioni)
            .then(response => response.json())
            .then(() => _read())
            .catch(error => console.error("Errore eliminazione:", error));
    }
}

// Inizializza
document.addEventListener("DOMContentLoaded", _read);
document.querySelector("#inserisci").addEventListener("click", _create);
document.querySelector("#bottoneAggiorna").addEventListener("click", _update);

Il backend API in PHP

Le API possono essere create in due modi. Nel primo creo un file che fa da routing sul metodo primitivo GET / POST / DELETE / PUT, scelta più sicura e flessibile. Oppure mi affido a chiamate e script specifici per ognuna delle funzionalità da gestire col database. A dire la verità molti programmatori spesso preferiscono questo secondo metodo perché più rapido e pigro. Infatti si gestisce tutto con passaggi di parametri o GET o POST al massimo. Il primo però è più completo, sicuro e professionale, quindi lo andremo a sviluppare con attenzione.

La prima cosa da curare e comprendere è: tutto il codice ragione e restituisce JSON, elemento imprescindibile per creare un frontend in Javascript. Quindi va bene messa in alto la dicituradel content-type.

Abbiamo poi bisogno di interagire con un database, qui il nostro buon MySQL. Nulla vieta di creare uno script separato che si occupa della connessione al db. Qui abbiamo inserito i suoi soliti parametri di autenticazione esternamente nel file config.db.php.

<?php

$host = "localhost";
$database = "test";
$user = "root";
$password = "mysqlroot";

Il resto del file in raltà è oltre che semplice, sempre assolutamente uguale, qualunque siano i dati o il database con cui interagire. Si tratta intercettare la chiamata fatta dal file Javascript e capire quale primitiva stia lanciando. Con un semplice if quindi andiamo a fare la require del funzione api associata.

Occhio: GET e POST per lettura ed inserimento godono di variabili superglobali $_GET e $_POST che possiamo usare in modo agevole nei nostri script php. Per intercettare invece i parametri inviati con le primitive PUT e DELETE devo necessariamente intercettarle nel flusso dati php://input.

<?php
header("Content-type: application/json");
require "config.db.php";

$connessione = mysqli_connect($host, 
                                $user, 
                                $password, 
                                $database);


if ($_SERVER["REQUEST_METHOD"] === 'GET')
{
    require "articoli/read.php";
}
   

if ($_SERVER["REQUEST_METHOD"] === 'POST')
{
    require "articoli/create.php";
}


if ($_SERVER["REQUEST_METHOD"] === 'PUT')
{
    parse_str(file_get_contents("php://input"), $_PUT);    
    require "articoli/update.php";
}


if ($_SERVER["REQUEST_METHOD"] === 'DELETE')
{
    parse_str(file_get_contents("php://input"), $_DELETE);    
    require "articoli/delete.php";
}

mysqli_close($connessione);
//echo json_encode(["errore" => "Errore"]);

Non ci resta che gestire ora le singole primitive con il codice che devono eseguire sul database e la restituzione del JSON o con i dati o con un messaggio di risposta per il debug. Per comodità li ho raccolti in una cartella. Diciamo sin da subito al lettore: il paradosso è che quesat struttura modulare dei file/script facilità enormente il lavoro di sviluppo. Infatti possiamo cambiare tabella/database e fondamentalemente le operazioni da fare saranno sempre identiche,basta solo cambiare le query nei prossimi file per adeguare il codice di backend.

<?php

$risultato = '';

if (isset($_POST['nome']) && isset($_POST['descrizione']))
{
    $nome =  $_POST['nome'];
    $descrizione =  $_POST['descrizione'];

    $sql = "INSERT INTO articoli (nome, descrizione) VALUES ('$nome', '$descrizione')";
    $risultato = mysqli_query($connessione, $sql);    
}


if($risultato)
{
    echo json_encode(["message" => "Articolo creato con successo"]);
} 
else 
{
    echo json_encode(["message" => "Errore creazione articolo"]);
}
exit();

<?php

if (isset($_REQUEST["id"]))
{
    $id = $_REQUEST["id"];
    $sql = "SELECT * FROM articoli WHERE id = $id";
}
else
{
    $sql = "SELECT * FROM articoli";  
}

$risultato = mysqli_query($connessione, $sql) or die("Query fallita");

echo json_encode(mysqli_fetch_all($risultato,MYSQLI_ASSOC)); 
exit();

<?php

if (isset($_PUT['id']))
{
    $id = $_PUT['id'];
    $nome = $_PUT['nome'];
    $descrizione = $_PUT['descrizione'];

    $sql = "UPDATE articoli SET nome = '$nome', descrizione = '$descrizione' WHERE id = $id";
    $risultato = mysqli_query($connessione, $sql);  
}

if($risultato)
{
    echo json_encode(["message" => "Articolo $id aggiornato con successo"]);
} 
else 
{
    echo json_encode(["message" => "Errore aggiornamento articolo"]);
}
exit();

<?php

$risultato = '';
$id ='';

if (isset($_DELETE['id']))
{
    $id =  $_DELETE['id'];

    $sql = "DELETE FROM articoli WHERE id=$id";
    $risultato = mysqli_query($connessione, $sql);    
}


if($risultato)
{
    echo json_encode(["message" => "Articolo rimosso con successo"]);
} 
else 
{
    echo json_encode(["message" => "Errore rimozione articolo n. $id"]);
}
exit();

Conclusioni

Siamo arrivati alla fine del nostro esercizio. E’ importante ricordare che, se impostato con questa struttura, gli esercizi per creare delle API sono praticamente sempre gli stessi identici a livello di difficoltà. Possiamo cambiare contesto dei dati, tabelle, database, creare delle query e quindi delle primitive più specifiche a seconda dei parametri che vengono passati. L’impostazione è sempre la stessa. Visto un esercizio bene, li abbiamo visti tutti!

L'articolo CRUD in PHP con fetch API e JavaScript proviene da alfredocentinaro.it.

]]>
Introduzione al PHP: il primo script, variabili e stringhe https://www.alfredocentinaro.it/lezioni/php/introduzione-al-php/ Wed, 28 Sep 2022 08:36:08 +0000 https://www.alfredocentinaro.it/?p=2970 Non è facile introdurre lo studente al PHP con un semplice post e di certo non ha la pretesa della completezza di manuali blasonati in rete. Cerchiamo di approcciare al mondo del PHP con un occhio alle difficoltà degli alunni sui banchi di scuola con le loro tempistiche. Il server web Prima di tutto partiamo ... Leggi tutto

L'articolo Introduzione al PHP: il primo script, variabili e stringhe proviene da alfredocentinaro.it.

]]>
Non è facile introdurre lo studente al PHP con un semplice post e di certo non ha la pretesa della completezza di manuali blasonati in rete. Cerchiamo di approcciare al mondo del PHP con un occhio alle difficoltà degli alunni sui banchi di scuola con le loro tempistiche.

Il server web

Prima di tutto partiamo da ciò che ci occorre per cominciare a lavorare col nostro PHP. Ci serve prima di tutto un server web da installare sul nostro PC/laptop. La scelta è quasi inevitabile: o Apache o NGinx. Nelle scuole è prassi consolidata usare il primo, ed installarlo in comodi pacchetti software utili allo sviluppo web. Parliamo di Wamp o Xamp. Sono sostanzialmente equivalenti: forniscono Apache, MySQL e PHPMyAdmin, i software base per lo sviluppo.

Personalmente preferisco Xamp soprattutto perché non richiede permessi di amministratore per avviarlo, piuttosto scomodo in una classe di venti alunni che non devono conoscere la password per installare giochini o software vari. Xamp unisce anche un server mail di testing, Filezilla e il server Tomcat che potrebbero tornare utili in altre materie o situazioni didattiche, nonché ha versioni diverse di PHP per svariate esigenze.

Se usate Linux, l’installazione di Apache, il suo modulo PHP, MySQL e PHPMyAdimin è semplice e può essere condotta con i classici software di store delle varie distribuzioni o i comandi apt per le distro debian/ubuntu.

Il nostro primo script

Cercate sul vostro disco la cartella di installazione di xamp o wamp, quindi cerchiamo la cartella htdocs o www su windows, o /var/www/ su linux. Sarà la nostra cartella di lavoro dove creare i nostri file. Per ogni progetto suggerisco sempre di creare una cartella interna al percorso, sempre con caratteri minuscoli e parola singola. Es. c:/wamp/www/esercizio1 o c:/xamp/htdocs/esercizio1 o /var/www/html/esercizio1 su linux.

Creiamo un file di testo semplice col tasto destro e lo chiamiamo a piacere, es. prova.php

Proviamo a scrivere il classico template iniziale di pagina HTML visto in molte esercitazioni anche su queste pagine. Potrebbe essere questo che segue. Ricordate di salvare.

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Bootstrap demo</title>
  </head>
  <body>
    <h1>Hello, world!</h1>
  </body>
</html>

Se proviamo ora ad aprire un browser qualsiasi, come Chrome o Firefox, digitiamo nella barra in alto l’url

http://localhost/esercizio1/prova.php

Il browser dovrebbe aprire la nostra pagina di prova appena creata. E fin qui nulla di nuovo. Sappiamo però che il nostro server Apache funziona e ci ha fatto il rendering di una pagina con estensione .php. Se avete errore, occhio ad aver digitato bene il nome del file o sull’url o sul file stesso o la cartella di lavoro.

Facciamo uno step in più e proviamo il brivido del primo frammento di codice PHP. Linguaggio di programmazione, proviamo quindi subito a dichiarare della variabili e stampiamone il valore. Per segnalare ad Apache che sta leggendo un frammento di codice PHP da frullare ed eseguire, devo usare i tag di apertura <?php e chiusura ?>

Le variabili in PHP non sono tipizzate come il C/C++ qiondi basta usare il carattere jolly $ seguito da una parola singola.

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Bootstrap demo</title>
  </head>
  <body>
    <h1>Hello, world!</h1>

<?php 

$prova = "Ciao mondo!";
$provanumero = 123;
$provadecimale = 345.67;
$uncarattere = 'a';

echo $prova;

?>

  </body>
</html>

Andiamo un’altra volta sul nostro browser e ridigitiamo il percorso localhost… Questa volta Apache intercetta il codice e ci stamperà il messaggio del comando echo che , come si intuisce, corrisponde al cout o print del C/C++

Se volessimo mischiare e congiungere frammenti di testo vari con le variabili possiamo sperimentare questi modi seguenti

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Bootstrap demo</title>
  </head>
  <body>
    <h1>Hello, world!</h1>

<?php 

$nome = "Alfredo";

echo "Ciao $nome, benvenuto!";
echo "<br>";
echo "Ciao ".$nome.", benvenuto!";

?>

  </body>
</html>

Il lettore ha notato già che la variabile $ può essere facilmente immersa all’interno di una stringa di testo oppure è possibile utilizzare il carattere punto per concatenare stringhe e variabili in modo da avere opportunità di eseguire altre automatizzazioni delle stringhe. Abbiamo aggiunto un elemento di disturbo, un tag html stampato con echo. Qui cimiciamo a vedere la potenza del nostro PHP che ci permette di lavorare su varibili e vedremo le strutture dati varie, ma anche di forzare una grafica dal lato server producendo un risultato direttamente in HTML/CSS.

L'articolo Introduzione al PHP: il primo script, variabili e stringhe proviene da alfredocentinaro.it.

]]>
Le variabili in PHP, applicazioni particolari https://www.alfredocentinaro.it/lezioni/php/le-variabili-in-php-applicazioni-particolari/ Sat, 21 Dec 2019 08:36:17 +0000 https://www.alfredocentinaro.it/2019/12/21/le-variabili-in-php-applicazioni-particolari/ Nei nostri esercizi utilizziamo spesso le variabili per gestire le varie funzionalità. Tralasciamo la teoria completa che lasciamo ai manuali e concentriamoci su alcuni dettagli che possono fare la differenza per i nostri piccoli script. Quando gli alunni approcciano il PHP, la prima difficoltà che incontrano è capire come stampare le variabili o inglobarle nelle ... Leggi tutto

L'articolo Le variabili in PHP, applicazioni particolari proviene da alfredocentinaro.it.

]]>
Nei nostri esercizi utilizziamo spesso le variabili per gestire le varie funzionalità. Tralasciamo la teoria completa che lasciamo ai manuali e concentriamoci su alcuni dettagli che possono fare la differenza per i nostri piccoli script.

Quando gli alunni approcciano il PHP, la prima difficoltà che incontrano è capire come stampare le variabili o inglobarle nelle query. Vediamo qualche esempio vedendo la differenza usando le virgolette singole (apice o apostrofo se preferite) ‘ ‘ o le virgolette doppie ” “. 

$nome = "Pippo";
echo "Il mio nome è $nome <br>"; //Il mio nome è Pippo
echo "Il mio nome è " . $nome; echo "<br>"; //Il mio nome è Pippo
echo "Il mio nome è " . $nome . " e sono felice <br>"; //Il mio nome è Pippo e sono felice
echo 'Il mio nome è ' .$nome. " e sono felice <br>"; //Il mio nome è Pippo e sono felice

Come avete visto, possiamo immergere la nostra variabile all’interno di una stringa semplicemente avendo cura di scrivere la stringa con le doppie virgolette. E’ un sistema pratico, ma spesso nasconde un insidia perché non è molto leggibile e se stiamo debuggando il $ potrebbe sfuggire all’occhio stanco. Il secondo e terzo rigo sono invece molto simili all’uso delle stringhe classico di molti linguaggi di programmazione, intuitivo e richiede solo un po’ di accortezza. Si può usare, in questo caso, sia virgolette singole che doppie come nell’ultima riga e vi faccio notare come il punto possa essere o meno attaccato alla variabile. Se copiate l’intero codice per testarlo col web server, per leggere meglio è stato inserito qualche <br>;

 Altro esempio interessante, che può risultare particolare rispetto ad altri linguaggi di programmazione, è l’uso delle variabili nelle/come stringhe di testo, che vengono quindi variabilizzate! Per farlo basta usare l’operatore $ applicato ad una variabile $nomevariabile. Guardiamo un esempio.

$italiano = 'Ciao Mondo';
$inglese  = 'Hello World';

$lingua = 'italiano';

echo $lingua;

Abbiamo due stringhe classiche. Se facessimo un echo della variabile $lingua, avremmo la stampa italiano. Ma applicandoci il $ davanti è come se stampassimo $italiano! Provate a sostituire inglese nella variabile $lingua per ottenere la stampa Hello World.  

Altro concetto che è bene riassumere è quello dell’uso delle variabili superglobali, variabili già presenti a sistema e che svolgono funzioni fondamentali per far comunicare gli script tra loro. Vediamone un prospetto. In rosso quelli che sono decisamente più significativi per le nostre esercitazioni

VariabileDescrizione
$GLOBALSE’ un vettore che contiene le variabili definite come globali attraverso la keyword global 
$_SERVERContiene gli header e le informazioni relative al server e allo script
$_GETE’ un vettore che contiene i parametri passati tramite URL (es http://www.pippo.it/?nome=pluto&param2=ciao)
$_POSTE’ un vettore che contiene i parametri passati come POST allo script attraverso una form
$_FILESE’ una matrice che contiene le informazioni relative ai file uploadati dallo script corrente attraverso il metodo POST.
$_COOKIEE’ un vettore che contiene i cookie.
$_REQUESTContiene tutti i parametri contenuti anche in $_GET, $_POST e $_COOKIE, ma non occorre fare distinzione
$_SESSIONE’ un vettore che contiene le informazioni relative alle sessioni
$_ENVContiene tutti i parametri passati all’ambiente.

Tra le variabili superglobali, quella meno evidente per la sua utilità sembrerebbe essere $_SERVER ma è fondamentale per svariate applicazioni. Proviamo le seguenti righe di codice. Vi raccomando di scrivere in stampatello altrimenti l’array associativo non troverà la chiave corretta.

La prima ci indica lo user agent del browser che ha richiesto la pagina. E’ una informazione fondamentale se vogliamo realizzare siti con grafica o applicazioni differenziate a seconda del browser o, più probabilmente, a seconda se il dispositivo richiedente sia mobile o fisso.

echo $_SERVER['HTTP_USER_AGENT']

/** 
Stampa qualcosa del genere
Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36
*/

Per conoscere indirizzo IP e porta del browser chiamante, per filtrare magari per motivi di sicurezza o indirizzare direttamente determinate funzionalità al richiedente ci sono invece le seguenti righe:

echo "IP: ".$_SERVER['REMOTE_ADDR']; 
echo ":".$_SERVER['REMOTE_PORT']; 

Meno evidente l’utilità, ma è bene conoscere la voce che permette di capire quale request abbia invocato lo script PHP, sempre soprattutto per motivi di sicurezza.

 echo $_SERVER['REQUEST_METHOD'];

/** 
Risponde GET o POST
*/

L'articolo Le variabili in PHP, applicazioni particolari proviene da alfredocentinaro.it.

]]>
Introduzione al PHP: condizioni e cicli https://www.alfredocentinaro.it/lezioni/php/introduzione-al-php-condizioni-e-cicli/ Fri, 30 Sep 2022 23:21:30 +0000 https://www.alfredocentinaro.it/?p=3002 Come ogni linguaggio di programmazione che si rispetti, un ruolo fondamentale lo hanno le strutture di controllo if/else e i cicli. Vediamo come utilizzarli in PHP con qualche applicazione introduttiva semplice. Entriamo nel vivo della programmazione PHP, dopo aver visto come gestire il nostro primo script con la creazione di variabili e stampa a video ... Leggi tutto

L'articolo Introduzione al PHP: condizioni e cicli proviene da alfredocentinaro.it.

]]>
Come ogni linguaggio di programmazione che si rispetti, un ruolo fondamentale lo hanno le strutture di controllo if/else e i cicli. Vediamo come utilizzarli in PHP con qualche applicazione introduttiva semplice.

Entriamo nel vivo della programmazione PHP, dopo aver visto come gestire il nostro primo script con la creazione di variabili e stampa a video personalizzata (leggi qui). I cicli in PHP si comportano come in qualsiasi altro linguaggio il nostro studente abbia avuto formazione.

La condizione if/else

Creiamo sempre uno script/file di testo .php per i nostri test, nella cartella di lavoro del nostro server Apache. Cominciamo con la struttura condizionale.

Un esempio ovviamente semplice. Col PHP posso scegliere di stampare nella mia pagina HTML un messaggio di benvenuto ma parametrizzato secondo una certa soglia. Qui ad esempio, se età è maggiorenne, il messaggio viene stampato con un tag banale di span ma con classe css diversa a seconda del caso.

<!DOCTYPE html>
<html lang="it">
<head>
    <style>
        .green{color: green;} 
        .red{color: red;} 
    </style>
</head>
<body>

<h1>Prova PHP</h1>

<?php   

$eta = 15;

if ($eta >= 18)
    echo "<span class=\"green\">Benvenuto maggiorenne di anni $eta</span>";
else
    echo "<span class=\"red\">Benvenuto minorenne di anni $eta</span>";


?>

</body>
</html>

Il lettore può anche stravolgere il ragionamento precedente e usare una variabile da parametrizzare invece della stringa finale.

$green ="green";
$red= "red";
if ($eta >= 18)
{
   $colore = "green";
}
else
{
  $colore = "red";
}

echo "<span class=\"$colore\">Ciao tizio</span>";

Il ciclo for

Bene, il potenziale del blocco if credo sia scontato anche come semplice elemento decisionale di codice senza interfaccia html. Usiamolo in un altro contesto. Voglio stampare una piccola tabella con informazioni fittizie, ma voglio automatizzare il processo e stampare righe di colori alterni. Ecco che abbiamo la scusa di vedere il ciclo for, riadattato allo scripting PHP ma che di fatto è identico a quello degli altri linguaggi visti.

<!DOCTYPE html>
<html lang="it">
<head>
    <style>
        .sfondogrigio
        {
         background-color: lightgrey;
         border: 1px solid black;
        }
        table, th, td {border: 1px solid black; border-collapse: collapse;}
    </style>
</head>
<body>


<table>
<tr>
  <th>indice</th><th>Prova</th><th>Test</th>
</tr>

<?php
for ($i =0; $i < 10; $i++)
{
    if ($i % 2 != 0)
        echo "<tr><td>$i</td><td>prova</td><td>test</td></tr>";
    else
        echo "<tr class=\"sfondogrigio\"><td>$i</td><td>prova</td><td>test</td></tr>";
}
?>
</table>
</body>
</html>

Codice intuitivo per chi già mastica programmazione. L’indice del ciclo lo usiamo per capire in che riga ci troviamo, se pari o dispari, e quindi con if stampiamo la riga con la classe personalizzata o meno. L’esempio, è spartano, ma ci serve per comprendere il potenziale di come automatizzare e personalizzare anche il front-end.

Il ciclo foreach

Manca uno dei cicli più potenti e versatili ma vale la pena vederlo con gli array dove trova naturale applicazione. Il ciclo for è molto comodo per tenere traccia degli elementi di un vettore con una condizione di uscita nota. Avere l’indice ci aiuta ad accedere in modo agevole all’elemento che ci occorre ma spesso basta essere più veloci, ovvero scorrere direttamente tutti gli elementi del vettore stesso.

$colori= array("rosso", "verde", "blu", "viola");

foreach ($colori as $elemento) 
{
  echo "$elemento <br>";
}

$elemento diventa il nostro buffer, come se fosse l’indice del ciclo for solo che contiene direttamente l’elemento con tutti i suoi eventuali sottoelementi.

L'articolo Introduzione al PHP: condizioni e cicli proviene da alfredocentinaro.it.

]]>
Introduzione al PHP: gli array e gli array associativi https://www.alfredocentinaro.it/lezioni/php/introduzione-al-php-gli-array-e-gli-array-associativi/ Tue, 04 Oct 2022 22:36:24 +0000 https://www.alfredocentinaro.it/?p=3055 Uno dei grandi vantaggi di un linguaggio di scripting come PHP è che si supera il vincolo della tipizzazione forte degli array o vettori che dir si voglia. Array Questo implica un primo fondamentale risultato: in un vettore possiamo inserire tipi eterogenei di dati elementari. Possiamo dichiarare il vettore in due modi distinti, ma valgono ... Leggi tutto

L'articolo Introduzione al PHP: gli array e gli array associativi proviene da alfredocentinaro.it.

]]>
Uno dei grandi vantaggi di un linguaggio di scripting come PHP è che si supera il vincolo della tipizzazione forte degli array o vettori che dir si voglia.

Array

Questo implica un primo fondamentale risultato: in un vettore possiamo inserire tipi eterogenei di dati elementari. Possiamo dichiarare il vettore in due modi distinti, ma valgono le stesse proprietà.

<?php
$vettore = array("pippo", 123, "topolino", 2.12);
echo $vettore[2];

$altrovettore = ["test", 15, -4.1];

Array associativi

L’accesso agli elementi del nostro vettore infatti non sarà solo attraverso un indice numerico, funzionalità che rimane sostanzialmente utilizzabile, ma la posizione di una variabile sarà piuttosto individuato da un identificatore indice di tipo stringa, generando una coppia chiave/valore molto più intuitiva e forte.

<?php
$associativo = [
    "nome" => "Mario", 
    "cognome" => "Rossi", 
    "sesso" => 'M'
];

echo $associativo["nome"]."\n"; // Mario
echo "$associativo["sesso"]"; // M

Array multidimensionali

Lo studente più attento avrà già notato una similitudine tra una riga di una tabella i cui campi/colonne possono essere individuati tramite le chiavi mnemoniche. Da qui l’ulteriore passettino in avanti: e se voglio crearmi un vettore semplice con dentro più elementi complessi, ovvero un vettore multidimensionale? Nessun limite, possiamo creare una lista complessa con un vettore di base dove in ogni posizione mettiamo un vettore asociativo. Per accederci segue modalità intuitiva in stile accesso a matrice vista in altri linguaggi di programmazione.

<?php
$associativo = [
                       [
                         "nome" => "Mario", 
                          "cognome" => "Rossi", 
                          "sesso" => 'M'
                       ],
                       [
                         "nome" => "Giuseppe", 
                          "cognome" => "Verdi", 
                          "sesso" => 'M'
                       ],
                       [
                         "nome" => "Sandra", 
                          "cognome" => "Bullock", 
                          "sesso" => 'F'
                       ]
  ]

 echo $associativo[1]["cognome"];   //stampa Verdi

Se quello del vettore multidimensionale ad indice numerico è uno degli usi più comuni dei vettori associativi di PHP, esiste anche la variante di vettore associativo di vettori associativi. Vale la pena citarli per usi più spinti. Mediamente per lo studente di scuola superiore basterà comprendere come il risultato di query su database relazionali torni una tabella che in PHP non sarà altro che più righe con indice numerico, dove ogni riga equivale ad un vettore associativo.

$listaprof = [
    "informatica" => [
                        "nome" => "alfredo",
                        "cognome" => "centinaro",
                        "annonascita" => 1982,
                        "sesso" => 'M',
                        "altezza" => 1.73
                    ],
    "sistemi" => [
                        "nome" => "mario",
                        "cognome" => "rossi",
                        "annonascita" => 1977,
                        "sesso" => 'M',
                        "altezza" => 1.63
                    ],
    "italiano" => [
                        "nome" => "gina",
                        "cognome" => "lolobrigida",
                        "annonascita" => 1960,
                        "sesso" => 'F',
                        "altezza" => 1.53
                    ]

    ];

    echo ("Il prof di informatica si chiama ".$listaprof["informatica"]["nome"]);

Non resta che provare qualche applicazione pratica. Ad esempio, costruiamo un vettore associativo multidimensionale e scorriamolo con un ciclo for che preleva i singoli dati per stamparli sotto forma di colonne e righe di una tabella.

L'articolo Introduzione al PHP: gli array e gli array associativi proviene da alfredocentinaro.it.

]]>
Le funzioni PHP https://www.alfredocentinaro.it/lezioni/php/le-funzioni-php/ Fri, 13 Oct 2023 07:51:31 +0000 https://www.alfredocentinaro.it/?p=5693 Vediamo in questo articolo come usare le funzioni in PHP, uno degli elementi imprescindibili di questo linguaggi odi scripting assieme ai vettori associativi e multidimensionali (che trovi spiegati qui o con un esercizio svolto qui). Le funzioni, come in tutti i linguaggi, consentono di riutilizzare un blocco di istruzioni che svolge un determinato compito, richiamando ... Leggi tutto

L'articolo Le funzioni PHP proviene da alfredocentinaro.it.

]]>
Vediamo in questo articolo come usare le funzioni in PHP, uno degli elementi imprescindibili di questo linguaggi odi scripting assieme ai vettori associativi e multidimensionali (che trovi spiegati qui o con un esercizio svolto qui).

Le funzioni, come in tutti i linguaggi, consentono di riutilizzare un blocco di istruzioni che svolge un determinato compito, richiamando la funzione stessa dove necessario. L’uso di funzioni consente di mantenere il codice in modo più efficace ed efficiente: se un frammento di codice si ripete in 100 punti e si scopre un errore possiamo correggere in tutti i punti in modo semplice soltanto nella funzione. La funzione permette di fare quindi sia upgrade e migliorie sia correzioni di errori in una volta sola.

Ogni azienda o programmatore poi ha il proprio script “coltellino svizzero” o comunque delle librerie di script in cui riportare le funzioni di utilità che vengono usate sempre in ogni progetto e che può portarsi con facilità.

Vediamo il nostro primo esempio base:

<?php

function grassetto($testo)
{
    return "<b>$testo</b>";
}

echo "Questo è un testo che ".grassetto("voglio fare in grassetto")." mentre questo no";

Per cominciare la nostra funzione basta intuitivamente inserire la parola chiave function seguito da un nome arbitrario, purché di una sola parola anche con trattino basso in caso. In parentesi i parametri, in numero a piacere e con nome a piacere, magari coerente col contenuto. Non deve essere specificato il tipo di ritorno ma assume il valore se e nel caso sia specificato il return.

Nell’esempio abbiamo manipolato una stringa ma vale ovviamente anche una gestione numerica più classica. Valgono le stesse considerazioni di sintassi e strutture condizionali viste.

<?php

function perimetroRettangolo($base, $altezza)
{
    $perimetro = ($base + $altezza) * 2;
    return $perimetro;
}

$perimetro = perimetroRettangolo(5, 2);     
echo $perimetro;   //stampa 14 

L'articolo Le funzioni PHP proviene da alfredocentinaro.it.

]]>
Le funzioni include e require in PHP https://www.alfredocentinaro.it/lezioni/php/le-funzioni-include-e-require-in-php/ Mon, 20 Jul 2020 06:56:02 +0000 https://www.alfredocentinaro.it/2020/07/20/le-funzioni-include-e-require-in-php/ Le funzioni include e require sono molto semplici da capire ed usare, ma vale la pena concentrarci con qualche esempio per apprezzarne le grandi potenzialità nei siti web complessi. Dopo aver visto una introduzione al PHP con variabili (leggi qui) e strutture di controllo (leggi qui) Le funzioni include e require di PHP hanno uno ... Leggi tutto

L'articolo Le funzioni include e require in PHP proviene da alfredocentinaro.it.

]]>
Le funzioni include e require sono molto semplici da capire ed usare, ma vale la pena concentrarci con qualche esempio per apprezzarne le grandi potenzialità nei siti web complessi.

Dopo aver visto una introduzione al PHP con variabili (leggi qui) e strutture di controllo (leggi qui) Le funzioni include e require di PHP hanno uno scopo semplicissimo: includere ed integrare all’interno di uno script PHP altro codice esistente in altri script, per aggiungere funzionalità o semplificare la manutenzione. Ci sono almeno quattro funzionalità che dobbiamo tenere a mente. Vediamo quali.

Semplificare il layout del sito

Abbiamo spesso visto come con la struttura di un sito web sia fissata dall’inizio scegliendo come suddividere le diverse pagine tra intestazione’ barra di navigazione, barra laterale, footer ad esempio con l’uso dei tag semantici. Queste sezioni sono spesso, se non sempre, ripetute interamente in tutte le pagine del sito web. Mettiamo caso vogliamo modificare il titolo del sito nell’header o il nome di un menù nel nav, questa modifica dovrebbe essere ripetuta in tutte le pagine del sito facendoci perdere un sacco di tempo con la probabilità di perderci una o più pagine nel caso il sito sia davvero molto grande. Tanto vale allora scrivere a parte il codice di queste sezioni creando dei file/script specifici header.php, nav.php, footer.php, in cui inserire il codice delle rispettive sezioni, e richiamare all’interno di ogni pagina del nostro sito questi file per includerli. Un esempio di classica pagina HTML5 con la struttura a tag semantici che abbiamo comunque creato con file .php anche se non c’è, di fatto, codice lato server:

//index.php
<!DOCTYPE html>
<html lang="it">
	<head>
		<title>Esercizio</title>
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<link href="css/style.css" rel="stylesheet" type="text/css">
	</head>
<body>
<header>
	<div id="logo"><img src="img/logo.svg" alt="logo"></div>
	<div id="title">Pagina di prova</div> 
</header>
<nav>
	<a href="#">Home</a>
	<a href="#">Pagina 1</a>
	<a href="#">Pagina 2</a>
	<a href="#">Pagina 3</a>
</nav>
<aside>
    <h2>Pubblicità</h2>
    <img src="img/vertical.jpg" alt="banner verticale">
</aside>
<main>
<h1>Titolo a caso</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</main>

<footer>Realizzato da Alfredo Centinaro</footer>
</body>	
</html>

Come si trasforma il file index.php con i nuovi file di supporto da includere

<!DOCTYPE html>
<html lang="it">
	<head>
		<title>Esercizio</title>
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<link href="css/style.css" rel="stylesheet" type="text/css">
	</head>
<body>
<?php include("header.php") ?>
<?php include("nav.php") ?>
<?php include("aside.php") ?>
<main>
<h1>Titolo a caso</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</main>

<?php include("footer.php") ?>

</body>	
</html>

 Aggiungiamo i file

header.php

<header>
	<div id="logo"><img src="img/logo.svg" alt="logo"></div>
	<div id="title">Pagina di prova</div> 
</header>

nav.php

<nav>
	<a href="#">Home</a>
	<a href="#">Pagina 1</a>
	<a href="#">Pagina 2</a>
	<a href="#">Pagina 3</a>
</nav>

aside.php

<aside>
    <h2>Pubblicità</h2>
    <img src="img/vertical.jpg" alt="banner verticale">
</aside>

footer.php

<footer>Realizzato da Alfredo Centinaro</footer>

Quali controindicazioni ha questa tecnica? Se nel nostro sito ci sono pagine html semplici con estensione .html, bene queste non possono essere più utilizzate perché non saremmo capaci di utilizzarci sopra le funzioni di inclusione o codice php in generale. Poco male direi. Fateci caso: quanti siti usano ancora pagine html pure se non siti poco professionali e di modesta dimensione (eccezion fatta per alcuni CMS che usano strategie particolari)? La funzione include deve essere gestita dal nostro server essendo codice php e ovviamente può introdurre una piccola latenza direi decisamente molto trascurabile rispetto ai vantaggi. Certo, abbiamo una proliferazione di file, nel nostro caso con codice davvero esiguo per l’esempio fatto, ma immaginate quando all’interno va inserito molto codice js, css in linea, codice html articolato e lungo che deve essere mantenuto e modificato spesso. L’esempio è stato fatto sui tag semantici, nulla toglie si possa replicare per qualsiasi frammento di codice html, tag, contenitore vario. Non è un mistero per il lettore attento, se un sito web diventa in questo modo un patchwork di “componenti”, parti più o meno riutilizzabili una o più volte all’interno di una pagina o di un sito web.

Semplificare l’uso di configurazioni

 Negli esercizi più impegnativi pubblicati in queste pagine utilizziamo, per ovvi motivi, il database MySQL. Il codice parziale per collegarsi ad un database da interrogare potrebbe assomigliare al seguente:

$mysql_host = 'localhost';
$mysql_user = 'test';
$mysql_pass = 'test';
$mysql_db = 'test';

/* Connessione e selezione del database */
$connessione = mysqli_connect($mysql_host,$mysql_user,$mysql_pass, $mysql_db);

/** ... query ... */

Questo è un altro esempio lampante di codice ripetuto in modo inutile che può essere semplificato con un include o il suo corrispettivo require  che agisce nel medesimo modo ma più stringente poiché, se per qualche motivo il codice e il suo script non possono essere inclusi o raggiunti, lo script che richiede il caricamento viene arrestato nella sua esecuzione, con ovvi vantaggi sulla sicurezza.

 config.php

$mysql_host = 'localhost';
$mysql_user = 'test';
$mysql_pass = 'test';
$mysql_db = 'test';

e il frammento originale che si trasforma in:

require 'config.php';

/* Connessione e selezione del database */
$connessione = mysqli_connect($mysql_host,$mysql_user,$mysql_pass, $mysql_db);

/** ... query ... */

dove vediamo che le funzione include e require possono essere usate equivalentemente con e senza le parentesi tonde e il parametro del file annesso. In genere web-app complesse possono avere più file di configurazione con svariati nomi più esplicativi come ad esempio config.db.php o utilizzare cartelle e gerarchie su misura inc/config.db.php. 
Suddividendo le variabili della configurazione, metti caso si volesse cambiare database, o credenziali di autenticazione, basterebbe modificare questo file per aggiornare automaticamente tutte le query e similari.

Includere funzioni scritte da noi

Arrivati a questo punto, non è una sorpresa per il lettore che invece di porzioni di codice html o variabili di configurazione, ad essere richiamate in inclusione siano funzioni o frammenti di codice generico php, che magari vogliamo tenere diviso dal normale flusso della pagina e richiamarlo solo al momento di necessità. Facciamo un esempio banale.

<?php

//funzioni aggiuntive
function fuffa(_testo)
{
   echo "Stampo un "._testo;
}

funcition saluta(_saluto)
{
   echo _saluto;
}
 
//codice della pagina
fuffa("ciao");
echo "<br>";
saluta("come stai?");

?>

 In questo frammento c’è la funzione fuffa e saluta che sono poco leggibili e per snellire lo script possiamo procedere a suddividere i codici in due file

funzioni.php

<?php

//funzioni aggiuntive
function fuffa(_testo)
{
   echo "Stampo un "._testo;
}

funcition saluta(_saluto)
{
   echo _saluto;
}
 

?>

e lo script principale che si trasforma e ridimensiona:

<?php

include_once("funzioni.php")
 
//codice della pagina
fuffa("ciao");
echo "<br>";
saluta("come stai?");

?>

qui alla funzione include è stato aggiunto l’operatore _once per indicare che l’inclusione deve essere fatta una sola volta. In questo script non ha molto senso probabilmente, ma in webapp complesse gli script otrebbero includersi e richiamarsi ricorsivamente duplicando magari alcune porzioni di codice. E’ buona norma assicurarsi che le include e require siano fatte una sola volta o usare include_once e require_once per debuggare il codice.

Includere librerie esterne

Ultimo ma probabilmente più intuitivo e scontato. Se al nostro codice dobbiamo aggiungere una funzionalità esterna, una libreria di terze parti, sarà possibile usare le nostre funzioni include e require avendo premura di seguire le istruzioni del produttore/fornitore che segnala file e path da includere. Su questo sito trovate ad esempio un post dedicato all’uso della libreria php fpdf che ha uno stralcio di utilizzo come sotto riportato. Le funzionalità e gli oggetti FPDF non sono standard e necessitano dell’include iniziale per poter essere utilizzate all’interno dello script. Ovviamente il lettore noterà che c’è una cartella fpdf che conterrà tutti gli script necessari alla funzionalità per espletare le proprie competenze.

<?php
include ('fpdf/fpdf.php');

// crea PDF

$pdf = new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial', 'B', 16);
$pdf->Cell(40, 10, 'Report biciclette utente'.$utente);
$pdf->Ln();

L'articolo Le funzioni include e require in PHP proviene da alfredocentinaro.it.

]]>
La funzione header di PHP https://www.alfredocentinaro.it/lezioni/php/la-funzione-header-di-php/ Mon, 23 Dec 2019 09:30:54 +0000 https://www.alfredocentinaro.it/2019/12/23/la-funzione-header-di-php/ Un breve post che punta l’attenzione su una funzione di PHP non proprio banale che ci permette di fare diverse applicazioni interessanti. La funzione header() permette di gestire ed inviare gli header HTTP delle pagine che andiamo a inviare dal server al client/browser. Gli usi sono molteplici ma qui vediamo quelli più interessanti per le ... Leggi tutto

L'articolo La funzione header di PHP proviene da alfredocentinaro.it.

]]>
Un breve post che punta l’attenzione su una funzione di PHP non proprio banale che ci permette di fare diverse applicazioni interessanti.

La funzione header() permette di gestire ed inviare gli header HTTP delle pagine che andiamo a inviare dal server al client/browser. Gli usi sono molteplici ma qui vediamo quelli più interessanti per le esercitazioni prettamente scolastiche.

Una delle funzionalità più usate è il redirect, ovvero uno script PHP viene chiamato, esegue magari un determinato codice anche senza necessariamente produrre un risultato HTML e il browser viene rediretto verso un’altra pagina. Il codice è semplicissimo da provare:

header("Location: http://www.ansa.it");

Per forzare il browser client ad aprire un determinato file che gli stiamo inviando, possiamo forzare l’intestazione della pagina. Ad esempio, se abbiamo generato un PDF con una qualche libreria, potremmo inviarlo al browser specificando, alla fine dello script, la riga di codice:

header("Content-Type: application/pdf");

Analogamente se stiamo lavorando con Ajax e JSON, sicuramente torneremo uno script PHP con heder

header("Content-type:application/json")

Altra applicazione che potrebbe tornare utile è il refresh di uno script magari per segnare un errore e quindi redirigere l’utente sulla pagina iniziale che stava compilando  o altra, in modo automatico. Ad esempio immaginiamo di compilare una form ma si verifica un errore, possiamo temporeggiare qualche istante su un messaggio di errore prima di tornare allo script che ci fa compilare la form in questione. 

header("refresh: 5; url=compilaform.php");
echo "Qualcosa è andato storto! <br>"; 
echo "Ti riporto tra 5 secondi alla compilazione della form o clicca <a href="compilaform.php>qui</a>";

Meno diffuso ma sempre utile è segnalare una risorsa/pagina mancante, magari a fronte di una serie di parametri GET/POST errati

header("HTTP/1.0 404 Not Found");

L'articolo La funzione header di PHP proviene da alfredocentinaro.it.

]]>
Le form col PHP e le variabili $_POST e $_GET https://www.alfredocentinaro.it/lezioni/php/le-form-col-php-e-le-variabili-post-e-get/ Tue, 03 Oct 2023 06:37:43 +0000 https://www.alfredocentinaro.it/?p=5449 Uno degli argomenti introduttivi e più significativi del PHP è quello di poter elaborare i dati, in particolar modo quelli provenienti dall’interazione dell’utente con le pagine web. E’ il caso noto delle form, compilate dagli utenti, i cui dati vengono poi processati ed eventualmente archiviati grazie al PHP e le sue variabili $_POST e $_GET. ... Leggi tutto

L'articolo Le form col PHP e le variabili $_POST e $_GET proviene da alfredocentinaro.it.

]]>
Uno degli argomenti introduttivi e più significativi del PHP è quello di poter elaborare i dati, in particolar modo quelli provenienti dall’interazione dell’utente con le pagine web. E’ il caso noto delle form, compilate dagli utenti, i cui dati vengono poi processati ed eventualmente archiviati grazie al PHP e le sue variabili $_POST e $_GET. Vediamo come approcciarci a questa tecnica.

La form che invia dati allo script PHP

Partiamo da una form molto semplice ma allo stesso tempo completa dei principali campi di input che possiamo incontrare nelle nostre esercitazioni. Potete fare un ripasso rapido delle form in questo altro nostro articolo. Creiamo uno script form.php. In realtà non occorrerebbe necessariamente l’estensione php, ma è buona norma cominciare a rinunciare alle paginette html anche se apparentemente contengono solo il classico codice omonimo. Va anche aggiunto che Google premia la dinamicità, gli aggiornamenti continui e un sito in html, presenta diversi limiti in questi termini.

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Esempio Form</title>
   </head>
  <body>
    <h1>Le form in PHP</h1>

    <form action="pagina.php" method="post">
        <label>Nome:</label><br>
        <input type="text" id="nome" name="nome" placeholder="Inserisci nome..." required size=70><br><br>
        <label>Cognome:</label><br>
        <input type="text" id="cognome" name="cognome" placeholder="Inserisci cognome..." required size="70"><br><br>
        <label>Anno di Nascita:</label><br>
        <input type="number" min=1900 max=3000 name="anno" id="anno"><br><br>
        <label>Città:</label>
          <select id="citta" name="citta">
              <option value="teramo">Teramo</option>
              <option value="chieti">Chieti</option>
              <option value="pescara">Pescara</option>
              <option value="laquila">L'aquila</option>
          </select><br><br>
          <label>Sesso:</label><br>
            <input type="radio" name=sesso id="sesso" value="M">M <br>
            <input type="radio" name=sesso id="sesso" value="F">F <br>
            <input type="radio" name=sesso id="sesso" value="ND">ND <br><br>
        <input type="submit" value="Invia">
    </form>
    
  </body>
</html>

Ribadiamo per il momento di limitarci a codice graficamente poco accattivante per ottenere un risultato come quello nella foto seguente. Essendo uno script PHP, è il server Apache/NGinx o altro analogo WAPP/XAMPP a processarlo nella loro cartella di lavoro

Del codice visto, ci interessano molto alcuni dettagli. I campi di input hanno tutti un attributo “name” specificato. Questo ci permetterà di reperire i valori della form. In queste pagine ci siamo allenati con gli id fondamentali per JavaScript per la manipolazione dei nodi del DOM. Continua a valere questa importanza e nulla toglie di inserire dentro ad un campo di input sia l’attributo name che id, anche con lo stesso termine!

Il secondo elemento di interesse sono i due attributi nel tag form in apertura: method e action. Il primo può assumere due valori post e get. Il primo trasmette i dati della form in modo nascosto, il secondo in modo visibile/intercettabile. Nella maggioranza dei casi, almeno per i nostri esercizi, sarà sempre post. Nella action inseriamo il nome dello script a cui inviare i dati. Sarà per noi sempre uno script PHP con nome arbitrario. (in generale potrebbe essere qualsiasi altro linguaggio di backend, dal buon vecchio perl al python o java o javascript).

Le variabili $_GET e $_POST per ricevere dati

Prepariamo un file pagina.php e apriamo il tag <?php. Essendo una pagina unicamente con codice PHP, non serve chiudere il tag a ?> a fondo pagina. Come prelevare i valori della form che ha richiamato lo script? Ogni volta che effettuiamo un post, il server apache valorizza delle variabili dette superglobali, ovvero che esistono malgrado qualcuno le abbia dichiarate e che transitano tra le pagine senza che il programmatore faccia alcunché. In realtà sarebbe meglio descriverle come dei vettori associativi, nel nostro caso denominati $_GET [] e $_POST [] rispettivamente valorizzati se la form viene inviata col metodo get o post. All’interno del vettore ci saranno tante voci/posizioni, ognuna che riporta un valore del campo name della form inviata a cui ovviamente è associato il rispettivo valore testuale o numerico del campo input.

Se facciamo riferimento alla form di esempio, nello script pagina.php possiamo scrivere il seguente codice per manipolare i dati della form. Scriviamo un banale messaggio di stampa per visualizzare il contenuto.

<?php 


$nome = $_POST['nome'];
$cognome = $_POST['cognome'];
$anno = $_POST['anno'];
$citta = $_POST['citta'];
$sesso = $_POST['sesso'];

echo "Benvenuto $nome $cognome nato nel $anno a $citta di sesso $sesso";

Il risultato atteso è ancora una volta scarno dal punto di vista grafico ma ci da una indicazione importante.

Cosa conviene tenere ben presente? State molto attenti alla coerenza del valore dei campi name della form con quelli delle variabili $_POST. Sarebbe possibile utilizzare i vari elementi di $_POST nel codice ma non conviene, piuttosto creare delle variabili opportune che poi possiamo manipolare con più facilità o immergere negli echo o query sql.

Potrebbe accadere che alcuni campi della form inviata non siano compilati o inviati, perché magari non richiesti. E’ bene allora effettuare un controllo sull’esistenza dell’elemento relativo nel vettore $_POST o $_GET per evitare assegnazioni errate. Esiste una funzione ampiamente usata in PHP e che il lettore dovrebbe utilizzare sempre: isset

if (isset($_POST['nome']))
{
  $nome = $_POST['nome'];
  echo "Ciao $nome!";
}

La variabile $_REQUEST

Altra nota a margine: spesso non è noto a priori se la form PHP invia i dati ad uno script con get o post e quindi non sappiamo quale dei due vettori $_GET o $_POST sia effettivamente valorizzato. Esiste una variabile superglobale analoga a quelle citate che si comporta nello stesso modo e contempla entrambi i vettori $_GET e $_POST ed è $_REQUEST.

L'articolo Le form col PHP e le variabili $_POST e $_GET proviene da alfredocentinaro.it.

]]>
Esercizio con vettore associativo multidimensionale e form di filtro in PHP https://www.alfredocentinaro.it/lezioni/php/esercizio-con-vettore-associativo-multidimensionale-e-form-di-filtro/ Fri, 06 Oct 2023 16:06:57 +0000 https://www.alfredocentinaro.it/?p=5556 In queste pagine abbiamo introdotto il PHP e le sue peculiarità concentrando l’attenzione sulle form (ad es. qui) e gli array associativi (ad es. leggi qui). Vediamo un esercizio con vettore associativo multidimensionale e una form di filtro in modo da racchiudere molti di questi primi e fondamentali elementi del dello scripting PHP. In particolare ... Leggi tutto

L'articolo Esercizio con vettore associativo multidimensionale e form di filtro in PHP proviene da alfredocentinaro.it.

]]>
In queste pagine abbiamo introdotto il PHP e le sue peculiarità concentrando l’attenzione sulle form (ad es. qui) e gli array associativi (ad es. leggi qui). Vediamo un esercizio con vettore associativo multidimensionale e una form di filtro in modo da racchiudere molti di questi primi e fondamentali elementi del dello scripting PHP. In particolare vogliamo:

  • creiamo una paginetta php di prova
  • creare un vettore associativo multidimensionale (es. articoli di magazzino, con categoria, prezzo, nome, descrizione, iva, codice)
  • stampiamo il vettore sotto forma di tabella con una grafica il più possibile gradevole (ad es. con Bootstrap)
  • per ogni riga inseriamo un link che richiami un secondo script php che prende informazioni via URL/GET e stampa i dettagli della riga
  • (DIFFICILE) inseriamo una piccola form di filtro con una tendina ed un bottone di invio dove possiamo selezionare una categoria e filtrare/visualizzare la tabella precedente con solo gli articoli opportuni

La pagina iniziale

Procediamo per step incrementali. Tralasciamo l’ultimo punto più complesso in fondo a questo articolo dopo aver sviluppato i punti precedenti basilari.

Cominciamo dal creare la struttura delle cartelle css/img/js e i due file richiesti index.php e dettagli.php. Entrambi gli script possiamo già riempirli col template base di Bootstrap (lo trovi qui) per ottenere un risultato grafico più gradevole. Il risultato potrebbe essere quello che segue.

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Esercizio 00</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
  </head>
  <body>
    <div class="container">
    <h1>La mia lista di articoli</h1>


     </div>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL" crossorigin="anonymous"></script>
  </body>
</html>

Il vettore associativo multidimensionale

Occupiamoci della prima richiesta del nostro esercizio php e del vettore associativo multidimensionale. Apriamo una coppia di tag <?php e scriviamo in modo il più leggibile possibile il vettore, vendo cura di inserire più righe con valori di esempio.

$magazzino = 
[
    "ID000" => ["nome"=>"Borsa in pelle", "descrizione"=>"Borsa in pelle da donna in cuoio marrone", "prezzounitario"=>200.50, "iva"=>22, "categoria"=>"abbigliamento"],
    "ID001" => ["nome"=>"Mocassino in cuoio", "descrizione"=>"Mocassino in cuoio marrone", "prezzounitario"=>60.00, "iva"=>22, "categoria"=>"abbigliamento"],
    "ID002" => ["nome"=>"Scolapasta elettrico", "descrizione"=>"Scolapasta a pile", "prezzounitario"=>15.90, "iva"=>22, "categoria"=>"casa"],
    "ID003" => ["nome"=>"Cioccolatini misti", "descrizione"=>"Scatola cioccolatini assortiti", "prezzounitario"=>10.00, "iva"=>10, "categoria"=>"alimentari"],
    "ID004" => ["nome"=>"Tazza latte", "descrizione"=>"Tazza cilindrica in ceramica con manico", "prezzounitario"=>6.00, "iva"=>22, "categoria"=>"casa"]
]

Prestiamo ben attenzione alle virgole e le voci con i relativi dati inventati. La struttura del vettore deve essere analoga in ogni parte similare, anche nell’uso delle virgolette.

Passo successivo, prepariamo la tabella. Ci sono due elementi della tabella da tenere presenti l’intestazione/piede che è statica, codice da scrivere una tantum senza doverlo replicare. Il codice lo possiamo scrivere da zero o copiare dal manuale di Bootstrap senza troppi complimenti (vedi qui). Non ci resta che inserire la parte di codice dinamica, nel listato rappresentato col ….?

<table class="table table-bordered">
<thead>
    <tr>
      <th scope="col">#</th>
      <th scope="col">Nome</th>
      <th scope="col">Descrizione</th>
      <th scope="col">Categoria</th>
      <th scope="col">Dettagli</th>
    </tr>
  </thead>
  <tbody>

.....?

</tbody>  
</table>

Apriamo nuovamente i tag <?php ?>. Come vedete possiamo piazzarli in più punti del listato html per far eseguire al server solo porzioni ridotte di codice php. Quello che segue credo di poter affermare sia un frammento di codice fondamentale da padroneggiare per un programmatore PHP. E’ vero che lo stesso risultato si possa ottenere in più modi ma il principio rimane fondamentale. Apriamo un ciclo, qui scegliamo il foreach ma poteva essere in modo analogo un while o for con qualche passaggio in più. Il foreach ci consente di creare due indici che puntano alla struttura del nostro vettore associativo, qui $codice che contiene l’indice IDXXX e $ articolo che conterrà l’intero sub-array associativo con le informazioni vere e proprie dell’articolo. Possiamo così piazzare i dati in comode variabili con nomi più semplici da scrivere, da riutilizzare ed immergere con più facilità nel codice successivo.

  foreach ($magazzino as $codice => $articolo)
  {
    $nome = $articolo["nome"];
    $descrizione = $articolo["descrizione"];
    $prezzounitario = $articolo["prezzounitario"];
    $categoria = $articolo["categoria"];

    echo "<td>$codice</td>";
    echo "<td>$nome</td>";
    echo "<td>$descrizione</td>";
    echo "<td>$categoria</td>";
    echo "<td><a href=\"dettaglio.php\">Leggi tutto=></a></td>";
    echo "</tr>";
  
  }

Possiamo salvare ed eseguirci lo script col nostro web server preferito in localhost o su un dominio di prova tipo Altervista o Host000.

La stampa con colore alternato

Complichiamoci la vita, ed aggiungiamo la zebratura alternata per le righe bianche/grige. In realtà per il programmatore in erba è un problema visto e rivisto, solo ora con una applicazione grafica di realtà. Ci occorrerà una variabile per contare le righe ed una if che ci permetta di scegliere righe dispari e pari. A quel punto le righe dispari le possiamo modificare aggiungendo una classe di Bootstrap che inserisce il colore di sfondo. L’indice va ovviamente incrementato a fine stampa/giro.

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Esercizio 00</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
  </head>
  <body>
    <div class="container">
    <h1>La mia lista di articoli</h1>

<?php
//voglio creare un vettore associativo di articoli
//li stampa con una tabella graficamente gradevole a righe alternate
//per ogni riga inserisco un link che punta ad un secondo script che mostra i dettagli
//in questa stessa pagina inserisco un filtro per visualizzare in tabella solo un dettaglio come la catagoria

$magazzino = 
[
    "ID000" => ["nome"=>"Borsa in pelle", "descrizione"=>"Borsa in pelle da donna in cuoio marrone", "prezzounitario"=>200.50, "iva"=>22, "categoria"=>"abbigliamento"],
    "ID001" => ["nome"=>"Mocassino in cuoio", "descrizione"=>"Mocassino in cuoio marrone", "prezzounitario"=>60.00, "iva"=>22, "categoria"=>"abbigliamento"],
    "ID002" => ["nome"=>"Scolapasta elettrico", "descrizione"=>"Scolapasta a pile", "prezzounitario"=>15.90, "iva"=>22, "categoria"=>"casa"],
    "ID003" => ["nome"=>"Cioccolatini misti", "descrizione"=>"Scatola cioccolatini assortiti", "prezzounitario"=>10.00, "iva"=>10, "categoria"=>"alimentari"],
    "ID004" => ["nome"=>"Tazza latte", "descrizione"=>"Tazza cilindrica in ceramica con manico", "prezzounitario"=>6.00, "iva"=>22, "categoria"=>"casa"]
]

?>

<table class="table table-bordered">
<thead>
    <tr>
      <th scope="col">#</th>
      <th scope="col">Nome</th>
      <th scope="col">Descrizione</th>
      <th scope="col">Categoria</th>
      <th scope="col">Dettagli</th>
    </tr>
  </thead>
  <tbody>

<?php
  $indice = 0;

  foreach ($magazzino as $codice => $articolo)
  {
    $nome = $articolo["nome"];
    $descrizione = $articolo["descrizione"];
    $prezzounitario = $articolo["prezzounitario"];
    $categoria = $articolo["categoria"];

    if ($indice % 2 == 0)
      echo "<tr>";
    else
      echo "<tr class=\"table-secondary\">";

    echo "<td>$codice</td>";
    echo "<td>$nome</td>";
    echo "<td>$descrizione</td>";
    echo "<td>$categoria</td>";
    echo "<td><a href=\"dettaglio.php\">Leggi tutto=></a></td>";
    echo "</tr>";

    $indice += 1; 
   
  }
   
?>

</tbody>  
</table>

    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL" crossorigin="anonymous"></script>
  </body>
</html>

Lo script dettagli

Vediamo lo script che visualizza i dettagli del singolo articolo della tabella. Nelle tabelle precedenti abbiamo riportato in modo semplicistico la riga

    echo "<td><a href=\"dettaglio.php\">Leggi tutto=></a></td>";

Vogliamo passare allo script tutti valori da stampare in dettaglio. Nulla di più semplice visto che sappiamo come funziona la gestione del GET sia da parte dell’url, sia dal reperimento dei valori della variabile superglobale.

$prezzo = $articolo["prezzounitario"];
$iva = $articolo["iva"];
<a href=\"dettagli.php?codice=$codice&nome=$nome&descrizione=$descrizione&prezzo=$prezzo&categoria=$categoria&iva=$iva>Leggi tutto=></a></td>";

Non ci resta che preaparare lo script dettagli.php dove preleviamo i valori del $_GET e li stampiamo

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Dettagli Articolo</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
  </head>
  <body>
    <div class="container">
    <h1>Dettagli articolo</h1>
    <?php
    
    if (isset($_GET['nome']))
    {
        $codice = $_GET['codice'];
        $nome = $_GET['nome'];
        $descrizione = $_GET['descrizione'];
        $prezzo = $_GET['prezzounitario'];
        $iva = $_GET['iva'];
        $categoria = $_GET['categoria'];

        echo "<b>ID: </b>$codice <br>";
        echo "<b>Nome: </b>$nome <br>";
        echo "<b>Descrizione: </b>$descrizione <br>";
        echo "<b>Categoria: </b>$categoria <br>";
        echo "<b>Prezzo U: </b>$prezzo <br>";
        echo "<b>IVA: </b>$iva <br>";
    }
    
    ?>
    </div>
  </body>
</html>

La form di filtro

Veniamo alla porzione di esercizio forse più complessa per un alunno alle prime armi col PHP e il filtraggio di un vettore multidimensionale. Prepariamo una piccola formettina in codice html da posizionare prima dell’intestazione della tabella. Qui scegliamo di mettere una tendina ma il discorso potrebbe essere analogo con qualsiasi altra tipologia di input, dalla casella testuale, numerica, radio button ecc.

La form non presenta particolari criticità se non la cosa strana che oltre al method=”post”, la action punti ancora a questa pagina index.php. Una form che invia dati alla stessa pagina in cui si chiama? Concetto un po’ bizzarro ma non così strano da afferrare.

<form method="post" action="index.php">
<label for="cat">Scegli una categoria:</label>
  <select id="cat" name="cat">
    <option value="tutto">Tutto</option>
    <option value="abbigliamento">Abbigliamento</option>
    <option value="alimentari">Alimentari</option>
    <option value="casa">Casa</option>
  </select> 
  <input type="submit" value="Filtra">
</form>

A questo punto dobbiamo creare due filoni di codice: uno prevede che la pagina sia chiamata non dalla form ma dal flusso ordinario del sito web e il secondo flusso che la pagina venga chiamata dalla form con tanto di variabili post inizializzate, nel nostro caso solo quella che contiene il valore scelto della tendina. Verifico quindi se esiste la variabile superglobale $_POST[“cat”] e ne prelevo il valore. A questo punto nel ciclo foreach se la variabile $categoria è valorizzata filtro con un if i valori del vettore, mentre se la variabile categoria non è valorizzata o ha valore “tutto” allora mostro la tabella normale e completa di tutti i dati.

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Esercizio 00</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
  </head>
  <body>
    <div class="container">
    <h1>La mia lista di articoli</h1>

<?php
//voglio creare un vettore associativo di articoli
//li stampa con una tabella graficamente gradevole a righe alternate
//per ogni riga inserisco un link che punta ad un secondo script che mostra i dettagli
//in questa stessa pagina inserisco un filtro per visualizzare in tabella solo un dettaglio come la categoria


$magazzino = 
[
    "ID000" => ["nome"=>"Borsa in pelle", "descrizione"=>"Borsa in pelle da donna in cuoio marrone", "prezzounitario"=>200.50, "iva"=>22, "categoria"=>"abbigliamento"],
    "ID001" => ["nome"=>"Mocassino in cuio", "descrizione"=>"Mocassino in cuoio marrone", "prezzounitario"=>60.00, "iva"=>22, "categoria"=>"abbigliamento"],
    "ID002" => ["nome"=>"Scolapasta elettrico", "descrizione"=>"Scolapasta a pile", "prezzounitario"=>15.90, "iva"=>22, "categoria"=>"casa"],
    "ID003" => ["nome"=>"Cioccolatini misti", "descrizione"=>"Scatola cioccolatini assortiti", "prezzounitario"=>10.00, "iva"=>10, "categoria"=>"alimentari"],
    "ID004" => ["nome"=>"Tazza latte", "descrizione"=>"Tazza cilindrica in ceramica con manico", "prezzounitario"=>6.00, "iva"=>22, "categoria"=>"casa"]
]

?>

<form method="post" action="index.php">
<label for="cat">Scegli una categoria:</label>
  <select id="cat" name="cat">
    <option value="tutto">Tutto</option>
    <option value="abbigliamento">Abbigliamento</option>
    <option value="alimentari">Alimentari</option>
    <option value="casa">Casa</option>
  </select> 
  <input type="submit" value="Filtra">
</form>


<table class="table table-bordered">
<thead>
    <tr>
      <th scope="col">#</th>
      <th scope="col">Nome</th>
      <th scope="col">Descrizione</th>
      <th scope="col">Categoria</th>
      <th scope="col">Dettagli</th>
    </tr>
  </thead>
  <tbody>
<?php
  $indice = 0;

  if (isset($_POST["cat"]))
  {
    $filtro = $_POST["cat"];
    //echo $filtro;
  }  

  foreach ($magazzino as $codice => $articolo)
  {

    $nome = $articolo["nome"];
    $descrizione = $articolo["descrizione"];
    $prezzounitario = $articolo["prezzounitario"];
    $categoria = $articolo["categoria"];


    if ($filtro && $categoria == $filtro)
    {
        if ($indice % 2 == 0)
          echo "<tr class=\"table-secondary\">";
        else
          echo "<tr>";
  
      echo "<td>$codice</td>";
      echo "<td>$nome</td>";
      echo "<td>$descrizione</td>";
      echo "<td>$categoria</td>";
      echo "<td><a href=\"dettaglio.php?id=$codice\">Leggi tutto=></a></td>";
      echo "</tr>";
  
      $indice += 1; 
    }
    
    if (!$filtro || $filtro =="tutto")
    {
      if ($indice % 2 == 0)
        echo "<tr class=\"table-secondary\">";
      else
        echo "<tr>";

      echo "<td>$codice</td>";
      echo "<td>$nome</td>";
      echo "<td>$descrizione</td>";
      echo "<td>$categoria</td>";
      echo "<td><a href=\"dettaglio.php?id=$codice\">Leggi tutto=></a></td>";
      echo "</tr>";

      $indice += 1; 

    }
  }
    
?>

</tbody>  
</table>

L'articolo Esercizio con vettore associativo multidimensionale e form di filtro in PHP proviene da alfredocentinaro.it.

]]>