Tutorial: PHP CRUD – OOP guida passo dopo passo (p.3)

Precedentemente, nelle prime due parti del Tutorial PHP CRUD OOP, ci siamo focalizzati sulle impostazioni di base del progetto, l’inserimento e la modifica dei records dei nostri prodotti nel database. Salvataggio dati del record nel …

Php crud oop

Precedentemente, nelle prime due parti del Tutorial PHP CRUD OOP, ci siamo focalizzati sulle impostazioni di base del progetto, l’inserimento e la modifica dei records dei nostri prodotti nel database.

Salvataggio dati del record nel database

Adesso ci rimane da salvare le modifiche e lo facciamo inserendo nel file update_product.php alla riga:

<!-- post code will be here -->

il codice che intercetta l’invio del form modificato e salva i dati nel database:

<?php 
// if the form was submitted
if($_POST){
  
    // set product property values
    $product->name = $_POST['name'];
    $product->price = $_POST['price'];
    $product->description = $_POST['description'];
    $product->category_id = $_POST['category_id'];
  
    // update the product
    if($product->update()){
        echo "<div class='alert alert-success alert-dismissable'>";
            echo "Product was updated.";
        echo "</div>";
    }
  
    // if unable to update the product, tell the user
    else{
        echo "<div class='alert alert-danger alert-dismissable'>";
            echo "Unable to update product.";
        echo "</div>";
    }
}
?>

In questo caso ci si avvale di un nuovo metodo update() creato per eseguire questa operazione, ma che dobbiamo ancora inserire nella classe Product e lo facciamo copiando e incollando questo codice nel file /inc/product.php:

function update(){
  
    $query = "UPDATE
                " . $this->table_name . "
            SET
                name = :name,
                price = :price,
                description = :description,
                category_id  = :category_id
            WHERE
                id = :id";
  
    $stmt = $this->conn->prepare($query);
  
    // posted values
    $this->name=htmlspecialchars(strip_tags($this->name));
    $this->price=htmlspecialchars(strip_tags($this->price));
    $this->description=htmlspecialchars(strip_tags($this->description));
    $this->category_id=htmlspecialchars(strip_tags($this->category_id));
    $this->id=htmlspecialchars(strip_tags($this->id));
  
    // bind parameters
    $stmt->bindParam(':name', $this->name);
    $stmt->bindParam(':price', $this->price);
    $stmt->bindParam(':description', $this->description);
    $stmt->bindParam(':category_id', $this->category_id);
    $stmt->bindParam(':id', $this->id);
  
    // execute the query
    if($stmt->execute()){
        return true;
    }
  
    return false;
      
}

Siamo ora in grado di modificare il prodotto e salvare i dati nel database.

Lettura di un record nel modo OOP

Per creare la pagina di visualizzazione di un prodotto strutturiamo un altro file nella cartella principale di progetto, gli diamo il nome di read_one.php ed andiamo ad inserirci il solito codice basico con il pulsante per tornare alla home page:

<?php
// set page headers
$page_title = "Read One Product";
include_once "header.php";
  
// read products button
echo '<div class="d-grid gap-2 d-md-flex justify-content-md-end"><a href="index.php" class="btn btn-primary">Read Products</a></div>';
  
// set footer
include_once "footer.php";
?>

Trattandosi di un solo prodotto evidentemente abbiamo bisogno di inviduarlo tramite il suo ID e di conseguenza inseriamo dopo il pulsante in questo stesso file il codice apposito:

// get ID of the product to be read
$id = isset($_GET['id']) ? $_GET['id'] : die('ERROR: missing ID.');
  
// include database and object files
include_once 'config/database.php';
include_once 'inc/product.php';
include_once 'inc/category.php';
  
// get database connection
$database = new Database();
$db = $database->getConnection();
  
// prepare objects
$product = new Product($db);
$category = new Category($db);
  
// set ID property of product to be read
$product->id = $id;
  
// read the details of product to be read
$product->readOne();

praticamente uguale a quello già spiegato nel passo precedente di questo tutorial quando si operava nella modifica.

Qui vogliamo visualizzare i dati del singolo prodotto quindi aggiungiamo subito dopo quest’altro snippet di codice adatto allo scopo:

