it-swarm-tr.com

2.5 ve 3.x ile uyumlu SQL istisna / hata işleme nasıl yapılır?

Joomla 2.5 ve 3 bileşenini geliştirmeye çalışıyordum. Bu iki sürüm ve veritabanı ve diğer hataları atma ve yakalama yolu arasında kullanımdan kaldırıldığı için, hem 2.5 hem de 3 için tek bileşen yapmanın yollarını bulamadım.

Bileşeni 2.5 ve 3 için ayrı ayrı yapıyor.

İlk olarak, 2.5 bu şekilde ben veritabanında bir hata yakalamak: -

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

Ancak, bileşende hatanın görüntülenmesi için tam hata iletisini görünüm sınıfına nasıl gösterebilirim veya döndürebilirim?

İkincisi, db sorgusu başka bir tür için, ben model sınıfı db bu şekilde veri alıyorum (burada modelin fonksiyonunda benim kod):

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

Şimdi inceleyebilirim $this->_data sınıfında 0 kaydın geri dönüp dönmediğini görmek için yine de belirli bir veritabanı hata mesajını nasıl görüntülerim veya hataları göstermek için görünüm sınıfıma bir hata mesajı döndürürüm?

Bu, geliştiricilerin 2.5'te veritabanı sorguları yaparken hata göstermesi gereken en yaygın yollardır.

5
dev-m

@ValentinDespa'nın cevabı ile hemen hemen aynı ama ben sadece iki şeyi 2.5 ve 3.x'te çalışacak bir şeyle birleştireceğim.

Tam sayfa hata mesajı görüntülemek yerine bu yalnızca false değerini döndürür ve sayfanın üstüne bir hata mesajı ekler. Umarım peşinde olursun

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

JError eski anahtarı, JError'ı kullanmak için 2.5'te yanlış, sonra da istisnaları kullanmak için 3.x'te doğruydu.

Buradaki modüllerimden birinde bunu kullanmamın tam bir örneğini görebilirsiniz https://github.com/JoomJunk/shoutbox/blob/development/mod_shoutbox/helper.php#L

6
George Wilson

Çok fazla bilgi gösterdiğinizden emin olun! Lütfen SQL hatalarını doğaya atarak veritabanı yapınızı veya diğer hassas bilgilerinizi ortaya koyabileceğinizi unutmayın. SQL hatalarını sadece arka uçta (güvenilir kullanıcılar diyelim) ve ön planda sadece genel bir hata atıyorum ve hata günlüğünde kesin hatayı günlüğe kaydedeceğim.

.x'te sorgulama ve istisnaları atma

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

Eski kullanımdan kaldırılmış işlevleri kullanarak Joomla 2.5 ve 3.x'te bir sorgu yapmak

$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