Velocizzare il codice, senza sprechi!
-
Categoria: PHP
-
Pubblicato Martedì, 07 Gennaio 2014
-
Scritto da Paolo Scolamacchia
Quando si deve leggere da un database un insieme di righe, e poi visualizzarle a video,
una pratica comune di implementazione si realizza nei seguenti passi:
1) connessione al DB
1b) costruzione della query
1c) esecuzione della query
1d) salvataggio dei dati in un array
2) costruzione del layout grafico
2b) visualizzazione dei dati dall'array suddetto all'interno del layout
Cosicché, una possibile implementazione potrebbe essere quella del codice riportato di seguito:
e alzi la mano chi non l'ha pensata così, almeno una volta!
(si noti che, per comodità di esposizione, si sono utilizzate le primitive di mysql per realizzare
i suddetti passi; ma anche se volessimo considerare classi o wrapper "ad hoc" per collegarci al DB,
il succo del discorso non cambierebbe)
<?php
$db_hostname = 'localhost';
$db_username = 'root';
$db_password = 'root';
$db_name = 'magazzino';
$db_tabella = 'utenti';
// 1) connessione al DB
$link = mysql_connect($db_hostname ,$db_username, $db_password);
$db_selected = mysql_select_db($db_name, $link);
// 1b) costruzione della query
$statement = "select id_utente, nome_utente, cognome_utente from ".$db_tabella;
// 1c) esecuzione della query
$result=mysql_query($statement,$link);
// 1d) salvataggio dei dati in un array
while ( $row = mysql_fetch_array($result, MYSQL_ASSOC) ) $list[]=$row;
?>
<!-- 2) costruzione del layout grafico -->
<html>
<body>
<table border="1">
<tr>
<td>id</td>
<td>nome</td>
<td>cognome</td>
</tr>
<?
// 2b) visualizzazione dei dati dall'array suddetto all'interno del layout
$cnt = count($list);
for($t=0; $t<$cnt; $t++) { ?>
<tr>
<td><?=$list[$t]['id_utente']?></td>
<td><?=$list[$t]['nome_utente']?></td>
<td><?=$list[$t]['cognome_utente']?></td>
</tr>
<? } ?>
</table>
</body>
</html>
A ben vedere però, potremmo chiederci se il punto 1d) sia
davvero necessario.
Difatti i dati che ci interessano vengono ora
elaborati due volte; la prima volta con l'estrazione dal DB
(e salvataggio in area di memoria), e la seconda volta con il "ripescaggio" da questa area di memoria:
questo doppio passaggio ha come conseguenza un
aumento dei tempi di esecuzione dello script.
Quindi, si può procedere ad una
revisione come segue:
1) connessione al DB
1b) costruzione della query
1c) esecuzione della query
2) costruzione del layout grafico
2b) contestuale estrazione dei dati e loro visualizzazione all'interno del layout
e il codice cambierebbe di conseguenza, nel modo seguente:
<?php
$db_hostname = 'localhost';
$db_username = 'root';
$db_password = 'root';
$db_name = 'magazzino';
$db_tabella = 'utenti';
// 1) connessione al DB
$link = mysql_connect($db_hostname ,$db_username, $db_password);
$db_selected = mysql_select_db($db_name, $link);
// 1b) costruzione della query
$statement = "select id_utente, nome_utente, cognome_utente from ".$db_tabella;
// 1c) esecuzione della query
$result=mysql_query($statement,$link);
?>
<!-- 2) costruzione del layout grafico -->
<html>
<body>
<table border="1">
<tr>
<td>id</td>
<td>nome</td>
<td>cognome</td>
</tr>
<?
// 2b) contestuale estrazione dei dati e loro visualizzazione all'interno del layout
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { ?>
<tr>
<td><?=$row['id_utente']?></td>
<td><?=$row['nome_utente']?></td>
<td><?=$row['cognome_utente']?></td>
</tr>
<? } ?>
</table>
</body>
</html>
Naturalmente, ogni proposta di ulteriori
miglioramenti e ottimizzazioni é la benvenuta!
...e buon 2014!
You have no rights to post comments