ডাটাবেস লেনদেনে ব্যতিক্রম / ত্রুটি ধরা


11

আমি ডেটাবেস কোয়েরি সম্পাদন করতে জুমলা 2.5 এবং 3 এ নিম্নলিখিত পদ্ধতি ব্যবহার করছি -

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

কিন্তু যদি কোয়েরিটি হতাশার কারণে কোনও কারণে ব্যর্থ হয় তবে আমি কীভাবে ত্রুটিগুলি / ব্যতিক্রমগুলি ধরব $database->getErrorNum()?

উত্তর:


13

জেআরআর পিএইচপি ব্যতিক্রমগুলির পক্ষে, জে 3.x এ অবচিত করা হয়েছে, কারণ এটি 2 টি পৃথক প্রোগ্রামিং ধারণার সংমিশ্রণ করেছে : লগিং এবং ত্রুটি হ্যান্ডলিং (লগিং পক্ষটি এখন জেএলজিও হিসাবে প্রয়োগ করা হয়েছে )।

আপনার সঠিক ক্ষেত্রে, ত্রুটিটি পেতে আপনার কোডটি চেষ্টা / ক্যাচ ব্লকে মোড়ানো করতে পারেন, যেমনটি এই উত্তরের উত্তরটিতে দেখানো হয়েছে :

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

নোট যে J2.5 কাজ$database->execute() করে না বলা হয়েছে । আপনার $database->query()যদি সমতুল্য প্রয়োজন হয় তবে আপনার ব্যবহার করা উচিত ।

জুমলা ২.৫ এবং ৩.x এ JDatabaseঅবজেক্টের পদ্ধতিগুলি updateRecord() এবং insertRecord()ত্রুটিগুলি ছুঁড়ে ফেলতে পারে যদি তারা ব্যর্থ হয় তবে:

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

আপনি যদি জুমলা ৩.x এর জন্য বিকাশ করে থাকেন তবে ত্রুটির বিবরণ পেতে আপনি এসকিউএল লেনদেনের সাহায্যে একটি ট্র্যাচ ক্যাচ ব্লকও ব্যবহার করতে পারেন :

$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.1 কাজ করে তাই এটি ব্যবহার করবে না o সুতরাং এটি বাস্তবায়নের জন্য আর কোন জে 2.5 এবং 3 সংস্করণের সাথে সামঞ্জস্যযোগ্য অন্যান্য কোন পদ্ধতি ??
dev-m

হু, অদ্ভুত, দস্তাবেজগুলিতে মনে হয়েছে যে -> এক্সিকিউট করুন () 2.5 তে কাজ করে না। সম্পাদনা করবে। জেডাটাবেস অবজেক্ট পদ্ধতিগুলি সমস্ত J3.X সংস্করণে কাজ করা উচিত
কোডিংহ্যান্ডস

1
"তবে এক্সিকিউটেড () আপনার প্রথম ট্রাই-ক্যাচ ব্লকটি 2.5.11 এ কাজ করে না" ... যদি কোন ত্রুটি পান তবে কী?
কোডিংহ্যান্ডস

আমি বার্তাটি যাচাই করিনি তবে আমি মিথ্যা রিটার্ন দিয়েছি; সেখানে কিন্তু এটি নিশ্চিতভাবে মিথ্যা প্রত্যাবর্তন করছে না তাই আমার 2.5.11 সাইটে ক্যাচ ব্লকে প্রবেশ না করা নিয়ন্ত্রণ।
দেব-এম

আপনি কী বিশ্বব্যাপী কনফিগারেশনে ত্রুটি প্রতিবেদন সক্ষম করতে পারবেন তা দেখতে পিএইচপি কোনও ত্রুটি উত্পন্ন করছে কিনা।
কোডিংহ্যান্ডস

0

আদর্শভাবে পিসিএল ইনস্টল করুন তারপরে যথাযথ জেডিটাবেস * বর্গটি প্রসারিত করুন এবং জেফ্যাক্টরি :: গেটডবো () কে নীচের প্রয়োগের মাধ্যমে প্রতিটি সমালোচনামূলক ডিবি ক্যোয়ারিকে ক্যাচ স্টেটমেন্টে মোড়ানোর জন্য প্রয়োজনীয় প্রয়োজন নির্মূল করুন।

আমার জন্য পরবর্তী সেরা জিনিসটি হল পুরানো উপায় এবং নতুন উপায়ে নীচের সমর্থন:

এটি কোথাও অন্তর্ভুক্ত করুন

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;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.