it-swarm-tr.com

Veritabanı işleminde kural dışı durum / hata yakalama

Veritabanı sorgusu yürütmek için joomla 2.5 ve 3 aşağıdaki yolu kullanıyorum -

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

ancak $database->getErrorNum() kullanımdan kaldırıldığı için sorgu herhangi bir nedenle başarısız olursa hataları/istisnaları nasıl yakalarım?

11
dev-m

JError, J3.x'te PHP istisnalar, örneğin 2 farklı programlama kavramı karıştırılmıştır : günlüğe kaydetme ve hata işleme ( JLog ) olarak uygulanır.

Tam durumunuz için, this SO answer :

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

$database->execute() ifadesinin J2.5 ile çalışmaz olarak belirtildiğini unutmayın. Eşdeğeri gerekiyorsa $database->query() kullanmalısınız.

Joomla 2.5 ve 3.x'te JDatabase nesne yöntemleriupdateRecord() ve insertRecord() da başarısız olursa yakalayabileceğiniz hataları atar:

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

Yalnızca Joomla 3.x için geliştiriyorsanız, hata ayrıntılarını almak için SQL işlemleri ile bir try catch bloğu da kullanabilirsiniz:

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

İdeal olarak pecl'i yükleyin, ardından uygun JDatabase * sınıfını genişletin ve JACTtory :: getDbo () yöntemini, aşağıdaki catch uygulamasıyla, try catch deyimlerinde her kritik db sorgusunu sarmak için bir squillion kod güncellemesi ihtiyacını ortadan kaldırmak için geçersiz kılın.

Benim için en iyi şey, eski ve yeni yol için aşağıdaki destek:

Bunu bir yere dahil et

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

O zaman böyle kullan

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;
}
0
ekerner