it-swarm-vi.com

Làm cách nào để xử lý ngoại lệ / lỗi SQL tương thích với 2.5 và 3.x?

Tôi đã cố gắng phát triển thành phần Joomla 2.5 và 3. Vì nhiều thứ không được chấp nhận giữa hai phiên bản này và cách ném và bắt cơ sở dữ liệu và các lỗi khác, tôi không thể tìm ra cách nào để tạo thành phần duy nhất cho cả 2.5 và 3.

Vì vậy, làm cho thành phần riêng biệt cho 2,5 và 3.

Thứ nhất, trong 2.5 theo cách này, tôi gặp lỗi trong cơ sở dữ liệu: -

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

Nhưng làm thế nào để tôi hiển thị hoặc trả lại thông báo lỗi chính xác cho lớp xem để lỗi đó được hiển thị trong thành phần?

Thứ hai, đối với một loại truy vấn db khác, tôi nhận dữ liệu từ db theo cách này trong lớp mô hình (đây là mã của tôi trong chức năng của mô hình):

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

Bây giờ tôi có thể kiểm tra $this->_data trong lớp xem để xem nếu 0 bản ghi trả về nhưng một lần nữa làm cách nào để hiển thị thông báo lỗi cơ sở dữ liệu cụ thể hoặc trả về thông báo lỗi cho lớp xem của tôi để hiển thị lỗi?

Vì vậy, đây là những cách phổ biến nhất mà các nhà phát triển sẽ hiển thị lỗi trong khi thực hiện các truy vấn cơ sở dữ liệu trong 2.5.

5
dev-m

Khá giống với câu trả lời của @ValentinDespa nhưng tôi sẽ hợp nhất hai thứ lại với nhau thành thứ gì đó sẽ hoạt động trong 2.5 và 3.x.

Điều này thay vì hiển thị thông báo lỗi toàn trang chỉ trả về sai và sau đó chèn thông báo lỗi vào đầu trang. Hy vọng đó là những gì bạn đang theo đuổi

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

Công tắc kế thừa JError là sai trong 2.5 để sử dụng JError và sau đó đúng trong 3.x để sử dụng các ngoại lệ.

Bạn có thể thấy một ví dụ đầy đủ về tôi bằng cách sử dụng điều này trong một trong các mô-đun của tôi tại đây https://github.com/JoomJunk/shoutbox/blob/development/mod_shoutbox/helper.php#L

6
George Wilson

Coi chừng tiết lộ quá nhiều thông tin! Xin lưu ý rằng bằng cách ném lỗi SQL vào tự nhiên, bạn có thể để lộ cấu trúc cơ sở dữ liệu của mình hoặc thông tin nhạy cảm khác. Tôi sẽ chỉ ném lỗi SQL trong phần phụ trợ (giả sử người dùng đáng tin cậy) và trước đó chỉ là một lỗi chung và tôi sẽ ghi lại lỗi chính xác trong nhật ký lỗi.

Thực hiện truy vấn trong 3.x bắt và ném ngoại lệ

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

Thực hiện truy vấn trong Joomla 2.5 và 3.x bằng các hàm cũ không dùng nữa

$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