web-dev-qa-db-fra.com

Comment gérer les exceptions / erreurs SQL compatibles avec les versions 2.5 et 3.x?

J'essayais de développer les composants Joomla 2.5 et 3. Comme beaucoup de choses sont déconseillées entre ces deux versions et la façon de lancer et d’attraper la base de données et d’autres erreurs, je ne pouvais pas encore trouver le moyen de créer un composant unique pour les versions 2.5 et 3.

Il en va de même pour le composant séparé pour 2.5 et 3.

Premièrement, dans 2.5 de cette façon, je détecte une erreur dans la base de données: -

if(!$database->query())
{ 
    return false; 
}

Mais comment puis-je afficher ou renvoyer le message d'erreur exact à la classe de vue afin que l'erreur soit affichée dans le composant?

Deuxièmement, pour un autre type de requête de base de données, j'obtiens les données de base de données de cette manière dans la classe de modèle (voici mon code dans la fonction de modèle):

$this->_data = null; 
if(JFactory::getApplication()->input->get('id') > 0) {
    $db = JFactory::getDBO();
    $db->setQuery("select * from `#__tablename_wrong` where `id`='".JFactory::getApplication()->input->get('id')."'");
}
if ($db->getErrorNum()) {
    JError::raiseWarning(500, $db->getErrorMsg());
}
$this->_data = $db->loadObject(); 
return $this->_data; 

Maintenant je peux inspecter $this->_data dans la classe de vue pour voir si 0 enregistrements sont renvoyés, mais comment puis-je afficher un message d'erreur spécifique à la base de données ou renvoyer un message d'erreur à ma classe de vue pour afficher les erreurs?

Il s’agit donc des moyens les plus courants utilisés par les développeurs pour afficher les erreurs lors de l’exécution de requêtes de base de données dans la version 2.5.

5
dev-m

Quasiment la même chose que la réponse de @ValentinDespa mais je vais juste fusionner les deux choses ensemble pour créer quelque chose qui fonctionnera dans les versions 2.5 et 3.x.

Cela, plutôt que d'afficher un message d'erreur de page complète, renvoie simplement false, puis insère un message d'erreur en haut de la page. J'espère que c'est ce que vous recherchez

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

$query->select('X') // This is specially added to throw an SQL error.
      ->from('#__users');
$db->setQuery($query);

if(!JError::$legacy)
{
    try
    {
        // If it fails, it will throw a RuntimeException
        $result = $db->loadResult(); 
    }
    catch (RuntimeException $e)
    {
        JFactory::getApplication()->enqueueMessage($e->getMessage());

        return false;
    }
}
else
{
    $result = $db->loadResult();

    // Check for a database error.
    if ($db->getErrorNum())
    {
        JFactory::getApplication()->enqueueMessage($db->getErrorMsg());

        return false;
    }
}

Le commutateur hérité JError était false dans 2.5 pour utiliser JError, puis sur true dans 3.x pour utiliser des exceptions.

Vous pouvez voir un exemple complet de mon utilisation dans l'un de mes modules ici https://github.com/JoomJunk/shoutbox/blob/development/mod_shoutbox/helper.php#L

6
George Wilson

Attention à ne pas trop exposer d'informations! Notez qu'en jetant les erreurs SQL dans la nature, vous pourrez exposer la structure de votre base de données ou d'autres informations sensibles. Je voudrais jeter des erreurs SQL uniquement dans le backend (par exemple, les utilisateurs de confiance) et dans le front-end juste une erreur générique et je consignerais l'erreur exacte dans un journal des erreurs.

Faire une requête dans 3.x attraper et lancer des exceptions

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

$query->select('X') // This is specially added to throw an SQL error.
      ->from('#__users');

try
{
    $db->setQuery($query);
    $result = $db->loadResult(); // If it fails, it will throw a RuntimeException 
}
catch (RuntimeException $e)
{
    throw new Exception($e->getMessage());
}

Faire une requête dans Joomla 2.5 et 3.x en utilisant d’anciennes fonctions obsolètes

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

$query->select('X'); // This is specially added to throw an SQL error.
      ->from('#__users');
$db->setQuery($query);

// Check for a database error.
if ($db->getErrorNum()) {
    JError::raiseWarning(500, $db->getErrorMsg());
}

$result = $db->loadResult();
4
Valentin Despa