Устранение исключения /ошибки в транзакции базы данных

Я использую следующий способ в joomla 2.5 и 3 для выполнения запроса к базе данных -

$ database = JFactory :: getDBO ();
$ Database- > SetQuery
$ Database- > выполнение ();

, но как я могу уловить ошибки /исключения, если запрос по каким-либо причинам не выполняется, поскольку $ database-> getErrorNum () устарел?

11 голосов | спросил dev-m 29 PMpTue, 29 Apr 2014 18:29:07 +040029Tuesday 2014, 18:29:07

2 ответа


13

JError устарел в J3.x, в пользу исключений PHP, поскольку он intermixed 2 различные концепции программирования : ведение журнала и обработка ошибок (теперь протокол протоколирования реализован как JLog ).

В вашем конкретном случае вы можете обернуть свой код в блок try /catch, чтобы получить ошибку, как показано в

try {
    ...
    $ Db- > SetQuery ($ запроса);
    $ result = $ db-> loadResult ();
}
catch (Исключение $ e) {
    echo $ e- gt; getMessage ();
}

Обратите внимание, что $ database-> execute () указан НЕ работает в J2.5 . Вы должны использовать $ database-> query (), если вам нужен эквивалент.

В Joomla 2.5 и 3.x JDatabase методы объекта updateRecord () и insertRecord () также выдают ошибки, которые вы можете поймать, если они не работают:

try {
    JFactory :: getDbo () -> updateObject ('#_ table_name', $ data);
} catch (Исключение $ e) {
    //... обрабатывать исключение
}

Если вы разрабатываете только для Joomla 3.x, вы также можете использовать блок catch try с помощью транзакций SQL , чтобы получить сведения об ошибке:

$ db = JFactory :: getDbo ();

пытаться {
    $ Db- > transactionStart ();

    $ query = $ db-> getQuery (true);

    $ values ​​= array ($ db-> quote ('TEST_CONSTANT'), $ db-> quote ('Custom'), $ db-> quote ('/path /to /translation.ini'));

    $ Query- > вставки ($ db- & Gt; quoteName ( '#__ подмены'));
    $ query-> столбцы ($ db-> quoteName (array ('constant', 'string', 'file')));
    $ Query- > значения (Implode ( '', $ значения));

    $ Db- > SetQuery ($ запроса);
    $ result = $ db-> execute ();

    $ Db- > transactionCommit ();
}
catch (Исключение $ e) {
    //улавливаем любые ошибки базы данных.
    $ Db- > transactionRollback ();
    JErrorPage :: Render ($ е);
}
ответил codinghands 29 PMpTue, 29 Apr 2014 18:57:28 +040057Tuesday 2014, 18:57:28
0

Идеально установить pecl, затем расширить соответствующий класс JDatabase * и переопределить JFactory :: getDbo () с реализацией ниже, чтобы исключить необходимость в сжатом обновлении кода, чтобы обернуть каждый критический запрос db в утверждения try catch.

Следующая лучшая вещь для меня - это нижняя поддержка старого и нового способов:

Включите это где-нибудь

класс jDbUtils
{
    protected static $ dbErrorMessage = '';

    public static function stupidJ3CatchDatabaseExecute ($ db, $ cmd, $ report = false) {
        self :: $ dbErrorMessage = '';
        пытаться {
            $ res = $ db-> $ cmd ();
            //поддержка ошибок legacy db
            if (method_exists ($ db, 'getErrorNum') & & $ db-> getErrorNum ())
                throw new Exception ($ db-> getErrorMsg ());
            return $ res;
        } catch (Исключение $ e) {
            self :: $ dbErrorMessage = $ e-> getMessage ();
            if ($ report)
                самостоятельно :: reportIfDbError ();
            return false;
        }
    }

    публичная статическая функция reportIfDbError ()
    {
        if (self :: $ dbErrorMessage) {
            JFactory :: getApplication () -> enqueueMessage (self :: $ dbErrorMessage, 'error');
            return true;
        }
    }
}

Затем используйте его так:

function someDbInteraction () {
    $ db = JFactory :: getDbo ();
    $ db-> setQuery ('SELECT no_such_col FROM no_such_table LIMIT 1');
    $ res = jDbUtils :: stupidJ3CatchDatabaseExecute ($ db, 'loadResult');
    if (jDbUtils :: reportIfDbError ())
        return false;
    //делать больше обработки
    return $ res;
}
ответил ekerner 5 Maypm18 2018, 13:37:16

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132