// HTML table for displaying a product details
echo "<table class='table table-hover table-responsive table-bordered'>";
  
    echo "<tr>";
        echo "<td>Name</td>";
        echo "<td>{$product->name}</td>";
    echo "</tr>";
  
    echo "<tr>";
        echo "<td>Price</td>";
        echo "<td>${$product->price}</td>";
    echo "</tr>";
  
    echo "<tr>";
        echo "<td>Description</td>";
        echo "<td>{$product->description}</td>";
    echo "</tr>";
  
    echo "<tr>";
        echo "<td>Category</td>";
        echo "<td>";
            // display category name
            $category->id=$product->category_id;
            $category->readName();
            echo $category->name;
        echo "</td>";
    echo "</tr>";
  
echo "</table>";

Eliminazione di un record in modalità OOP

Per impostare l’eliminazione di un record ricorriamo a Javascript ed al plugin di Javascript BootBox-Js che ci consentirà di avere delle finestre di alert di aspetto gradevole, in stile Bootstrap e funzionali.

Niente di particolarmente complicato, per prima cosa creiamo una cartella /js ed all’interno un file chiamato script.js con il seguente codice:

// JavaScript for deleting product
$(document).on('click', '.delete-object', function(){
  
    var id = $(this).attr('delete-id');
  
    bootbox.confirm({
        message: "<h4>Are you sure?</h4>",
        buttons: {
            confirm: {
                label: '<span class="glyphicon glyphicon-ok"></span> Yes',
                className: 'btn-danger'
            },
            cancel: {
                label: '<span class="glyphicon glyphicon-remove"></span> No',
                className: 'btn-primary'
            }
        },
        callback: function (result) {
  
            if(result==true){
                $.post('delete_product.php', {
                    object_id: id
                }, function(data){
                    location.reload();
                }).fail(function() {
                    alert('Unable to delete.');
                });
            }
        }
    });
  
    return false;
});

Vediamo di capire insieme come funziona:

nella riga

$(document).on('click', '.delete-object', function(){

apriamo una funzione che triggera l’evento click nel documento individuando la classe CSS delete-object per lanciare l’opzione di cancellazione

nella riga

var id = $(this).attr('delete-id');

assegniamo una variabile id che possiamo individuare insieme alla classe della funzione Javascript sopra citata nel file index.php in questa riga:

<a delete-id='{$id}’ class=’btn btn-danger delete-object>

secondo poi i parametri del plugin BootBox-Js impostiamo la finestra di alert/conferma che se cliccheremo su Yes, quindi confermando la cancellazione eseguira in “callback” un’altra funzione Javascript la quale richiamerà a sua volta il file delete_product.php che andremo di seguito a creare, il cui scopo è quello di eseguire la cancellazione vera e propria del record di prodotto.

Quindi creiamo appunto il file delete_product.php nella cartella principale del progetto ed inseriamoci questo codice:

<?php
// check if value was posted
if($_POST){
  
    // include database and object file
    include_once 'config/database.php';
    include_once 'inc/product.php';
  
    // get database connection
    $database = new Database();
    $db = $database->getConnection();
  
    // prepare product object
    $product = new Product($db);
      
    // set product id to be deleted
    $product->id = $_POST['object_id'];
      
    // delete the product
    if($product->delete()){
        echo "Object was deleted.";
    }
      
    // if unable to delete the product
    else{
        echo "Unable to delete object.";
    }
}
?>

similmente agli snippets già visti in precedenza include il file di configurazione del database ed il file della classe Product, poi istanzia l’oggetto Database per la connessione e l’oggetto Product per il metodo di cancellazione, poi riceve l’ID da cancellare in POST ed esegue appunto il metodo della classe Product, delete() la cui funzione è evidentemente quella di cancellare il record di prodotto.

Ci manca il metodo delete() che andiamo subito a creare inserendo questo codice nel file /inc/product.php.

// delete the product
function delete(){
  
    $query = "DELETE FROM " . $this->table_name . " WHERE id = ?";
      
    $stmt = $this->conn->prepare($query);
    $stmt->bindParam(1, $this->id);
  
    if($result = $stmt->execute()){
        return true;
    }else{
        return false;
    }
}

Non è finita qui, ci manca il caricamento del file script.js pronto per essere eseguito e dobbiamo farlo inserendo una riga di codice nel file footer.php

<script src="/js/script.js"></script>

attenzione ad inserire questa riga dopo quella che carica BootBox-Js di cui l’esecuzione deve essere già attiva dal momento che usiamo sue funzionalità.

Non ci resta che provare e vedere come funziona, con la finestra popup di conferma, la cancellazione del record di prodotto.

Potete trovare i files di questo tutorial sul mio account GitHub

TORNA ALLA PARTE 2

Lascia un commento