使用PDO查询(),并在同一个数据库对象的自定义的getValue()?(Using pdo que

2019-10-19 16:24发布

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()

如果我回到实际的对象PARAM而不是整个的对象:

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()在同一个脚本。

Answer 1:

首先,你getValue()方法缺乏一个基本特征- 准备语句的支持 。 如果没有运行动态查询的能力它的值是几乎为零。

第二,如果你使用的是单身呢 - 那么就没有必要额外的方法来获取一个实例 - 现在单身只需通过自身做到这一点。

这个如何? 我写这使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);


Answer 2:

您再使用的变量$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');


文章来源: Using pdo query() and custom getValue() on same database object?
标签: php oop pdo