Corso PHP: 24.3 – Accedere a MySQL da PHP (Parte 5^)

24.3.4  Eliminazione records del database

Continuamo il nostro corso PHP vedendo come eliminare dei records dal database.

Il comando da usare per eliminare un record dal database è DELETE.
La sintassi che troverete sul manuale è la seguente:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
[PARTITION (partition_name,...)]
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]

Anche in questo caso tuttavia il più delle volte si userà solo la forma semplificata:

DELETE FROM tbl_name
WHERE nome_colonna = valore

a meno che non si voglia limitare il range di records da eliminare con la clausola LIMIT, la cui sintassi, come visto precedentemente è:

LIMIT primo_record_da_leggere, numero_dei_records_da_leggere.

Per la clausola ORDER BY ripetiamo quanto già detto alla lezione precedente:

sarà utile se vogliamo che la tabella venga letta in un determinato ordine; potremo indicare il nome di un campo e la tabella verrà letta con i records ordinati secondo i valori ascendenti di quella colonna. Se viceversa vogliamo l’ordinamento inverso aggiungeremo la parola DESC alla clausola.

Vediamo dunque l’uso della DELETE nei due casi di utilizzo di Mysqli oppure PDO.

a) Primo caso: utilizzo di Mysqli

Nel caso di uso di Mysqli, ricordiamo, la funzione per eseguire la query è quella già vista:

mysqli_query (mysqli $link , string $query)

che ritorna il valore booleano TRUE o FALSE a seconda che l’esecuzione della query sia andata a buon fine o no.

Come esempio vediamo di cancellare dalla tabella Prodotti del nostro database tutti i prodotti il cui codice cominci per ‘A’. Il codice sarà:

 

<?php
session_start();
include_once("includes/config.mysqli.php");
$query = "DELETE FROM prodotti WHERE substr(p_codprod,1,1)='A'";
$result = mysqli_query($sql, $query);
?>

b) Secondo caso: utilizzo di PDO

Nel caso di uso di PDO lo script sarà il seguente:

 

<?php
session_start();
include_once("includes/config.pdo.php");
$query = "DELETE FROM prodotti WHERE substr(p_codprod,1,1)='A'";
$sql = $db->query($query);
?>

 

24.3.5  Contare i records di una tabella

Vi capiterà di dover contare i records di una tabella, ad esempio se volete scrivere una routine di paginazione.

E’ abbastanza ovvio che con una SELECT può essere fatto ad esempio impostando la query:

SELECT id FROM tabella WHERE 1

Si contano tutti i records della tabella perché WHERE 1 significa di selezionare i records quando la condizione è TRUE (1 = TRUE) cioè tutti.

Naturalmente si possono contare i records che soddisfano una certa condizione impostando la condizione voluta nella WHERE.

Con PDO tuttavia c’è un modo più efficiente di contare i records con i seguenti comandi:

 

<?php
session_start();
include_once("includes/config.pdo.php");
$query='SELECT count(*) FROM table WHERE ...';
$sql = $db->query($query);
$count=$sql->fetchColumn();
?>

In $count troveremo il risultato.

 

24.3.6  Leggere i records di due tabelle collegate in relazione

In un database esistono frequentemente (se non sempre) tabelle in relazione attraverso uno stesso campo. Nel nostro database di esempio, testata ordini e dettaglio ordini sono collegate dal campo numero ordine, dettaglio ordini e prodotti sono in relazione per mezzo del campo codice prodotto ecc. come mostrato al paragrafo 24.2 in fase di costruzione del database.

Volendo leggere per esempio tutti gli ordini di un determinato cliente si può impostare una sola SELECT sfruttando la clausola JOIN come mostrato nell’esempio che segue:

 

<?php
session_start();
include_once("includes/config.pdo.php");
$codcli="123456";
$query = "SELECT dett_ordini.*, testata_ord.*, clienti.* FROM clienti INNER JOIN testata_ord ON testata_ord.to_codcli=clienti.c_codcli WHERE dett_ordini.do_numord=testata_ord.to_numord AND clienti.c_codcli=:codcli";
$sql = $db->prepare($query);
$sql->bindParam(':codcli', $codcli);
$sql->execute();
while ($row = $sql->fetch(PDO::FETCH_ASSOC)) {
   [..... Elaborazione dei dati.....]
}
?>

che per la verità può essere scritta più semplicemente:

 

<?php
session_start();
include_once("includes/config.pdo.php");
$codcli="123456";
$query = "SELECT dett_ordini.*, testata_ord.*, clienti.* FROM dett_ordini, testata_ord, clienti WHERE dett_ordini.do_numord=testata_ord.to_numord AND testata_ord.to_codcli=clienti.c_codcli AND clienti.c_codcli=:codcli";
$sql = $db->prepare($query);
$sql->bindParam(':codcli', $codcli);
$sql->execute();
while ($row = $sql->fetch(PDO::FETCH_ASSOC)) {
   [..... Elaborazione dei dati.....]
}

?>

INNER JOIN è una clausola che definisce la relazione (stabilita mediante la clausola ON) tra i campi che devono essere uguali nelle due tabelle; verranno estratti, infatti, solo ed esclusivamente i records che hanno corrispondenza sulle due tabelle nel campo indicato. Può essere poi aggiunta la clausola WHERE per aggiungere filtri ai records estratti.

Naturalmente noi per semplicità abbiamo indicato con * l’intenzione di estrarre tutti i campi delle tabelle interessate. Qualora si volesse limitare il numero di campi estratti sarà ovviamente sempre possibile elencarli per nome.

In realtà i tipi di JOIN sono tre, ma la INNER JOIN che abbiamo visto è quella definita di default. Per questo motivo le due forme viste sopra sono equivalente. Inoltre la parola INNER può essere omessa.

Gli altri due tipi di JOIN sono la LEFT JOIN e la RIGHT JOIN, che appartengono al tipo OUTER JOIN.

La LEFT JOIN permette di estrarre tutti i record dalla prima tabella (quella principale specificata a sinistra) associando a questi i valori dei campi della seconda tabella qualora essi siano presenti. Quindi in ogni caso tutti i records della prima tabella saranno estratti, mentre la clausola ON servirà solo per estrarre i campi della seconda tabella qualora presenti, senza influire sul numero di record estratti.

 

La RIGHT JOIN si comporta in modo analogo alla LEFT JOIN, ma la tabella principale in questo caso è la seconda.

2 thoughts on “Corso PHP: 24.3 – Accedere a MySQL da PHP (Parte 5^)”

  1. mysqli() è datato e poco sicuro, se ne sconsiglia vivamente l’uso in favore di PDO, tralaltro mysqli verrà deprecato a breve ( già è deprecato in PHP 7 ) quindi questa guida è pressocchè inutile. Saluti

Lascia un commento

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