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

Per utilizzare un database MySQL all’interno di una pagina PHP, la prima cosa da fare è quindi richiamare il nostro file di configurazione descritto precedentemente, mediante il quale si effettuerà l’accesso al database.

Se utilizziamo Mysqli scriveremo quindi all’inizio di ogni pagina che dovrà accedere al database :

<?php
session_start();
include_once("includes/ config_mysqli.php ");
?>

Se invece utilizziamo l’estensione PDO scriveremo:

<?php
session_start();
include_once("includes/config.pdo.php");
?>

A questo punto saremo abilitati ad effettuare le query necessarie al funzionamento del nostro programma.


Le possibili operazioni su una tabella di database possono essere suddivise nei quattro gruppi:

  1. Lettura di record del database
  2. Inserimento di nuovi records nel database
  3. Modifica di uno o più records del database
  4. Eliminazione di uno o più records del database

 

24.3.1 Lettura di record del database

Per leggere uno o più records in una tabella di database si usa il comando SELECT. La sintassi se si ricerca sulla documentazione ufficiale del MySQL è piuttosto complessa, anche se in linea di massima molte delle opzioni previste sono di scarsa utilità e quindi non si usano quasi mai. Comunque per completezza vi riportiamo la sintassi completa del comando SELECT:

 

SELECT
[ALL | DISTINCT | DISTINCTROW ]
[HIGH_PRIORITY]
[MAX_STATEMENT_TIME = N]
[STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
select_expr [, select_expr ...]
[FROM table_references
[PARTITION partition_list]
[WHERE where_condition]
[GROUP BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]
[HAVING where_condition]
[ORDER BY {col_name | expr | position}
[ASC | DESC], ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[PROCEDURE procedure_name(argument_list)]
[INTO OUTFILE 'file_name'
[CHARACTER SET charset_name]
export_options
| INTO DUMPFILE 'file_name'
| INTO var_name [, var_name]]
[FOR UPDATE | LOCK IN SHARE MODE]]

Daremo una rapida spiegazione delle parole chiavi che compaiono nella sintassi della SELECT, ma la cosa più efficace è mostrare alcuni esempi di utilizzo nelle situazioni più comuni. Diciamo quindi che l’uso più frequente è quello di leggere alcune righe di tabella, complete o limitatamente ad alcune colonne, a fronte di alcune condizioni.

La sintassi in questo caso sarà:

SELECT campo_1, campo_2, [...campo_n] FROM tabella WHERE condizione

Che ci permette di estrarre le colonne indicate con campo_1 ecc. dalla tabella di tutte le righe che soddisfano la ‘condizione’.

Se vogliamo estrarre le intere righe che soddisfano la ‘condizione’ scriveremo:

SELECT * FROM tabella WHERE condizione

Naturalmente la clausola WHERE non è obbligatoria e la query SELECT * FROM tabella estrarrà tutte le righe di tabella.

Prima di esaminare altre possibili clausole della query SELECT vediamo come va usata nei casi di utilizzo di Mysqli oppure PDO.

a) Primo caso: utilizzo di Mysqli

Nel caso di uso di Mysqli la funzione per eseguire la query è:

mysqli_query (mysqli $link , string $query)

Dove $link è il link alla connessione che nel nostro file config_mysqli.php abbiamo chiamato $sql e $query è la stringa che contiene la SELECT.

Questa funzione ritorna il valore booleano TRUE o FALSE a seconda l’esecuzione della query sia andata a buon fine o no. Se la query è stata eseguita con successo potremo accedere alle informazioni selezionate copiandole in un array di memoria con una delle funzioni:

 

$array = mysqli_fetch_assoc();
// ritorna un array associativo con tutti i campi selezionati di una singola riga
$array = mysqli_fetch_row();
// ritorna un array con indice numerico con tutti i campi selezionati di una singola riga
$array = mysqli_fetch_all();
// ritorna un array associativo con tutti i campi selezionati di tutte le righe

Vediamo quindi alcuni esempi pratici di SELECT. Supponiamo di voler estrarre dal nostro database di prova tutti i clienti di Bologna con email. Ci interessano solo ragione sociale ed email.

Il codice PHP sarà il seguente:

 

<?php
session_start();
include_once("includes/config.mysqli.php");
$query = "SELECT c_ragsoc, c_email FROM clienti WHERE c_email!='' AND c_citta='Bologna'";
$result = mysqli_query($sql, $query);
if ($result) {
   while ($row = mysqli_fetch_assoc()) {
      echo $row['c_ragsoc']." ".$row['c_email'];
   }
}
else echo mysqli_error($sql);
mysqli_free_result($result);
mysqli_close($sql);
?>

Naturalmente usando mysqli_fetch_row() anziché mysqli_fetch_assoc() dovremo sostituire $row[‘c_ragsoc’] e $row[‘c_email’] rispettivamente con $row[0] e $row[1].

A fine lista abbiamo cancellato la variabile $result chiuso il database.

b) Secondo caso: utilizzo di PDO

