📌 AJAX Fetch API e PHP: caricare dati dinamici

Caricare dati dal backend senza ricaricare la pagina: crei un endpoint PHP che restituisce JSON e lo consumi con Fetch API in JavaScript per aggiornare il DOM in modo pulito e controllato.

Portatile con schema di scambio dati tra AJAX, Fetch, JSON, PHP, database e server, accanto a un quaderno con diagrammi API.

Autore: Redazione · Creato: 24/02/2026 18:34

Caricare dati dinamici con AJAX, Fetch API e PHP

Se stai sviluppando un sito con HTML, JavaScript e PHP, prima o poi vuoi una cosa semplice: caricare dati dal server senza ricaricare la pagina. Il modo moderno per farlo è usare la Fetch API (al posto del vecchio XMLHttpRequest).

Perché Fetch API (e non XMLHttpRequest)

  • Codice più pulito e leggibile (soprattutto con async/await)
  • Migliore gestione di JSON, errori e status HTTP
  • Supporto totale sui browser moderni

In questa guida creiamo:

  1. un endpoint PHP che legge dal database e restituisce JSON
  2. una pagina HTML che richiama l’endpoint con fetch e visualizza i dati

1) Endpoint PHP che restituisce JSON

Crea un file chiamato data.php. Qui sotto trovi una versione robusta con PDO: imposta header JSON, gestisce errori senza esporre dettagli sensibili e restituisce un array.

<?php
declare(strict_types=1);

header('Content-Type: application/json; charset=utf-8');

// In produzione: NON hardcodare credenziali.
// Usa variabili d'ambiente o un file di config non pubblico.
$host = "localhost";
$db   = "database";
$user = "username";
$pass = "password";

$dsn = "mysql:host={$host};dbname={$db};charset=utf8mb4";

try {
    $pdo = new PDO($dsn, $user, $pass, [
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES   => false,
    ]);

    // Esempio: tabella users(id, name)
    $stmt = $pdo->query("SELECT id, name FROM users ORDER BY id ASC");
    $data = $stmt->fetchAll();

    http_response_code(200);
    echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);

} catch (Throwable $e) {
    // Non mostrare errori al client (loggali lato server se serve).
    http_response_code(500);
    echo json_encode(["error" => "Server error"]);
}

Risultato: chiamando data.php ottieni una risposta JSON tipo:

[
  {"id":1,"name":"Mario"},
  {"id":2,"name":"Giulia"}
]

2) Frontend HTML + JavaScript con Fetch (async/await)

Ora creiamo una pagina che carica i dati quando premi un pulsante e aggiorna il DOM. Niente onclick inline: usiamo addEventListener (più pulito, più manutenibile).

<!doctype html>
<html lang="it">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Caricare dati dinamici con AJAX, Fetch API e PHP</title>
</head>

<body>

  <h2>Elenco utenti</h2>

  <button id="btn-load" type="button">Carica utenti</button>
  <p id="status" aria-live="polite"></p>

  <ul id="user-list"></ul>

  <script>
    const btn = document.getElementById('btn-load');
    const list = document.getElementById('user-list');
    const status = document.getElementById('status');

    btn.addEventListener('click', loadData);

    async function loadData() {
      status.textContent = 'Caricamento...';
      list.innerHTML = '';

      try {
        const res = await fetch('data.php', {
          headers: { 'Accept': 'application/json' }
        });

        if (!res.ok) {
          throw new Error(`HTTP ${res.status}`);
        }

        const data = await res.json();

        if (!Array.isArray(data)) {
          throw new Error('Risposta non valida (atteso array JSON)');
        }

        for (const user of data) {
          const li = document.createElement('li');
          li.textContent = user.name;
          list.appendChild(li);
        }

        status.textContent = `OK: ${data.length} utenti caricati.`;

      } catch (err) {
        console.error(err);
        status.textContent = 'Errore nel caricamento dei dati.';
      }
    }
  </script>

</body>
</html>

Quando premi il pulsante:

  • fetch richiama data.php
  • la risposta viene convertita in JSON
  • il contenuto viene renderizzato in lista senza refresh

3) Note tecniche che fanno la differenza

HTTP status: non “solo JSON”, ma anche semantica

  • 200 quando tutto va bene
  • 500 se il server fallisce (senza rivelare dettagli)
  • 404 se l’endpoint non esiste (routing errato)

Same-origin e CORS

Se frontend e backend stanno sullo stesso dominio, non hai problemi. Se invece chiami un altro dominio, devi configurare il CORS (Access-Control-Allow-Origin) lato server.

Sicurezza pratica

  • Non stampare eccezioni PDO al client (logga lato server)
  • Usa variabili d’ambiente per credenziali DB
  • Se ricevi input (query, filtri), usa prepared statements

Debug rapido

Prova l’endpoint direttamente dal browser o con curl:

curl -i https://TUO-DOMINIO/data.php

Conclusione

Con questo schema (PHP che restituisce JSON + Fetch API in JavaScript) ottieni interfacce più fluide, meno pesanti e più moderne: il contenuto si aggiorna in tempo reale senza ricaricare l’intera pagina. È la base solida per dashboard, liste, filtri, ricerca live e paginazione.

Messaggio sponsorizzato
Pubblicità

🔗 Condividi l'articolo:

Autore: Redazione · Creato: 24/02/2026 18:34 · Ultima modifica: 03/09/2026 12:18