php - 这是 PDO 'good code' 的包装器吗?有没有潜在的问题?

标签 php refactoring pdo

我构建这个类是为了与 PDO 一起工作,使 SQL 查询“更容易”并且更少担心。

这是我的想法

  • 它应该更像是 DB 类扩展 PDO 吗?
  • 查询方法是否太大?是否应该将其拆分为私有(private)方法,这些方法被称为...这就是所谓的松散耦合吗?
  • 我检测 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;

    }
 }

最佳答案

这还不错,正如人们所说,它可能对小型应用程序有所帮​​助,尽管它主要是另一个抽象的非常薄的抽象。它没有带来很多其他功能。

除其他事项外,您可能要考虑的事项:

  • 因为这是 PHP5 代码,所以使用 exceptions而不是 trigger_errorset_exception_handler如果有必要,直到异常更普遍,但它绝对更干净,更面向 future 。
  • 您使用的是单例,这不一定是坏事,但在这种情况下,例如,一个缺点是您只能处理与一个数据库的一个连接。
  • 我不知道你是否使用存储过程,但是一个存储过程might return a result set也可以通过 query() 方法。
  • new PDO 行末尾有两个分号 (;;)。

话虽这么说,但我认为您的查询方法并不过分,目前也没有太多可以从其他地方召回的方法。尽管一旦看到可以从另一个函数调用的两三行,就将其拆分。这是 DRY 的好方法.

关于php - 这是 PDO 'good code' 的包装器吗?有没有潜在的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/617646/

相关文章:

php - 将数据拆分为两个表

php - 当要比较的元数据是序列化数组时,Wordpress meta_query 值数组?

c# - 如何检查一个字符串是否不等于所有这些?

programming-languages - 您重构代码的频率和频率如何?

php - 如何在几行代码中将大量数组键重构为对象属性?

php - 了解 PDO/Prepared Statements 如何与多种数据库类型配合使用

php - PDO 中插入语句的正确使用方法

php - 计算时间粒度

php - 我无法通过亚马逊商品广告 API 获取价格

php - 安装迁移 (laravel) 期间 mysql 服务器已经消失错误