当前位置:  开发笔记 > 编程语言 > 正文

这是PDO'良好代码'的包装器吗?有任何潜在的问题吗?

如何解决《这是PDO'良好代码'的包装器吗?有任何潜在的问题吗?》经验,为你挑选了1个好方法。

我构建了这个类来使用PDO,使SQL查询"更容易"而不用担心.

这是我的想法

它应该更像是DB类扩展PDO吗?

查询方法太大了吗?它应该被分成私有方法吗?这就是所谓的松散耦合

我检测SELECT查询的方式是否太难看了?

还有哪些明显问题?因为我有点学习,我确信我可以忽略很多潜在的问题.

谢谢

`

 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;

    }
 }

lpfavreau.. 5

它并不坏,因为据说它可能对小应用程序有所帮​​助,尽管它主要是对另一个抽象的非常薄的抽象.它没有带来很多其他功能.

你可能想要考虑的事情,除其他外:

由于这是PHP5的代码,使用异常,而不是trigger_errorset_exception_handler如果必要的话,直到例外的是更广泛,但它肯定更清洁,更面向未来的.

你正在使用单例,这不是坏事,但在这种情况下,例如,一个缺点是你只能处理一个连接到一个数据库.

我不知道您是否使用存储过程,但存储过程也可能通过该query()方法返回结果集.

你的行尾有两个分号(;;)new PDO.

话虽这么说,我认为你的查询方法不是太大,而且目前其他地方也无法回忆起来.虽然只要看到可以从另一个函数调用的两行或三行,就将其拆分.这是干燥的好方法.



1> lpfavreau..:

它并不坏,因为据说它可能对小应用程序有所帮​​助,尽管它主要是对另一个抽象的非常薄的抽象.它没有带来很多其他功能.

你可能想要考虑的事情,除其他外:

由于这是PHP5的代码,使用异常,而不是trigger_errorset_exception_handler如果必要的话,直到例外的是更广泛,但它肯定更清洁,更面向未来的.

你正在使用单例,这不是坏事,但在这种情况下,例如,一个缺点是你只能处理一个连接到一个数据库.

我不知道您是否使用存储过程,但存储过程也可能通过该query()方法返回结果集.

你的行尾有两个分号(;;)new PDO.

话虽这么说,我认为你的查询方法不是太大,而且目前其他地方也无法回忆起来.虽然只要看到可以从另一个函数调用的两行或三行,就将其拆分.这是干燥的好方法.

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有