Nel caso di uso di PDO dobbiamo distinguere se vogliamo utilizzare lo statement PREPARE per eseguire la query oppure no. Ricordiamo che in termini di sicurezza, gli statements PREPARE  sono particolarmente utili nella prevenzione degli attacchi basati sulla SQL Injection, cioè l’iniezione di codice malevolo tramite istruzioni SQL. Vediamo cosa occorre nel caso vogliamo usare lo statement PREPARE:

Nella stringa di SELECT al posto di valori o variabili si possono usare dei placeholder preceduti dal segno “:”. Al loro posto il sistema sostituirà poi i rispettivi valori indicati successivamente.

La sequenza di funzioni per eseguire una SELECT diventa così:

  • prepare(query)
  • Assegnazione valori con le funzioni bindParam() o bindValue()
  • execute()

Le funzioni per la fetch sono in questo caso:

 

$array = $sql->fetch(PDO::FETCH_ASSOC);
// ritorna un array associativo con tutti i campi selezionati di una singola riga
$array = $sql->fetch(PDO::FETCH_NUM);
// ritorna un array con indice numerico con tutti i campi selezionati di una singola riga
$array = $sql->fetchAll(PDO::FETCH_ASSOC);
// ritorna un array associativo con tutti i campi selezionati di tutte le righe

Dove con $sql abbiamo indicato lo statement prepare.

L’esempio di prima diventerebbe:

 

<?php
session_start();
include_once("includes/config.pdo.php");
$citta="Bologna";
$query = "SELECT c_ragsoc, c_email FROM clienti WHERE c_email!=:email AND c_citta=:citta";
$sql = $db->prepare($query);
$sql->bindValue(':email', "");
$sql->bindParam(':citta', $citta);
if ($sql) {
   $sql->execute();
   while ($row = $sql->fetch(PDO::FETCH_ASSOC)) {
      echo $row['c_ragsoc']." ".$row['c_email'];
   }
}
else print_r($dbh->errorInfo());
$sql->close();
?>

Si usa bindValue quando va associato un valore al segnaposto, mentre si usa bindParam se dobbiamo associare una variabile.

In questo caso abbiamo usato gli oggetti e non lo stile procedurale.

La funzione errorInfo() restituisce un array con codice e descrizione dell’errore.

In entrambi gli esempi abbiamo usato la fetch_assoc che ritorna un array associativo, in quanto è per noi assolutamente consigliabile per la chiarezza del codice. L’array con indici numerici è assai meno immediato in fase di debugging soprattutto quando il numero dei campi è consistente.

Invece di elaborare le righe estratte una ad una con la struttura while {…} possiamo importare in un array l’intero insieme di records estratti con la SELECT e poi elaborare separatamente questo array In questo caso useremo le funzioni mysqli_fetch_assoc() con mysqli oppure fetchAll(PDO::FETCH_ASSOC) con PDO. La scelta dipende evidentemente dal contesto dell’applicazione.

Lascia un commento

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