ti-enxame.com

Como fazer a manipulação de exceção / erro SQL compatível com 2.5 e 3.x?

Eu estava tentando desenvolver o componente Joomla 2.5 e 3. Como muitas coisas foram obsoletas entre essas duas versões e a maneira de lançar e capturar bancos de dados e outros erros, ainda não consegui encontrar maneiras de criar um único componente para 2.5 e 3.

Então, está fazendo o componente separadamente para 2.5 e 3.

Em primeiro lugar, no 2.5 desta maneira, estou capturando um erro no banco de dados: -

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

Mas como mostro ou retorno a mensagem de erro exata para a classe view para que o erro seja exibido no componente?

Em segundo lugar, para outro tipo de consulta ao banco de dados, estou obtendo dados do banco de dados dessa maneira na classe model (aqui está o meu código na função do 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; 

Agora eu posso inspecionar $this->_data na classe view para ver se 0 registros retornam, mas novamente como exibir uma mensagem de erro específica do banco de dados ou retornar uma mensagem de erro à minha classe view para mostrar erros?

Portanto, essas são as maneiras mais comuns que os desenvolvedores devem mostrar erros ao fazer consultas ao banco de dados na 2.5.

5
dev-m

Praticamente o mesmo que a resposta de @ValentinDespa, mas eu vou unir as duas coisas em algo que funcionará nas versões 2.5 e 3.x.

Isso, em vez de exibir uma mensagem de erro de página inteira, retorna falso e insere uma mensagem de erro na parte superior da página. Espero que seja isso que você procura

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

O comutador herdado JError era falso na 2.5 para usar o JError e, em seguida, verdadeiro na 3.x para usar exceções.

Você pode ver um exemplo completo de mim usando isso em um dos meus módulos aqui https://github.com/JoomJunk/shoutbox/blob/development/mod_shoutbox/helper.php#L

6
George Wilson

Cuidado com a exposição de muitas informações! Observe que, ao lançar erros SQL na natureza, você pode expor sua estrutura de banco de dados ou outras informações confidenciais. Eu lançava erros de SQL apenas no back-end (digamos usuários confiáveis) e no front-end apenas um erro genérico e registrava o erro exato em um log de erros.

Fazendo uma consulta no 3.x capturando e lançando exceções

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

Fazendo uma consulta no Joomla 2.5 e 3.x usando funções obsoletas antigas

$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