在类上下文中使用新的PDO的正确方法是什么?

问题描述:

在过去,我一直创建一个数据库类,并在该类中通过__construct方法通过mysql_connect为连接分配了$ connection属性。在同一个文件中,我将实例化该类,以便它可以继续。然后,每当我需要连接时,我只需要该数据库文件并在需要$连接的方法中添加一个全局$连接。使用php的PDO实现类似或更好的事情的最佳方式是什么?在类上下文中使用新的PDO的正确方法是什么?

+0

如果萨瓦斯的方法解决了您的问题,您应该选择它作为答案... – Shaokan

我相信没有“最好”的方法来实现你所要求的,但这里是我使用的。函数execute是根据我的需要设计的,您可以根据需要更改它。

**编辑**

顺便说一句,我在这个类使用一个单独的方法,因为我调用类的不同文件中的几次。因此,你也可以改变这一点。

class DB 
{ 
    /* Connection settings */ 
    private static $host = 'localhost'; 
    private static $user = 'root'; 
    private static $pass = 'your_pass'; 
    private static $base = 'your_db'; 

    private static $ins; // pdo instance 
    private static $class; // class object for singleton 

    public static $counter; // counts how many times execute is called 

    public function __construct() 
    { 

    } 

    public static function connect($errMode = PDO::ERRMODE_SILENT) 
    { 
     if (!isset(self::$ins)) 
     { 
      try 
      { 
       self::$ins = new PDO("mysql:host=" . self::$host . ";" ."dbname=" . self::$base . ";", self::$user, self::$pass); 
       self::$ins->setAttribute(PDO::ATTR_ERRMODE, $errMode); 
       // PDO::ERRMODE_EXCEPTION 
      } 
      catch (Excpetion $ex) 
      { 
       self::raiseError($ex); 
      } 
      $className = __CLASS__; 
      self::$class = new $className; 
     } 
     return self::$class; 
    } 

    /** 
    * Function to execute a given query 
    * @param string $query : query string 
    * @param string | array $param : parameter (either array of parameters or string) 
    * @param bool $useBind : if true bindParam method will be used, else execute method will be called 
    * @return PDOStatement 
    */ 
    public function execute($query, $param, $useBind=true) 
    { 
     self::$counter++; 
     $stmt = self::$ins->prepare($query); 

     if (!$useBind) 
      $stmt->execute($param); 
     else 
     { 
      if (is_array($param)) 
      { 
       $size = sizeof($param); 
       // if items within param param are array (e.g. array(array(value, name, type, length), 
       //             array(value, name, type, length)) 
       if ($size >= 1 && is_array($param[0])) 
       { 
        $i = 1; // ? placeholder counter 
        foreach ($param as $arr) 
        { 
         $size = sizeof($arr); 
         if ($size == 1) // e.g. array('red') 
          $stmt->bindParam($i, $arr[0]); 
         else if ($size == 2) // e.g. array(':color', 'red') 
          $stmt->bindParam($arr[0], $arr[1]); 
         else if ($size == 3) // e.g. array(':color', 'red', PDO::PARAM_STR) 
          $stmt->bindParam($arr[0], $arr[1], $arr[2]); 
         else // e.g. array(':color', 'red', PDO::PARAM_STR, 12) 
          $stmt->bindParam($arr[0], $arr[1], $arr[2], $arr[3]); 
         $i++; 
        } 
       } 
       else if ($size == 1) // e.g. array(15) 
        $stmt->bindParam(1, $param[0]); 
       else if ($size == 2) // e.g. array(':color', 'red') 
        $stmt->bindParam($param[0], $param[1]); 
       else if ($size == 3) // e.g. array(':color', 'red', PDO::PARAM_STR) 
        $stmt->bindParam($param[0], $param[1], $param[2]); 
       else if ($size == 4) // e.g. array(':color', 'red', PDO::PARAM_STR, 12) 
        $stmt->bindParam($param[0], $param[1], $param[2], $param[3]); 
      } 
      else // e.g. $db::execute($query, 15) 
       $stmt->bindParam(1, $param); 
      $stmt->execute(); 
     } 

     return $stmt; 
    } 

    public function query($query) 
    { 
     self::$counter++; 
     $result = self::$ins->query($query); 
     return $result; 
    } 

    public function close() 
    { 
     self::$ins = null; 
    } 

    public function lastId() 
    { 
     $id = self::$ins->lastInsertId(); 
     return $id; 
    } 

    public function trans() 
    { 
     self::$ins->beginTransaction(); 
    } 

    public function commit() 
    { 
     self::$ins->commit(); 
    } 

    public function rollBack() 
    { 
     self::$ins->rollBack(); 
    } 

    private function raiseError($er) 
    { 
     throw new Exception($er); 
    } 

    public function counter() 
    { 
     return self::$counter; 
    } 
} 
+0

感谢您的简洁回应。这非常有帮助。 – Scott

+0

很高兴帮助:) –

我相信“最好”的方法取决于情况。通常我使用PDO,因为它主要是内置功能。我喜欢创建自己的类来扩展PDO。

个人(这并不意味着'最好的方式')如果应用程序很小我使用'fat-database-class'模型,它使用SQL查询保留所有小函数,它只是通过数据库获取/检查/设置信息。 'fat-database-class'扩展PDO,这意味着我不需要写函数,如执行get lastId因为PDO已经有了这些方法。 如果应用程序更大,我使用框架&原则,使得管理比较容易。如果你还没有尝试过使用任何PHP框架,我建议你选择一个并尝试。框架有自己的规则,所以你不需要搜索和思考如何为自己的应用程序创建“完美规则”。

+0

谢谢,是的,我一直在尝试yii,它似乎很棒。我很难适应。我猜是因为我正在建立在其他人民代码之上。 – Scott