هذا المجمع لشركة تنمية نفط عمان 'جيدة رمز' ?هل هناك أي احتمال المشاكل ؟

StackOverflow https://stackoverflow.com/questions/617646

  •  03-07-2019
  •  | 
  •  

سؤال

لقد بنيت هذه الفئة للعمل مع شركة تنمية نفط عمان ، لجعل استعلامات SQL أسهل و أقل ما يدعو للقلق.

وهنا أفكاري

  • ينبغي أن تكون أكثر مثل فئة DB يمتد PDO ؟
  • هو طريقة الاستعلام كبير جدا ؟ يجب أن تنقسم إلى طرق خاصة والتي تسمى..هذا ما يعرف باسم اقتران فضفاض?
  • هو وسيلة للكشف عن استعلام تحديد قبيحة جدا لانها تملك جيد ؟
  • ما هي المشاكل الأخرى واضحة?وأنا نوع من التعلم-كما أنا-الذهاب, أنا متأكد من أني يمكن أن يغفل عنها الكثير من المشاكل المحتملة.

شكرا لك

`

 class Db
 {
    private static $_instance = NULL;


    private function __construct() {

        // can not call me
    }

    private function __clone() {

        // no!
    }

    public static function getInstance() {

        if (!self::$_instance)
        {

            try {

                self::$_instance = new PDO('mysql:host=' . CONFIG_MYSQL_SERVER . ';dbname=' . CONFIG_MYSQL_DATABASE, CONFIG_MYSQL_USERNAME, CONFIG_MYSQL_PASSWORD);;
                self::$_instance-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

            } catch(PDOException $e) {

                trigger_error($e->getMessage());

            }

        }

        return self::$_instance;


    }



    public static function query($query /*string*/, $bindings = NULL)
    {

        $queryPortion = substr($query,0, 6);

        try {

            if ($bindings) {

                    $prepared = self::getInstance()->prepare($query);

                    foreach($bindings as $binding=>$data) { // defaults to string

                        if (!is_array($data)) {
                            $prepared->bindParam($binding, $data); 

                        } else {

                            switch(count($data)) {

                                case 1:
                                    $prepared->bindParam($binding, $data['value']);
                                    break;                          

                                case 2:
                                    $prepared->bindParam($binding, $data['value'], $data['dataType']);
                                    break;

                                case 3:
                                    $prepared->bindParam($binding, $data['value'], $data['dataType'], (int)$data['length']);
                                    break;                          

                                default:
                                    trigger_error('An error has occured with the prepared statement bindings.');
                                    return false;
                                    break;
                            }
                        }

                    }

                    $prepared->execute();

                    return $prepared->fetchAll(PDO::FETCH_ASSOC);


            } else if (String::match($queryPortion, 'select')) { // if this is a select query

                $rows = self::getInstance()->query($query);

                return $rows->fetchAll(PDO::FETCH_ASSOC);

            } else {

                return self::getInstance()->exec($query);

            }


        } 
        catch(PDOException $e)
        {
            trigger_error($e->getMessage());
        }


    }

    public static function getLastInsertId()
    {
        try {
            self::getInstance()->lastInsertId();
          }
        catch(PDOException $e)
        {
            trigger_error($e->getMessage());
        }

    }

    public static function disconnect()
    {
        // kill PDO object
        self::$_instance = NULL;

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

المحلول

إنه ليس سيئًا وكما قيل أنه قد يساعد في التطبيقات الصغيرة على الرغم من أنه في الغالب عبارة عن فكرة مجردة رقيقة جدًا عن فكرة مجردة أخرى.إنها لا تجلب الكثير من وظائف الآخرين.

شيء قد ترغب في النظر فيه، من بين أمور أخرى:

  • نظرًا لأن هذا كود PHP5، فاستخدمه استثناءات بدلاً من trigger_error و set_exception_handler إذا لزم الأمر حتى تصبح الاستثناءات أكثر انتشارًا، ولكنها بالتأكيد أكثر نظافة وأكثر مقاومة للمستقبل.
  • أنت تستخدم مفردًا، وهذا ليس أمرًا سيئًا بالضرورة، ولكن في هذه الحالة، على سبيل المثال، سيكون أحد أوجه القصور هو أنك ستتمكن فقط من التعامل مع اتصال واحد بقاعدة بيانات واحدة.
  • لا أعرف إذا كنت تستخدم الإجراءات المخزنة، ولكن الإجراء المخزن قد ترجع مجموعة النتائج عبر ال query() الطريقة أيضا.
  • لديك فاصلة منقوطة (;;) في نهاية الخاص بك new PDO خط.

ومع ذلك، لا أعتقد أن طريقة الاستعلام الخاصة بك كبيرة جدًا وليس هناك الكثير مما يمكن استرجاعه من مكان آخر هناك في الوقت الحالي.على الرغم من أنه بمجرد رؤية سطرين أو ثلاثة أسطر يمكن استدعاؤها من وظيفة أخرى، قم بتقسيمها.هذه طريقة جيدة ل جاف.

نصائح أخرى

نعم و لا.

انه لامر جيد مدونة بسيطة سريعة وقذرة التطبيق.

المشكلة تأتي عند استخدام هذا في أكثر تعقيدا تطبيق منظم.حيث معالجة الخطأ سوف تختلف اعتمادا على sql التي يتم تنفيذ.

أيضا أي شديد الأخطاء سوف تظهر بأنها "مشكلة في خط 999" نوع الأخطاء حيث 999 في السوبر المخادع الروتين سيكون لديك صعوبة تعقبها معين sql الطلب.

وقد قلت أن أفعل هذا الشيء من نفسي طوال الوقت على المشاريع الصغيرة.

إليك ما استخدمته (فقط استبدل المراجع إلى Zzz_Config بـ $GLOBALS['db_conf'] أو شيء من هذا القبيل):

/**
 * Extended PDO with databse connection (instance) storage by name.
 */
class Zzz_Db extends PDO
{
    /**
     * Named connection instances.
     *
     * @var array
     */
    static private $_instances;

    /**
     * Retrieves (or instantiates) a connection by name.
     *
     * @param  string $name  Connection name (config item key).
     * @return Zzz_Db        Named connection.
     */
    static public function getInstance($name = null)
    {
        $name = $name === null ? 'db' : "db.$name";
        if (!isset(self::$_instances[$name])) {
            if (!$config = Zzz_Config::get($name)) {
                throw new RuntimeException("No such database config item: $name");
            }
            if (!isset($config['dsn'])) {
                if (!isset($config['database'])) {
                    throw new RuntimeException('Invalid db config');
                }
                $config['dsn'] = sprintf('%s:host=%s;dbname=%s',
                    isset($config['adapter']) ? $config['adapter'] : 'mysql',
                    isset($config['host']) ? $config['host'] : 'localhost',
                    $config['database']);
            }

            $db = self::$_instances[$name] = new self(
                $config['dsn'],
                isset($config['username']) ? $config['username'] : null,
                isset($config['password']) ? $config['password'] : null);
            $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            //$db->setAttribute(PDO::ATTR_STATEMENT_CLASS, 'Zzz_Db_Statement');

            if ($db->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql') {
                $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
                $db->exec('SET CHARACTER SET utf8');
            }
        }

        return self::$_instances[$name];
    }
}

الاستخدام يجب أن يكون:

$db = Zzz_Db::getInstance(); // or Zzz_Db::getInstance('some_named_db')
$stmt = $db->prepare('SELECT ...

الهدف هو الاحتفاظ بتكوين قاعدة البيانات في ملف *.ini (قابل للتحرير بواسطة شخص غير مبرمج).

لقد ذهبت في الاتجاه الآخر وقمت بإنشاء فصل دراسي يوسع PDO مع مجموعة من وظائف المجمع prepare()/execute(), ، وهي أجمل بكثير من الوظائف المضمنة (على الرغم من أن هذا أمر شخصي بعض الشيء ...).

الشيء الآخر:يجب عليك تعيين PDO::ATTR_EMULATE_PREPARES ل false إلا إذا كنت تستخدم إصدارًا قديمًا من mysql (<=4.0).انها افتراضية ل true, وهو صداع كبير ويتسبب في كسر الأشياء بطرق غامضة ...والذي أعتقد أنه هو السبب وراء حصولك على غلاف ضخم bindParam() في المقام الأول.

للإجابة على سؤالك، إذا كان رمزًا جيدًا أم لا، اسأل نفسك:
ما هي القيمة المضافة للكود الخاص بي مقارنة باستخدام PDO مباشرة؟

إذا وجدت إجابة جيدة، فاستخدم الكود الخاص بك.إذا لم يكن الأمر كذلك، سأظل مع شركة تنمية نفط عمان.

حاول أيضًا التفكير في التنفيذ إطار زندفئة DB التي تعمل من تلقاء نفسها وتدعم PDO.

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