데이터베이스 트랜잭션에서 예외 / 오류 포착


11

joomla 2.5 및 3에서 다음과 같은 방법으로 데이터베이스 쿼리를 실행하고 있습니다.

$database = JFactory::getDBO();
$database->setQuery
$database->execute();

그러나 $database->getErrorNum()더 이상 사용되지 않는 이유로 인해 쿼리가 실패하면 어떻게 오류 / 예외를 포착 합니까?

답변:


13

JError는 J3.x에서 더 이상 사용되지 않으며 PHP 예외를 선호하여 로깅과 오류 처리라는 두 가지 프로그래밍 개념혼합 되어 로깅 측면이 JLog 로 구현되었습니다 .

정확한 경우, 이 SO 답변에 표시된 것처럼 코드를 try / catch 블록으로 감싸서 오류를 얻을 수 있습니다 .

try {
    ...
    $db->setQuery($query);
    $result = $db->loadResult();
}
catch (Exception $e){
    echo $e->getMessage();
}

참고 $database->execute()로 적혀있다 J2.5에 NOT 작업 . $database->query()동등한 것이 필요한 경우 사용해야 합니다.

Joomla 2.5 및 3.x에서 JDatabase객체 메소드 updateRecord()insertRecord()실패 할 경우 잡을 수있는 오류가 발생합니다.

try {
    JFactory::getDbo()->updateObject('#_table_name', $data);
} catch (Exception $e) {
    //...handle the exception
}

Joomla 3.x 전용으로 개발하는 경우 SQL 트랜잭션 과 함께 try catch 블록을 사용 하여 오류 세부 정보를 얻을 수도 있습니다 .

$db = JFactory::getDbo();

try {
    $db->transactionStart();

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

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

    $query->insert($db->quoteName('#__overrider'));
    $query->columns($db->quoteName(array('constant', 'string', 'file')));
    $query->values(implode(',',$values));

    $db->setQuery($query);
    $result = $db->execute();

    $db->transactionCommit();
}
catch (Exception $e) {
    // catch any database errors.
    $db->transactionRollback();
    JErrorPage::render($e);
}

내 줌라에서 2.5.11 $ database-> execute (); joomla 2.5 및 3의 단일 구성 요소를 만들 때 제대로 작동하지만 execute ()가있는 첫 번째 try-catch 블록은 2.5.11에서 작동하지 않습니다. 당신이 말했듯이 Jdatabase 객체 메소드는 2.5와 3.1에서만 작동하므로 그것을 사용하지 않을 것입니다. 그래서 이것을 구현하는 데 사용할 수 있고 J 2.5와 3 버전과 호환되는 다른 메소드는 무엇입니까 ??.
dev-m

허, 이상하게도 문서는-> execute ()가 2.5에서 작동하지 않는다고 말합니다. 편집합니다. JDatabase 객체 방법은 모든 J3.X 버전에서 작동합니다
codinghands을

1
"하지만 execute ()가있는 첫 번째 try-catch 블록이 2.5.11에서 작동하지 않습니다."어떤 오류가 발생합니까?
codinghands

나는 메시지를 확인하지 않았지만 나는 거짓을 반환했다. 거기에 있지만 거짓을 반환하지는 않으므로 컨트롤이 내 2.5.11 사이트에서 catch 블록에 들어 가지 않습니다.
dev-m

전역 구성에서 오류보고를 활성화 할 수 있습니까? PHP가 오류를 생성하는지 확인하십시오.
codinghands

0

이상적으로 pecl을 설치 한 다음 적절한 JDatabase * 클래스를 확장하고 아래의 구현으로 JFactory :: getDbo ()를 재정 의하여 모든 중요한 db 쿼리를 try catch 문으로 랩핑하기 위해 squillion 코드 업데이트가 필요하지 않습니다.

나에게 가장 좋은 것은 이전 방식과 새로운 방식에 대한 아래의 지원입니다.

어딘가에 이것을 포함

class jDbUtils
{
    protected static $dbErrorMessage = '';

    public static function stupidJ3CatchDatabaseExecute($db, $cmd, $report = false) {
        self::$dbErrorMessage = '';
        try {
            $res = $db->$cmd();
            // legacy db error support
            if (method_exists($db, 'getErrorNum') && $db->getErrorNum())
                throw new Exception($db->getErrorMsg());
            return $res;
        } catch(Exception $e) {
            self::$dbErrorMessage = $e->getMessage();
            if ($report)
                self::reportIfDbError();
            return false;
        }
    }

    public static function 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;
    // do more processing
    return $res;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.