我建立了此类与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_error set_exception_handler ,直到更广泛的异常(exception)情况为止,但它绝对更清洁且更可靠。
  • 您正在使用单例,这不一定不是一件坏事,但是在这种情况下,例如,一个缺点是您将只能处理与一个数据库的一个连接。
  • 我不知道您是否使用存储过程,但是也可以通过query()方法使用存储过程might return a result set
  • ;;行的末尾有两个分号(new PDO)。

  • 话虽这么说,我认为您的查询方法不会太大,并且目前还无法从那里的其他地方调出太多内容。尽管一看到可以从另一个函数调用的两三行,就将其拆分。这是DRY的好方法。

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

    10-16 09:21