Come inserire dati in un database MySQL con PHP
Guida completa all'inserimento di dati in un database MySQL tramite PHP, con esempi pratici e istruzioni sulle prepared statement.
Inserire dati è il modo in cui un'applicazione PHP scrive in un database MySQL — salvando un nuovo utente, registrando un ordine, memorizzando un commento. Ogni scrittura di questo tipo è un'istruzione SQL INSERT INTO che PHP invia tramite una connessione al database aperta. Questo articolo illustra il flusso completo con l'estensione mysqli, mostrando poi il metodo più sicuro e moderno tramite le prepared statement, da preferire nei progetti reali.
Cosa imparerai
- Come aprire una connessione ed eseguire un
INSERTdi base - Perché concatenare valori nell'SQL è pericoloso e come le prepared statement risolvono il problema
- Come recuperare l'ID auto-generato della riga appena inserita
- Come inserire più righe in modo efficiente
Prerequisiti
Prima di iniziare, è necessario avere:
- Un server web con PHP (7.4+) e l'estensione
mysqliinstallata - Un database MySQL (o MariaDB) in esecuzione
- Uno strumento di gestione del database come phpMyAdmin, oppure l'accesso da riga di comando
Questi esempi assumono l'esistenza di una tabella users. Puoi crearla con:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
email VARCHAR(100)
);Se non hai ancora creato tabelle, consulta Creare una tabella MySQL.
Passo 1: Stabilire una connessione
Il primo passo è connettersi al database con mysqli_connect(), che accetta quattro argomenti: l'host del server, il nome utente, la password e il nome del database. Restituisce un oggetto di connessione da riutilizzare per ogni query.
<?php
$server = "localhost";
$username = "root";
$password = "password";
$database = "database_name";
$conn = mysqli_connect($server, $username, $password, $database);
// Always check the connection before continuing.
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "Connected successfully";
?>mysqli_connect_error() restituisce un messaggio leggibile quando la connessione fallisce — password errata, host non raggiungibile o database mancante — in modo da non dover indovinare la causa.
Passo 2: Eseguire un INSERT di base
Con la connessione pronta, puoi eseguire una query INSERT usando mysqli_query(). Accetta la connessione e la stringa SQL, e restituisce true in caso di successo o false in caso di errore.
<?php
$sql = "INSERT INTO users (first_name, last_name, email)
VALUES ('John', 'Doe', '[email protected]')";
if (mysqli_query($conn, $sql)) {
echo "New record created successfully";
} else {
echo "Error: " . mysqli_error($conn);
}
?>Questo funziona con valori fissi, ma nel momento in cui qualsiasi parte della query proviene dall'input dell'utente, diventa pericoloso. Un valore come O'Reilly (con apostrofo) rompe l'SQL, e un valore malevolo può riscrivere completamente la query — questo è l'SQL injection. Non creare mai query concatenando l'input dell'utente in una stringa.
Passo 3: Inserire in modo sicuro con le prepared statement
Una prepared statement invia lo schema SQL e i dati separatamente. I segnaposto (?) indicano dove vanno i valori, e mysqli_stmt_bind_param() associa ogni valore con il suo tipo (s per stringa, i per intero, d per double, b per blob). MySQL tratta i valori associati strettamente come dati, quindi l'injection è impossibile e le virgolette vengono gestite automaticamente.
<?php
// 1. Prepare the statement with placeholders.
$stmt = mysqli_prepare(
$conn,
"INSERT INTO users (first_name, last_name, email) VALUES (?, ?, ?)"
);
// 2. Bind the input values: three strings -> "sss".
$first_name = "Jane";
$last_name = "Smith";
$email = "[email protected]";
mysqli_stmt_bind_param($stmt, "sss", $first_name, $last_name, $email);
// 3. Execute, then clean up.
if (mysqli_stmt_execute($stmt)) {
echo "New record created successfully";
} else {
echo "Error: " . mysqli_stmt_error($stmt);
}
mysqli_stmt_close($stmt);
?>Questo è l'approccio da usare in qualsiasi applicazione reale. Per un approfondimento, consulta PHP MySQL Prepared Statements.
Ottenere l'ID inserito
Quando una tabella ha una chiave primaria AUTO_INCREMENT, MySQL assegna automaticamente l'id alla nuova riga. Recuperalo con mysqli_insert_id() — utile quando hai bisogno dell'ID per una query successiva o per restituirlo all'utente.
<?php
mysqli_query($conn, "INSERT INTO users (first_name, last_name, email)
VALUES ('Amy', 'Lee', '[email protected]')");
$new_id = mysqli_insert_id($conn);
echo "Inserted row has ID: " . $new_id;
?>Consulta Ottenere l'ultimo ID inserito per il quadro completo, incluso il comportamento con le prepared statement.
Inserire più righe
Per aggiungere più righe contemporaneamente, elenca più set di valori in un'unica istruzione. Un solo viaggio al database è molto più veloce che eseguire INSERT in un ciclo.
<?php
$sql = "INSERT INTO users (first_name, last_name, email) VALUES
('John', 'Doe', '[email protected]'),
('Jane', 'Smith', '[email protected]'),
('Amy', 'Lee', '[email protected]')";
if (mysqli_query($conn, $sql)) {
echo mysqli_affected_rows($conn) . " records inserted";
} else {
echo "Error: " . mysqli_error($conn);
}
?>Per inserire in blocco dati forniti dall'utente, associa i valori in un ciclo su una prepared statement — consulta Inserire più righe.
Passo 4: Chiudere la connessione
Al termine, chiudi la connessione con mysqli_close() per liberare le risorse. PHP chiude le connessioni automaticamente al termine di una richiesta, ma chiuderle esplicitamente è buona pratica negli script a lunga esecuzione.
<?php
mysqli_close($conn);
?>Errori comuni
- Dimenticarsi di controllare il risultato.
mysqli_query()restituiscefalsein caso di errore; controlla sempremysqli_error()in modo che un errore silenzioso non sembri un successo. - Apostrofi non gestiti. Nomi come
O'Brienrompono una query costruita con stringhe. Le prepared statement eliminano completamente il problema. - Numero di colonne non corrispondente. Il numero di colonne deve corrispondere al numero di valori, altrimenti MySQL rifiuta l'istruzione.
- Tipo di bind errato. Associare un intero come
"s"di solito funziona, ma le discrepanze (ad esempio associare una stringa a una colonnai) possono corrompere i dati silenziosamente.
Conclusione
Ora sai come inserire dati in MySQL da PHP: apri una connessione, esegui un INSERT e chiudi la connessione. Per qualsiasi cosa che vada oltre i valori di test fissi, usa le prepared statement per proteggerti dall'SQL injection. Successivamente, scopri come leggere i tuoi dati con Selezionare i dati.