La classe prodotti
si occuperà di implementare tutti i metodi necessari per operare con il database in lettura e scrittura rispetto alla tabella dei prodotti e alle informazioni correlate. Fondamentalmente avremo i cinque metodi classici, ovvero, la lettura di tutti i prodotti, la lettura di un singolo prodotto tramite filtro per id e le operazioni in scrittura, cioè, l'inserimento, la modifica e l'eliminazione di un record.
Per questo definiremo la classe e le sue proprietà: private quelle relative al database, pubbliche quelle relative ai campi della tabella prodotti.
class Prodotto{
// connessione al database e nome della tabella
private $conn;
private $nome_tabella = "prodotti";
// proprietà dell'oggetto
public $id;
public $nome;
public $descrizione;
public $prezzo;
public $categoria_id;
public $categoria_nome;
public $data_insert;
}
Per quanto riguarda il database la connessione verrà passata dal costruttore, il nome della tabella lo imposteremo invece noi staticamente. Le proprietà pubbliche, invece, sono relative alla costruzione dell'oggetto e quindi riflettono i campi della tabella prodotti
e della tabella categoria
in relazione uno a molti con questa.
Come anticipato, inseriamo il codice relativo al costruttore:
public function __construct($db){
$this->conn = $db;
}
Occupiamoci ora del primo metodo che serve per l'estrazione dei dati:
function leggi(){
$sql = "SELECT c.nome as categoria_nome, p.id, p.nome, p.descrizione, p.prezzo, p.categoria_id, p.data_insert
FROM " . $this->nome_tabella . " p
INNER JOIN categorie c ON p.categoria_id = c.id
ORDER BY p.data_insert DESC";
$stmt = $this->conn->prepare($sq);
$stmt->execute();
return $stmt;
}
Questo metodo contiene la stringa SQL per la SELECT
sul database, per comodità viene utilizzato l'alias sul nome delle tabelle. Le tabelle prodotti
e categorie
sono vincolate da una clausola INNER JOIN
in modo da forzare la coerenza dei dati estratti, mentre per l'ordinamento si è scelto di usare la data di inserimento inversa: ovviamente in caso di necessità si possono scegliere ordinamenti differenti.
Il secondo metodo proposto è l'estrazione di un singolo record:
function leggiProdotto(){
$sql = "SELECT c.nome as categoria_nome, p.id, p.nome, p.descrizione, p.prezzo, p.categoria_id, p.data_insert
FROM " . $this->nome_tabella . " p
INNER JOIN
categorie c
ON p.categoria_id = c.id
WHERE
p.id = ?
LIMIT
0,1";
$stmt = $this->conn->prepare( $sql );
$stmt->bindParam(1, $this->id);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$this->nome = $row['nome'];
$this->prezzo = $row['prezzo'];
$this->descrizione = $row['descrizione'];
$this->categoria_id = $row['categoria_id'];
$this->categoria_nome = $row['categoria_nome'];
}
La query ricalca sostanzialmente quella vista precedentemente, con l'unica differenza della clausola WHERE
sulla chiave primaria id
, ovviamente useremo un parametro, in questo caso rappresentato nell'istruzione SQL dal segnaposto ?
Quindi preparazione della query, assegnazione del valore al parametro, esecuzione della query ed assegnazione dei dati estratti alle proprietà del nostro oggetto. Quando andremo a implementare la classe vedremo come recuperare effettivamente questi valori.