2017-02-28 56 views
0

我是新来的类和PDO。我想写具有独立功能的一类用于连接到数据库和关闭,这样的连接,在一个页面中,我可以:检索页面内部的连接:PDO和PHP类

  1. 打开与$db->connOpen
  2. 连接执行所有查询我需要的页面
  3. 内关闭在脚本的末尾用$db->connClose

    class database 
    { 
        private $host  = ''; 
        private $db_name = ''; 
        private $charset = ''; 
        private $username = ''; 
        private $password = ''; 
    
    
        public function setHost($host) { 
         $this->host = $host; 
        } 
    
        public function setDbName($db_name) { 
         $this->db_name = $db_name; 
        } 
    
        public function setUser($username, $password) { 
         $this->username = $username; 
         $this->password = $password; 
        } 
    
    
        public function connOpen() { 
         try { 
          $dsn = "mysql:host=$this->host;dbname=$this->db_name;charset=$this->charset"; 
          $db  = new PDO($dsn, $this->username, $this->password, array(PDO::ATTR_PERSISTENT => true)); 
          $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
         } catch (PDOException $e) { 
          echo $e->getMessage(); 
         } 
        } 
    
        public function connClose() { 
         $db = null; 
        } 
    } 
    

我猜的连接问题在于更多的类语法比PDO,因为要发出一个像下面这样的查询到页面,我需要再次实例化类PDO,加倍连接到数据库。

$stmt = $dbo->prepare('SELECT * FROM products WHERE id=:id'); 
$stmt->execute(array(':id' => $id)); 
$res = $stmt->fetchAll(PDO::FETCH_ASSOC); 

我的问题是:

  1. 如何能实现我想用一个类像上面的是什么?
  2. 这是正确的,在这种情况下,使用持续连接

感谢

+2

这里的问题在于,你的类本质上是无用的。不要为了它而编写类。写一个只能做一些有用的课程。 –

回答

1

出于某种原因,谁愿意学OOP大多数人查询开始与实现单和错误处理干扰数据库包装。

我的技巧是,你把数据库连接任何其他变量:

class Post { 
    function getByUserId(PDO $connection, $user_id) { 
    } 
} 

$database = new PDO(...); 
$post->getByUserId($database, 123); 

这就是所谓的依赖注入。

不要浪费时间和精力编写代码,以避免有用的功能,如:

  • 集中的错误处理
  • 能够连接到多个数据库

只有当你确实有真正的功能添加到PDO的顶部时,请关心编写数据库包装器。我能想到的:

  • 转换日期自动DateTime对象
  • 通过所有的查询日志中记录的有趣的活动,如重复的指标违反

  • 掷自定义异常...即使这时,要非常小心,不要让PDO变得更糟;-)

  • +1

    我遵循了将PDO连接作为变量处理的建议,并将其从'conn()'函数返回,并且工作正常。感谢所有其他提示Álvaro! – Brigo

    1

    我用这一个singlton类给我分贝ojbect然后我使用该对象在其他类别进行查询;

    <?php 
        class db{ 
        /*** Declare instance ***/ 
        private static $instance = NULL; 
        /** 
        * 
        * the constructor is set to private so 
        * so nobody can create a new instance using new 
        * 
        */ 
        private function __construct() { 
         /*** maybe set the db name here later ***/ 
        } 
        /** 
        * 
        * Return DB instance or create intitial connection 
        * 
        * @return object (PDO) 
        * 
        * @access public 
        * 
        */ 
        public static function getInstance() { 
         if (!self::$instance) 
         { 
          self::$instance = new \PDO("mysql:host=".databaseHost.";dbname=".databaseName."", databaseUserName,databasePassword);; 
          self::$instance-> setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); 
          self::$instance-> setAttribute(\PDO::ATTR_EMULATE_PREPARES, false); 
         } 
         return self::$instance; 
        } 
        /** 
        * 
        * Like the constructor, we make __clone private 
        * so nobody can clone the instance 
        * 
        */ 
        private function __clone(){ 
        } 
    } /*** end of class ***/ 
    ?> 
    

    课堂,我使用db对象

    <?php 
    class posts { 
    
        public function getPostOfUserId($userId,$offset=0,$limit=NULL){ 
         $helperString=" "; 
         if(!empty($limit)) 
          $helperString=" LIMIT $offset, $limit "; 
         $executor= db::getInstance()->prepare("SELECT posts.*,users.facebook_id, users.first_name as post_by FROM posts JOIN tagged_friends ON posts.id = tagged_friends.post_id JOIN users ON posts.user_id = users.id WHERE tagged_friends.user_id = :user_id ORDER BY posts.id DESC ".$helperString, array(\PDO::ATTR_CURSOR => \PDO::CURSOR_FWDONLY)); 
         $executor->execute(array(':user_id'=>$userId)); 
         $posts=$executor->fetchAll(\PDO::FETCH_ASSOC); 
         if(!empty($posts)) 
          return $posts; 
         else 
          return ; 
        } 
    } 
    
    +0

    你的课程写得很好!但我实际上需要学习更多关于类的知识,以便充分理解它:\ – Brigo