Vous vous rappelez surement de la présentation que j’avais de la classe JdatabaseQuery, j’aimerais vous montrez comment bien utilisez cette classe pour que vous ne soyez pas confronté à des déboires dans son utilisation.
Pour rappel : la classe JDatabaseQuery est disponible dans le framework de Joomla! depuis la version 1.6 du CMS. Cette classe vous permet de construire des requêtes pour un fonctionnement sur différentes bases données (MySQL, Postgresql,Microsoft SQL Server,Oracle DB…). Mais depuis la sortie de Joomla! 1.6, de nouvelles bases de données sont supportés par Joomla!.
L’ajout de guillemets au nom d’une table est recommandé, mais pour cela vous devez utilisez une fonction spécifique :
$db = JFactory::getDBO ();
$db->quoteName('#__users');
ou son alias qui évide d’encombrer vos requêtes :
$db->qn ('#__users');
Une autre méthode est disponible pour ajouter des guillemets non pas cette fois-ci au nom des tables, mais aux valeurs dans un « WHERE » par exemple :
$db->Quote($this->id);
Voyons un exemple pratique, d’ajout d’un nouvel élément dans une table de votre base de donnée :
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->insert("{$db->qn('#__users')}")->set("username={$db->Quote($this->username)}, id={$db->Quote($votes->userid)}");
$db->setQuery($query);
$db->query();
Pour mettre à jour un élément dans une table :
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->update("{$db->qn('#__users')}")->set("name={$db->Quote($name)},username={$db->Quote($username)}")->where("id={$db->Quote($this->id)}");
$db->setQuery($query);
$db->query();
Pour supprimer un élément dans une table ça se complique un peu :
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->delete()->from("{$db->qn('#__users')}")->where("id={$db->Quote($this->id)}");
$db->setQuery($query);
$db->query();
Si vous faites votre requête de la façon suivante, la requête sera incorrecte :
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->delete("{$db->qn('#__users')}")->where("id={$db->Quote($this->id)}");
$db->setQuery($query);
$db->query();
Ce qui donnera en SQL :
DELETE `#__users` WHERE id='$this->id'
alors qu’on attendait une requête sous cette forme :
DELETE FROM `#__users` WHERE id='$this->id'
Vous pouvez consulter la documentation en anglais officielle de Joomla! pour d’autres types de requêtes : http://docs.joomla.org/How_to_use_the_database_classes_in_your_script




