Ho tolto il CSS, al momento non era rilevante (ti consiglio in ogni caso di usare un foglio di stile esterno).
Come al solito, non ho modo di testarlo quindi potrebbero mancare punti e virgola od esserci altri errori di sintassi.
Codice PHP:
<?php
////////////////////////////////////////////////////////////////////////
// Connessione alla base di dati
// NOTA: La connessione è disponibile nella variabile globale $con
require_once("connettimysqli.php");
////////////////////////////////////////////////////////////////////////
// Controllo su dati inviati dal form
// Se sono stai inviati dei dati, la richiesta di inserimento di un utente
// viene elaborata
if (!empty($_POST)) {
// Lettura e validazione dei parametri
$id = mysqli_real_escape_string($con, $_POST['id']);
$cognome = mysqli_real_escape_string($con, $_POST['cognome']);
$nome = mysqli_real_escape_string($con, $_POST['nome']);
$giorno = mysqli_real_escape_string($con, $_POST['giorno']);
$mese = mysqli_real_escape_string($con, $_POST['mese']);
$anno = mysqli_real_escape_string($con, $_POST['anno']);
$nazionalita = mysqli_real_escape_string($con, $_POST['nazionalita']);
$citta = mysqli_real_escape_string($con, $_POST['citta']);
$prov = mysqli_real_escape_string($con, $_POST['prov']);
$username = mysqli_real_escape_string($con, $_POST['username']);
$email = mysqli_real_escape_string($con, $_POST['email']);
$ripemail = mysqli_real_escape_string($con, $_POST['ripemail']);
$password = mysqli_real_escape_string($con, $_POST['password']);
$rippassword = mysqli_real_escape_string($con, $_POST['rippassword']);
// Controlla che la data inserita sia valida e la codifica nel formato aaaammgg
if (!checkdate($mese, $giorno, $anno)) {
echo "<p><strong>Errore</strong>: Data non valida</p>";
}
$nascita = sprintf("%04d%02d%02d", $anno, $mese, $giorno);
// Inserimento nella tabella utenti
$query = "INSERT INTO utenti (cognome, nome, nascita, nazionalita, username, email, password) "
. "VALUES('$cognome','$nome','$nascita','$nazionalita','$username','$email','$password')";
$result = mysqli_query($con, $query);
if ($result !== false) {
echo "<p>Inserimento avvenuto correttamente<p>";
} else {
echo "<p>Inserimento non eseguito.<br />"
echo "<strong>Errore</strong>: " . mysqli_error($con) . "</p>";
}
}
?>
<DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<div id="intestazione">
<h2>BENVENUTI NEL MODULO D'ISCRIZIONE</h2>
<hr>
</div>
<div id="divhr">
<form method="POST" autocomplete="off" action="<?php $_SERVER['PHP_SELF'] ?>">
<!-- Cognome -->
<p>
<label for="campo-cognome">Cognome: </label>
<input type="text" name="cognome" required />
</p>
<!-- Nome -->
<p>
<label for="campo-nome">Nome: </label>
<input type="text" name="nome" required />
</p>
<!-- Data di nascita -->
Seleziona la data di nascita (gg/mm/aaaa):
<!-- Giorno -->
<select name="giorno">
<option value="">Scegli giorno: </option>
<?php for ($i = 0; $i < 32; $i++): ?>
<option value="<?= $i ?>"><?= $i ?></option>;
<?php endfor; ?>
</select>
<!-- Mese -->
<select name="mese">
<option value="">Scegli mese: </option>
<?php for ($i = 1; $i < 13; $i++): ?>
<option value="<?= $i ?>"><?= $i ?></option>
<?php endfor; ?>
</select>
<!-- Anno -->
<select name="anno">
<option value="">Scegli anno: </option>
<?php for ($i = 2012; $i >= 1920; $i--): ?>
<option value="<?= $i ?>"><?= $i ?></option>
<?php endfor; ?>
</select>
<!-- Nuova nazionalità (non presente nella lista) -->
<div id = "posnazionalita">
<p>
<label for="campo-nazionalita">Nazionalità: </label>
<input type="text" name="nazionalita" required/>
</p>
</div>
<!-- Nazionalità (lista di nazionalità già inserite, non compare se vuota) -->
<?php
// Lettura nazionalità presenti nella base di dati
$checknazionalita = "SELECT DISTINCT nazionalita FROM utenti ORDER BY nazionalita";
$result = mysqli_query($con, $checknazionalita);
if ($result === false) {
echo "<strong>Errore</strong>: " . mysqli_error($con);
}
$nazionalite = array();
while ($row = mysqli_fetch_assoc($result)) {
$nazionalite[] = $row['nazionalita'];
}
?>
<?php if (!empty($nazionalita)): ?>
<select name="nazionalita">
<option value="">-seleziona-</option>
<?php foreach ($nazionalita as $entry): ?>
<option value="<?= $entry ?>"><?= $entry ?></option>
<?php endforeach; ?>
</select>
<?php endif; ?>
<!-- Nome utente -->
<div id="posusername">
<p>
<label for="campo-username">Username: </label>
<input type="text" name="username" required/>
</p>
</div>
<!-- Email -->
<div id="posemail">
<p>
<label for="campo-email">Email: </label>
<input type="text" name="email" required/>
</p>
</div>
<!-- Ripeti email -->
<div id="posripemail">
<p>
<label for="campo-ripemail">Ripeti-Email: </label>
<input type="text" name="ripemail" required/>
</p>
</div>
<!-- Password -->
<div id="pospassword">
<p>
<label for="campo-password">Password: </label>
<input type="password" name="password" required/>
</p>
</div>
<!-- Ripeti password -->
<div id="posripassword">
<p>
<label for="campo-ripemail">Ripeti-Password: </label>
<input type="password" name="rippassword" required/>
</p>
</div>
<!-- Taso "Invio dati" -->
<div id="postasto">
<input type="submit" name="reg" value="Invio dati" id="submit" />
</div>
</form>
</div>
<?php
echo '<div id="posdata">';
require_once("data.php");
echo "</hr>";
?>
</body>
</html>
Dunque:
- il blocco di PHP all'inizio della pagina (racchiuso dentro if (!empty($_POST)) è quello che gestisce le richieste per la creazione di nuovi utenti; è tutto racchiuso in quel blocco, è bene che il codice stia "insieme" piuttosto che separato; poi a me (ed immagino anche ad altri) piace gestire le richieste in cima alla pagina, in modo da avere prima l'interazione con la base di dati e poi potermi occupare solo dell'HTML, ma questa è esclusivamente una questione di gusti (potresti mettere il codice in fondo alla pagina, od usarne una diversa)
- require_once("connettimysqli.php"); ti serve per avere a disposizione la variabile $con e, siccome la usi in vari punti della pagina per interagire con la base di dati, è bene che sia in cima, tra le prime istruzioni. In questo modo ce l'hai a disposizione in tutta la pagina (a voler fare i fini questo definisce un contesto globale che, per varie ragioni, può avere controindicazioni, ma in questo caso specifico va bene)
- La lettura delle nazionalità già presenti l'ho lasciata in mezzo al codice dove l'ho trovata. Se non ti piace lì puoi spostarla in cima alla pagina per separare PHP ed HTML.
- Il form in HTML ora è diviso per bene in "blocchetti", uno per ogni input
- Varie correzioni minori come tag non chiusi
Infine, questo frammento non so cosa faccia, quindi l'ho lasciato dov'era:
Codice PHP:
<?php
echo '<div id="posdata">';
require_once("data.php");
echo "</hr>";
?>
Il tutto resta comunque da testare.