In quest’articolo vediamo come creare script php che consentano l’inserimento, la modifica e la cancellazione di record in una tabella di un database MySql

Un focus su PHP – Inserimento, modifica e cancellazione di record


main.zip (243 download )

Sommario

Creazione del database

Dopo aver aperto XAMPP, avviato il Web Server Apache e MySQL, apriamo l’interfaccia PHPMyAdmin e clicchiamo il tab SQL. Qui scriveremo la query che consentirà di creare il database “db1”, la tabella “utenti” e popolare la tabella con 10 record:

-- Creazione del database
CREATE DATABASE IF NOT EXISTS db1;
USE db1;

-- Creazione della tabella utenti
CREATE TABLE IF NOT EXISTS utenti (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nome VARCHAR(50) NOT NULL,
    cognome VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL UNIQUE,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL
);

-- Inserimento di 10 record nella tabella utenti
INSERT INTO utenti (nome, cognome, email, username, password) VALUES
('Mario', 'Rossi', 'mario.rossi@example.com', 'mrossi', 'password1'),
('Luca', 'Bianchi', 'luca.bianchi@example.com', 'lbianchi', 'password2'),
('Giulia', 'Verdi', 'giulia.verdi@example.com', 'gverdi', 'password3'),
('Francesca', 'Neri', 'francesca.neri@example.com', 'fneri', 'password4'),
('Alessandro', 'Gialli', 'alessandro.gialli@example.com', 'agialli', 'password5'),
('Elena', 'Marrone', 'elena.marrone@example.com', 'emarrone', 'password6'),
('Paolo', 'Blu', 'paolo.blu@example.com', 'pblu', 'password7'),
('Sara', 'Rosa', 'sara.rosa@example.com', 'srosa', 'password8'),
('Davide', 'Viola', 'davide.viola@example.com', 'dviola', 'password9'),
('Martina', 'Grigio', 'martina.grigio@example.com', 'mgrigio', 'password10');

e premeremo ESEGUI.

Verrà creata la tabella seguente:

utentiSQL

Inserimento di un record attraverso uno script PHP

Ci proponiamo, dunque di creare uno script PHP (inserimento.php) che consenta di inserire un record in tabella con i dati provenienti, ad esempio da un form di registrazione.

Prima soluzione

Creiamo il form di registrazione (registrazione.html) come mostrato accanto e , facendo riferimento allo script connessione2.php (metodo OOP) utile a connettersi al database nell’articolo PHP – Linguaggio di programmazione , creiamo un file PHP (inserisci.php) che dovrà connettersi al database, recuperare i dati inseriti dall’utente, inserire tali dati attraverso una query.

<!DOCTYPE html> 
<html> 
    <head>   
        <title>Form di registrazione</title>
    </head>
    <body>   
        <h2>Form di registrazione</h2>   
        <form action="inserisci.php" method="post">  
            nome: <input type="text" name="nome">
            cognome: <input type="text" name="cognome">
            email: <input type="email" name="email">
            username: <input type="username" name="username">
            password: <input type="password" name="password"> 
            <input type="submit" name="invia" value="Inserisci">   
        </form>   
    </body>
</html>

Qui sotto lo script: come potete vedere anzichè riscrivere tutto il codice per la connessione richiamiamo solo il nome del file attraverso il costrutto require. Esiste anche il costrutto include. La differenza è nel caso il file incluso non esista: con include viene mostrato un avviso che non interrompe l’esecuzione dello script, con require viene generato un errore fatale che interrompe l’esecuzione.

<?php
    // Connessione al database
    require "connessione.php";
    
    // Dati da inserire provenienti dal form di registrazione
    $nome = $_POST['nome'];
    $cognome = $_POST['email'];
    $email = $_POST['email'];
    $username = $_POST['username'];
    $password = $_POST['password'];
    
    $sql = "INSERT INTO utenti (nome, cognome, email, username, password) VALUES ('$nome', '$cognome', '$email', '$username', '$password')";
    
    if ($conn->query($sql) === TRUE) {
        echo "Record inserito con successo!";
    } else {
        echo "Errore nell'inserimento: " . $conn->error;
    }
    
    // Chiudere la connessione
    $conn->close();
?>

Recuperiamo i dati attraverso l’array associatico $_POST e scriviamo la query per inserire il record passando come valori i dati recuperati dal form. Memorizziamo la query nella variabile $sql come stringa.

l’inserimento avviene con la sintassi $conn->query($sql) cioè utilizza sull’oggetto $conn il metodo query passando come parametro la nostra stringa contenente la query.

Per testare il nostro script  scriviamo l’URL localhost/test/registrazione.html, compiliamo il form, clicchiamo “inserisci” e visualizzeremo il messaggio di inserimento riuscito con successo. In effetti, se aggiorniamo la tabella utenti su PHPMyAdmin vedremo il record inserito.

registrazione
registrazione
successo
successo

SQL Injection – cos’è e come funziona

