डेटाबेस लेनदेन में अपवाद / त्रुटि को पकड़ना


11

मैं डेटाबेस क्वेरी को निष्पादित करने के लिए joomla 2.5 और 3 में निम्नलिखित तरीके का उपयोग कर रहा हूं -

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

लेकिन अगर मैं किसी कारण $database->getErrorNum()से वंचित रह जाता हूं तो मैं त्रुटियों / अपवादों को कैसे पकड़ सकता हूं ?

जवाबों:


13

JError को PHP अपवादों के पक्ष में J3.x में पदावनत किया गया है, क्योंकि इसमें 2 अलग-अलग प्रोग्रामिंग अवधारणाओं को जोड़ा गया है : लॉगिंग और त्रुटि से निपटने (लॉगिंग पक्ष को अब JLog के रूप में लागू किया गया है )।

आपके सटीक मामले के लिए, आप त्रुटि प्राप्त करने के लिए अपने कोड को एक कोशिश / कैच ब्लॉक में लपेट सकते हैं, जैसा कि इस SO उत्तर में दिखाया गया है :

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

ध्यान दें कि J2.5 में काम नहीं करने के$database->execute() लिए कहा गया है । यदि आपको समकक्ष की आवश्यकता है तो आपको इसका उपयोग करना चाहिए ।$database->query()

जूमला 2.5 और 3.x में JDatabaseवस्तु विधियां updateRecord() और insertRecord()त्रुटियों को फेंकने पर भी आप पकड़ सकते हैं यदि वे विफल होते हैं:

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

यदि आप केवल जूमला 3.x के लिए विकसित कर रहे हैं, तो आप त्रुटि विवरण प्राप्त करने के लिए SQL लेनदेन के साथ ट्राइ कैच ब्लॉक का भी उपयोग कर सकते हैं :

$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 $ डेटाबेस में -> निष्पादित (); ठीक काम करता है के रूप में मैं जूमला 2.5 और 3 के लिए एक घटक बना रहा हूँ। लेकिन 2.5.11 में काम नहीं करता है (निष्पादित) के साथ अपने पहले प्रयास पकड़ने ब्लॉक। जैसा कि आपने कहा कि Jdatabase ऑब्जेक्ट मेथड केवल 2.5 और 3.1 ही काम करता है इसलिए इसका उपयोग न करें। तो इसे लागू करने के लिए और J 2.5 और 3 वर्जन के साथ संगत करने के लिए और क्या तरीके उपलब्ध हैं ??
देव- m

हं, अजीब है, डॉक्स यह बताता है कि -> निष्पादित () 2.5 में काम नहीं करता है। संपादित करेंगे। JDatabase वस्तु विधियाँ सभी J3.X संस्करणों में काम करना चाहिए
कोडिंगहैंड्स

1
"लेकिन आपका पहला ट्रायल-कैच ब्लॉक जिसका क्रियान्वयन 2.5.11 में नहीं किया गया है" ... आपको क्या त्रुटि मिलती है, यदि कोई हो?
कोडिंगखंड्स

मैंने संदेश की जाँच नहीं की, लेकिन मैंने एक झूठी वापसी की; वहाँ है, लेकिन यह सुनिश्चित करने के लिए गलत नहीं है कि मेरे 2.5.11 साइट के कैच ब्लॉक में प्रवेश नहीं है।
देव- m

क्या आप वैश्विक कॉन्फ़िगरेशन में त्रुटि रिपोर्टिंग सक्षम कर सकते हैं यह देखने के लिए कि क्या PHP कोई त्रुटि उत्पन्न कर रहा है।
कोडिंगखंड्स

0

आदर्श रूप से pecl स्थापित करें, फिर उपयुक्त JDatabase * क्लास का विस्तार करें और JFactory :: getDbo () को नीचे दिए गए कार्यान्वयन के साथ स्क्वील कोड अपडेट की आवश्यकता को समाप्त करने के लिए हर महत्वपूर्ण db क्वेरी को पकड़ने के स्टेटमेंट में लपेटने के लिए लागू करें।

मेरे लिए अगली सबसे अच्छी बात पुराने तरीके और नए तरीके के लिए नीचे का समर्थन है:

इसे कहीं शामिल करें

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;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.