it-swarm-eu.dev

In che modo la gestione di eccezioni / errori SQL è compatibile con 2.5 e 3.x?

Stavo cercando di sviluppare Joomla 2.5 e 3 componenti. Poiché molte cose sono state deprecate tra queste due versioni e il modo di lanciare e catturare il database e altri errori, non sono ancora riuscito a trovare il modo di creare un singolo componente sia per 2.5 che per 3.

Quindi sta facendo componenti separatamente per 2.5 e 3.

Innanzitutto, in 2.5 in questo modo sto rilevando un errore nel database: -

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

Ma come posso mostrare o restituire un messaggio di errore esatto alla classe vista in modo che l'errore venga visualizzato nel componente?

In secondo luogo, per un altro tipo di query db, sto ottenendo i dati da db in questo modo nella classe del modello (ecco il mio codice nella funzione del modello):

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

Ora posso ispezionare $this->_data nella classe vista per vedere se 0 record restituiscono, ma come posso visualizzare un messaggio di errore del database specifico o restituire un messaggio di errore alla mia classe vista per mostrare gli errori?

Quindi questi sono i modi più comuni in cui gli sviluppatori dovrebbero mostrare errori mentre eseguono query sul database in 2.5.

5
dev-m

Praticamente uguale alla risposta di @ValentinDespa, ma unirò le due cose insieme in qualcosa che funzionerà in 2.5 e 3.x.

Questo, anziché visualizzare un messaggio di errore a pagina intera, restituisce solo false e quindi inserisce un messaggio di errore nella parte superiore della pagina. Spero che sia quello che stai cercando

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

Il parametro legacy JError era falso in 2.5 per usare JError e poi vero in 3.x per usare le eccezioni.

Puoi vedere un esempio completo di me che sto usando questo in uno dei miei moduli qui https://github.com/JoomJunk/shoutbox/blob/development/mod_shoutbox/helper.php#L

6
George Wilson

Fai attenzione per esporre troppe informazioni! Nota: lanciando errori SQL in natura, puoi esporre la struttura del tuo database o altre informazioni sensibili. Darei errori SQL solo nel back-end (diciamo per utenti fidati) e nel front-end solo un errore generico e registrerei l'errore esatto in un registro degli errori.

Fare una query in 3.x catturare e lanciare eccezioni

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

Esecuzione di una query in Joomla 2.5 e 3.x utilizzando vecchie funzioni obsolete

$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