在同一个数据库对象上使用pdo query()和自定义getValue()?

时间:2014-03-28 03:09:17

标签: php oop pdo

class connector {
  private static $db;
  function __construct() {
    $this->db = null;
    $this->connect();
  }
  private function connect() {
    $this->db = new PDO('mysql:host=localhost;dbname=database;charset=utf8','user','pass');
  }
  public static function getDB() {
    if (!isset(self::$db)) {
      self::$db = new connector();
    }
    return self::$db;
  }

EDITED

  // this was my original function, I had reduced it for less space. my deepest regrets, I won't do it again.
  public function getValue($sql,$val='') {
    if ($val != '') {
      $data = $this->db->prepare($sql);
      $data->execute($val);
      return $data->fetch(PDO::FETCH_COLUMN);
    }
    else {
      return $this->db->query($sql)->fetch(PDO::FETCH_COLUMN);
    }

使用这个类我可以使用自定义函数轻松地从任何地方使用pdo数据库对象。

$db = connector::getDB();

// var_dump()
db:object(connector)#1 (1) {
  ["db":"connector":private]=>
  object(PDO)#2 (0) {
  }
}

$db->getValue('SELECT foo FROM bar'); //succeeds

$db->query('SELECT foo FROM bar'));
// throws
// Fatal error:  Call to undefined method connector::query()

如果我返回实际的对象参数而不是整个对象:

return self::$db->db;
db:object(PDO)#2 (0) {
}

查询交换角色

$db->getValue('SELECT foo FROM bar');
// throws
// Fatal error:  Call to undefined method connector::getValue()

$db->query('SELECT foo FROM bar')); //succeeds

如何同时使用同一个对象,在同一个脚本中有效地使用$db->query()$db->getValue()

2 个答案:

答案 0 :(得分:2)

首先,您的getValue()方法缺少一项基本功能 - 支持预备语句。如果没有能力运行动态查询,它的价值几乎为零。

其次,如果你还在使用单例 - 那么就不需要额外的方法来获取实例 - 现在单身人士可以自己完成它。

What about this one?我写这篇文章是为了让PDO的使用不那么冗长,利用整齐的方法链接。 DB静态类已经一个PDO实例,无需使用额外调用实例化它。因此,您可以在任何地方运行任何PDO命令:

DB::query('SELECT foo FROM bar LIMIT 1')->fetchColumn();

它比您的空间少得多,但至少它可以让您访问完整的PDO语法,包括对预准备语句的支持

DB::prepare('SELECT foo FROM bar WHERE id=?')->execite([$id])->fetchColumn();

以及所有其他获取方法

DB::query('SELECT foo FROM bar')->fetchAll(PDO::FETCH_COLUMN);

答案 1 :(得分:1)

$db单例的静态实例和私有connector成员变量重用变量PDO会让人感到困惑。不要回避你的单例方法,也许尝试使用一些更好的变量名,例如

class connector {
    private static $instance = null;
    private $db;

    private function __construct() {
        $this->db = new PDO('mysql:host=localhost;dbname=database;charset=utf8','user','pass', [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        ]);
    }

    private function __clone() {} // because singletons should not be cloneable

    public static function getInstance() {
        if (self::$instance == null) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    /**
     * @return PDO
     */
    public function getDb() {
        return $this->db;
    }

    public function getValue($sql) {
        // as is
    }
}

现在,如果您必须运行PDO::query,则可以通过getDb方法执行此操作...

$db = connector::getInstance();
$db->getValue('SELECT foo FROM bar');
$db->getDb()->query('SELECT foo FROM bar');