La soluzione presentata in precedenza presenta problemi di vulnerabilità. In particolare lo script è vulnerabile agli attacchi di tipo SQL Injection: un attacco informatico che sfrutta vulnerabilità nelle query SQL per manipolare il database. Se un’applicazione non protegge adeguatamente i dati inseriti dagli utenti, un hacker può iniettare codice SQL malevolo per:

  • Rubare dati sensibili (email, password, carte di credito)
  • Modificare o cancellare dati nel database
  • Prendere il controllo dell’intero database

Sotto mostriamo un esempo di SQL Injection. Ipotizziamo di avere un form di login in cui l’utente deve inserire username e password.

<?php
    // Connessione al database
    $conn = new mysqli("localhost", "root", "", "test");
    
    // Dati inseriti dall'utente
    $username = $_POST['username'];
    $password = $_POST['password'];
    
    $sql = "SELECT * FROM utenti WHERE username = '$username' AND password = '$password'";
    $result = $conn->query($sql);
    
    if ($result->num_rows > 0) {
        echo "Accesso riuscito!";
    } else {
        echo "Credenziali errate!";
    }
?>

ma poichè 1 è sempre uguale a 1 l’attaccante può accedere senza conoscere username e password!

sql injection
sql injection

Stesso discorso se avessimo una query di tipo INSERT

In conclusione SQL Injection è uno degli attacchi più pericolosi, ma può essere evitato facilmente con le query preparate. Mai concatenare direttamente i dati dell’utente nelle query! 

Seconda soluzione: Prepared query

Per evitare gli attacchi di tipo SQL Injection occorre usare le Prepared Query. Ora vediamo come inserire un record nella tabella utenti con mysqli

Preparo una stringa che contiene una query con placeholder i cui valori sono contrassegnati con ?:

 $sql = “INSERT INTO utenti (nome, cognome,email,username, password) VALUES (?, ?, ?, ?, ?)”;

Preparo la query parametrica utilizzando il metodo prepare:

$stmt = $conn->prepare($sql);

Associazione (Binding) dei parametri alla query:

  • "s" = stringa (string)
  • "i" = intero (integer)
  • "d" = numero decimale (double)
  • "b" = blob (binary large object)

$stmt->bind_param(“sssss”, $nome, $cognome, $email,$username, $password);

Sotto l’esempio completo

<?php
// Connessione al database
require 'connessione.php';

// Dati da inserire
$nome = $_POST['nome'];
$cognome = $_POST['cognome'];
$email = $_POST['email'];
$username = $_POST['username'];
$password = $_POST['password'];

// QUERY PREPARATA - SICURA CONTRO SQL INJECTION
$sql = "INSERT INTO utenti (nome, cognome, email, username, password) VALUES (?, ?, ?, ?, ?)";
$stmt = $conn->prepare($sql);

// Associazione dei parametri alla query (s = stringa)
$stmt->bind_param("sssss", $nome, $cognome, $email, $username, $password);

// Esecuzione della query
if ($stmt->execute()) {
    echo "Record inserito con successo!";
} else {
    echo "Errore nell'inserimento: " . $stmt->error;
}

// Chiusura dello statement e della connessione
$stmt->close();
$conn->close();
?>

Modifica di un record attraverso uno script PHP

Dopo aver capito come utilizzare le prepared query possiamo scrivere uno script per aggiornare ad esempio la password in un record riferita ad una email specifica. Ovviamente l’email e la nuova password devono essere recuperate attraverso un nuovo form.

<?php
    require "connessione.php";
    
    $email = $_POST['email'];
    $new_password = $_POST['new_password'];
    
    $sql = "UPDATE utenti SET password = ? WHERE email = ?";
    
    $stmt = $conn->prepare($sql);
    
    $stmt->bind_param("ss", $new_password, $email);
    
    if ($stmt->execute()) {
        echo "Password aggiornata con successo!";
    } else {
        echo "Errore durante l'aggiornamento: " . $stmt->error;
    }
    
    $stmt->close();
    $conn->close();
?>

Cancellazione di un record attraverso uno script PHP

Siamo in grado ovviamente anche di cancellare un record

<?php
    require "connessione.php";
    
    $email = $_POST['email'];
    
    $sql = "DELETE FROM utenti WHERE email = ?";
    
    $stmt = $conn->prepare($sql);
    
    $stmt->bind_param("s", $email);
    
    $email = $_POST['email'];
    
    if ($stmt->execute()) {
        // Controllo se il record è stato eliminato
        if ($stmt->affected_rows > 0) {
            echo "Utente eliminato con successo!";
        } else {
            echo "Nessun utente trovato con questa email.";
        }
    } else {
        echo "Errore durante l'eliminazione: " . $stmt->error;
    }
    
    // 7️⃣ Chiusura dello statement e della connessione
    $stmt->close();
    $conn->close();
?>

Nella sezione DOWNLOAD o direttamente da qui: https://profgiagnotti.it/download/4860/?tmstv=1744539632 è possibile scaricare gli script descritti nell’articolo

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *