Backend PHP per sistema di registrazione utenti con form Angular. Gestisce autenticazione, validazione dati e persistenza su MySQL.
- PHP 7.4+
- MySQL 5.7+
- XAMPP (sviluppo locale)
- DevExtreme (componenti form frontend)
backend/
├── api/ # Endpoint API REST
│ ├── process-form.php # Inserisce nuove registrazioni
│ ├── select.php # Ricerca comuni (lazy loading)
│ ├── select-cap.php # Recupera CAP per comune
│ └── registrazioni.php # Lista registrazioni
├── models/ # Classi PHP
│ ├── classes.php # Database + Utility (gestisce .env)
│ └── users.php # Modello User con password hashing
├── .env.example # Template variabili d'ambiente
├── .gitignore # File da escludere da Git
└── README.md # Questo file
- XAMPP installato con MySQL in esecuzione
- PHP 7.4+
- Git
cd C:\xampp\htdocs
git clone https://github.com/jrambyte/angular_form.git backend-php
cd backend-phpCopia il template:
cp .env.example .envModifica .env con le tue credenziali locali (se diversi da default):
DB_HOST=localhost
DB_PORT=3306
DB_USER=root
DB_PASSWORD=
DB_NAME_COMUNI=comuni_db
DB_NAME_REGISTRAZIONI=registrazioni_formImportante: .env NON deve mai essere committato su GitHub (protetto da .gitignore).
Importa gli schema dei database in MySQL:
# Database comuni ISTAT
mysql -u root < gi_db_comuni.sql
# Database registrazioni (crea tabella dati_form se non esiste)
mysql -u root registrazioni_form < schema.sqlSe tutto è configurato correttamente, una richiesta GET a:
http://localhost/backend-php/api/registrazioni.php
Dovrebbe ritornare:
{
"status": "success",
"message": "Dati recuperati con successo",
"data": [],
"count": 0
}Il file classes.php carica le credenziali da .env al runtime:
// In classes.php
if (file_exists(__DIR__ . '/../.env')) {
$lines = file(__DIR__ . '/../.env', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($lines as $line) {
if (strpos($line, '=') !== false && strpos($line, '#') !== 0) {
list($key, $value) = explode('=', $line, 2);
putenv(trim($key) . '=' . trim($value));
}
}
}Vantaggi:
- Credenziali separate dal codice
- Stesse credenziali per dev/staging/prod (cambiano solo in
.env) - Sicuro:
.envè in.gitignore
Gestisce connessione a MySQL con credenziali da .env:
$database = new Database("comuni_db");
$db = $database->getConnection();
// uso della connessione
$database->closeConnection();Modello per registrazione utenti con hashing password:
$user = new User($db);
$user->nome = "Mario";
$user->email = "mario@example.com";
$user->password = "P@ssw0rd123";
$user->insert(); // Hashata con bcryptFunzioni statiche di servizio:
formDataToArray()— Converte POST/JSON in arraysanitizeInput()— Rimuove HTML e caratteri pericolosisendResponse()— Invia JSON standardizzato
- Angular frontend invia POST a
process-form.phpcon dati form - process-form.php riceve, sanitizza, valida, crea
User - User::insert() verifica email duplicata, hashata password, inserisce DB
- Risposta ritorna ID utente e messaggio di successo
Request (JSON):
{
"nome": "Mario",
"cognome": "Rossi",
"email": "mario@example.com",
"codiceFiscale": "RSSMRA85A01H501K",
"comuneResidenza": 1234,
"cap": "50125",
"sesso": "Uomo",
"password": "P@ssw0rd123"
}Response (success):
{
"status": "success",
"message": "Registrazione completata con successo",
"id": 42,
"data": {
"id": 42,
"nome": "Mario",
"email": "mario@example.com"
}
}Ricerca comuni con lazy loading.
Response:
{
"status": "success",
"data": [
{ "id": "H501", "text": "Roma" },
{ "id": "H502", "text": "Rometta" }
]
}Recupera CAP per un comune specifico.
Response:
{
"status": "success",
"data": [
{ "id": 1, "cap": "00100" },
{ "id": 2, "cap": "00118" }
]
}Lista tutte le registrazioni con JOIN a comuni.
Response:
{
"status": "success",
"data": [
{
"id": 1,
"nome": "Mario",
"cognome": "Rossi",
"email": "mario@example.com",
"comuneResidenza": { "id": 1234, "text": "Roma" },
"dataRegistrazione": "2025-11-04 10:30:00"
}
],
"count": 1
}- ✅ Password hashing: bcrypt (
password_hash()) - ✅ SQL injection prevention: Prepared statements (
mysqli::prepare()) - ✅ XSS prevention:
htmlspecialchars()su output - ✅ Credenziali separate:
.envnon committato - ✅ CORS headers: Gestiti in ogni endpoint
- Crea file
api/novo-endpoint.php - Includi
classes.phpeusers.phpse necessario - Segui il pattern: headers → validazione → logica → risposta JSON
- Commit e push
Log di errore in php_error_log (configurato in php.ini):
# XAMPP: visualizza log
tail -f C:\xampp\php\logs\php_error_log- Imposta variabili d'ambiente a livello di sistema (server)
.envrimane locale (non è sul server)- PHP legge automaticamente da
getenv()le variabili del server - Deploy: clone repo, niente
.envnecessario
Per issues o domande, apri una issue su GitHub o contatta il maintainer.
Progetto privato. Tutti i diritti riservati.