Infocurci - programmatore Php Roma
Infocurci - programmatore Php Roma
"faster than 98% of all tested websites" (tools.pingdom.com) - 100/100 Google PageSpeed Insights - Benvenuti :)

Cms / framework : Query di inserimento e aggiornamento in Joomla

Joomla offre una comoda interfaccia per le operazioni CRUD sui dati . In questo artcolo vediamo come è possibile eseguire le query di inserimento, modifica ed eliminazione di record, con un occhio di riguardo per l'approccio object oriented che aggiunge un grado di affidabilità alle nostre applicazioni.

Cms / framework

Fin dalle prime versioni, gli svliuppatori di Joomla hanno prestato particolare attenzione alla gestione delle query e dei relativi risultati. Le ultime versioni del cms sono state arricchite da un'interfaccia ad oggetti molto comoda, che solleva lo sviluppatore dalla sempre delicata gestione dell'escape delle variabili e delle stringhe. Passiamo ad esempi pratici.

$db = JFactory::getDbo();
$query = $db->getQuery(true);

Queste righe creano un'istanza dell'oggetto DBO e, da esso, una nuova query. Il parametro passato alla funzione getQuery indica se necessitiamo di un nuovo oggetto o se dobbiamo recuperare l'ultimo utilizzato. Impostando il parametro a false, otteniamo infatti l'ultima query eseguita, disponibile ad esempio per debug:

$query = $db->getQuery(false);
echo "l'ultima query eseguita è stata  $query";

Vediamo una query di inserimento (per l'occasione, a puro scopo illustrativo, inseriremo un fake record nella tabella delle sessioni):

$columns = array('session_id', 'guest', 'time');
$values = array($db->quote(uniqid()), 1, time());
$query
    ->insert($db->quoteName('#__session'))
    ->columns($db->quoteName($columns))
    ->values(implode(',', $values));
    $db->setQuery($query);
    $db->execute();

La funzione quoteName si occupa di aggiungere il simbolo "`" usato da Mysql per l'escape del nome delle colonne.

E' possibile inserire un record anche con un approccio object-oriented, come accennavo prima si tratta di una soluzione molto comoda perché ci esenta dal dover gestire i quote:

$object = new stdClass();
$object->session_id = uniqid();
$object->guest = 1;
$object->time = time();
$result = JFactory::getDbo()->insertObject('#__session', $object);

La query di update ha una sintassi leggermente differente, dovendo gestire anche la clausola where:

$db = JFactory::getDbo();
$query = $db->getQuery(true);

$fields = array(
    $db->quoteName('username') . ' = ' . $db->quote('solo_un_Test'),
);
$conditions = array(
    $db->quoteName('session_id') . ' = '.$db->quote('549ebda03dc02'),
);

$query->update($db->quoteName('#__session'))->set($fields)->where($conditions);
$db->setQuery($query);
$result = $db->execute();

L'approccio ad oggetti è molto simile a quanto già fatto per l'update:

$object = new stdClass();
$object->session_id = '549ebda03dc02';
$object->username = 'ancora_un_Test';
$result = JFactory::getDbo()->updateObject('#__session', $object, 'session_id');

è fondamentale indicare come ultimo parametro di updateObject il nome del campo usato come chiave, che altrimenti finirebbe nell'elenco di quelli da usare come valore aggiornato (generando ovviamente un errore perchè la query risulterebbe priva della clausola where).

Vediamo infine le query di eliminazione dati, molto simili a quelle di update:

$db = JFactory::getDbo();
$query = $db->getQuery(true);
$conditions = array(
    $db->quoteName('session_id') . ' = '.$db->quote('549ebda03dc02'),
);
 
$query->delete($db->quoteName('#__session'));
$query->where($conditions);
$db->setQuery($query);
$result = $db->execute();

rispetto all'azione di aggiornamento, quella di cancellazione ovviamente non necessita di una matrice di valori da aggiornare.