it-swarm-es.tech

¿Cómo hacer que el manejo de excepciones / errores de SQL sea compatible con 2.5 y 3.x?

Estaba tratando de desarrollar Joomla 2.5 y 3 componentes. Como muchas cosas quedaron en desuso entre estas dos versiones y la forma de lanzar y capturar la base de datos y otros errores, aún no pude encontrar formas de crear un solo componente para 2.5 y 3.

Entonces está haciendo componentes por separado para 2.5 y 3.

En primer lugar, en 2.5 de esta manera estoy captando un error en la base de datos: -

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

Pero, ¿cómo muestro o devuelvo un mensaje de error exacto a la clase de vista para que el error se muestre en el componente?

En segundo lugar, para otro tipo de consulta db, obtengo datos de db de esta manera en la clase de modelo (aquí está mi código en la función del modelo):

$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; 

Ahora puedo inspeccionar $this->_data en la clase de vista para ver si regresan 0 registros, pero de nuevo, ¿cómo visualizo un mensaje de error específico de la base de datos o devuelvo un mensaje de error a mi clase de vista para mostrar errores?

Estas son las formas más comunes en que los desarrolladores deben mostrar errores al hacer consultas a la base de datos en 2.5.

5
dev-m

Más o menos lo mismo que la respuesta de @ValentinDespa, pero voy a fusionar las dos cosas en algo que funcione en 2.5 y 3.x.

Esto, en lugar de mostrar un mensaje de error de página completa, solo devuelve falso y luego inserta un mensaje de error en la parte superior de la página. Espero que eso sea lo que buscas

$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;
    }
}

El modificador heredado JError era falso en 2.5 para usar JError y luego verdadero en 3.x para usar excepciones.

Puede ver un ejemplo completo de mí usando esto en uno de mis módulos aquí https://github.com/JoomJunk/shoutbox/blob/development/mod_shoutbox/helper.php#L

6
George Wilson

¡Cuidado con exponer demasiada información! Tenga en cuenta que al arrojar errores de SQL en la naturaleza, puede exponer la estructura de su base de datos u otra información confidencial. Lanzaría errores de SQL solo en el back-end (por ejemplo, usuarios de confianza) y en la interfaz solo un error genérico y registraría el error exacto en un registro de errores.

Haciendo una consulta en 3.x capturando y lanzando excepciones

$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());
}

Hacer una consulta en Joomla 2.5 y 3.x usando funciones obsoletas antiguas

$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