it-swarm-id.com

Bagaimana cara melakukan penanganan exception / error SQL yang kompatibel dengan 2.5 dan 3.x?

Saya mencoba mengembangkan komponen Joomla 2.5 dan 3. Karena banyak hal yang sudah ketinggalan zaman antara kedua versi ini dan cara melempar dan menangkap basis data dan kesalahan lainnya, saya belum dapat menemukan cara untuk membuat komponen tunggal untuk 2.5 dan 3.

Jadi membuat komponen secara terpisah untuk 2.5 dan 3.

Pertama, dalam 2.5 dengan cara ini saya menangkap kesalahan dalam database: -

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

Tetapi bagaimana cara saya menunjukkan atau mengembalikan pesan kesalahan yang tepat ke kelas tampilan sehingga kesalahan ditampilkan di komponen?

Kedua, untuk jenis lain dari permintaan db, saya mendapatkan data dari db dengan cara ini di kelas model (di sini adalah kode saya dalam fungsi model):

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

Sekarang saya dapat memeriksa $this->_data di kelas tampilan untuk melihat apakah 0 catatan kembali tetapi sekali lagi bagaimana cara menampilkan pesan kesalahan basis data tertentu atau mengembalikan pesan kesalahan ke kelas tampilan saya untuk menunjukkan kesalahan?

Jadi ini adalah cara paling umum pengembang harus menunjukkan kesalahan saat melakukan query database di 2.5.

5
dev-m

Hampir sama dengan jawaban @ValentinDespa tapi saya hanya akan menggabungkan dua hal bersama menjadi sesuatu yang akan bekerja di 2.5 dan 3.x.

Ini daripada menampilkan pesan kesalahan halaman penuh hanya mengembalikan palsu dan kemudian menyisipkan pesan kesalahan ke bagian atas halaman. Semoga itu yang Anda cari

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

Switch warisan JError salah dalam 2,5 untuk menggunakan JError dan kemudian benar dalam 3.x untuk menggunakan pengecualian.

Anda dapat melihat contoh lengkap saya menggunakan ini di salah satu modul saya di sini https://github.com/JoomJunk/shoutbox/blob/development/mod_shoutbox/helper.php#L

6
George Wilson

Berhati-hatilah untuk mengekspos terlalu banyak info! Harap dicatat bahwa dengan melemparkan kesalahan SQL ke alam liar, Anda dapat mengekspos struktur database Anda atau informasi sensitif lainnya. Saya akan melempar kesalahan SQL hanya di backend (katakanlah pengguna tepercaya) dan di muka hanya kesalahan umum dan saya akan mencatat kesalahan sebenarnya dalam log kesalahan.

Melakukan kueri dalam 3.x menangkap dan melempar pengecualian

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

Melakukan kueri di Joomla 2.5 dan 3.x menggunakan fungsi usang yang lama

$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