سؤال

لقد كنت ألعب مع شركة تنمية نفط عمان في الأيام القليلة الماضية، وأعمل على نظام إدارة محتوى صغير لتعليم نفسي مهارات OOP، ولكن على الرغم من أنه مجرد نظام إدارة محتوى صغير، فأنا أريده أن يكون قادرًا على التعامل مع كل ما يمكن للويب التعامل معه رمي عليه.

هذا ما توصلت إليه حتى الآن، سأقوم بإضافة تجمع الاتصالات إلى المنشئ لتمكين كميات كبيرة من الاتصالات المتزامنة عند الطلب.أنا جديد جدًا في أمور OOP، لذا أريد القليل من النصائح والنقد، ولا شك أنني ارتكبت خطأً فادحًا هنا.

أخذت الإجابة العليا ل عالمي أو فردي للاتصال بقاعدة البيانات؟ كتصميم أساسي، على الرغم من أنني أضفت مُنشئًا خاصًا لأنني أرغب في استخدام $this->dbConnectionInstance في جميع أنحاء الفصل لاستخدام العديد من الوظائف المساعدة.

شكرًا جزيلاً على وقتك، وسأقدر حقًا أي نصيحة يمكنك تقديمها لي،

-رسم

// Usage Example: $dbconn = dbManager::getConnection();
//                $dbconn->query("SELECT * FROM accounts WHERE id=:id", "':id' => $id");

<?php

class dbManager {
    private static $dbManagerInstance;
    private $dbConnectionInstance;
    private $stime;
    private $etime;
    public $timespent;
    public $numqueries;
    public $queries = array();

    public static function getManager(){
        if (!self::$dbManagerInstance){
            self::$dbManagerInstance = new dbManager();
        }
        return self::$dbManagerInstance;
    }

    // Server details stored in definition file
    private function __construct($db_server=DB_SERVER, $db_user=DB_USER, $db_pass=DB_PASS, $db_params=array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")) {
        if(!$this->dbConnectionInstance)
        {
            try{
                $this->dbConnectionInstance = new PDO($db_server, $db_user, $db_pass, $db_params);
                $this->dbConnectionInstance->setAttribute(PDO::ATTR_PERSISTENT, PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            } catch (PDOException $e) {
                $this->dbConnectionInstance = null;
                die($e->getMessage());
            }
        }
        return $this->dbConnectionInstance;
    }

    private function __destruct(){
        $this->dbConnectionInstance = null;
    }

    private function query($sql, $params = array()) {
        $this->queries[] = $sql;
        $this->numqueries++;
        $this->sTime = microtime();
        $stmt = $this->dbConnectionInstance->prepare($sql);
        $stmt->execute($params);
        $this->eTime = microtime();
        $this->timespent += round($this->eTime - $this->sTime, 4);
        return $stmt;
    }

}

?>

شكرًا لكما على اقتراحاتكما، لقد أضفت الآن التراجع والالتزام بمعالجة الاستثناءات الخاصة بي، أنا فقط أبحث في استخدام الاستعلامات المخزنة مؤقتًا، ولست متأكدًا تمامًا مما سيعطيني هذا؟

هل كانت مفيدة؟

المحلول

تبدو جيدة، أود أن أضيف التراجع الوظيفة، إلى جانب اقتراحات الاستعلام/معلومات الخطأ المخزنة مؤقتًا (إذا كنت تستخدم نظام RDBMS الذي يدعم المعاملات):

try {
    $this->dbConnectionInstance->beginTransaction();
    $stmt = $this->dbConnectionInstance->prepare($sql);
    $stmt->execute($params);
    $this->dbConnectionInstance->commit();
}catch(PDOException $e){
    $this->dbConnectionInstance->rollback();
}

يقترف() , تبدأ المعاملة ()

يحرر:تمت إضافة الروابط أدناه لمزيد من المعلومات حول الاستعلامات المخزنة:

نصائح أخرى

ورمز لديك نظرة dosent سيئة للغاية. ولكن إذا كان يمكن أن تجعل بضعة تغييرات صغيرة (أساسا معالجة الأخطاء).

وكلا من إعداد وتنفيذ عبارات سيعود كاذبة على خطأ. ويمكنك الوصول إلى خطأ من $this->dbConnectionInstance->errorInfo() في المثال الخاص بك أعلاه.

وأيضا إذا كنت تخطط لاستخدام أية استفسارات كبيرة أقترح استخدام استعلام مخزنة: PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true

ويبدو وكأنه بداية جيدة. حظا سعيدا على CMS الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top