2013-03-06 64 views
2

我正在嘗試學習OOP並決定使用PDO創建一個類。下面是我的一些代碼。PHP和PDO類

class DB extends PDO { 

public function _construct($dsn,$user,$pass,$options=""){ 
     $options = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION); 
     try { 
       parent::__construct($dsn, $user,$pass,$options); 
       $this->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
     } 
     catch(PDOException $e) 
     { 
       echo $e->getMessage(); 
     } 
} 


    public function run($query,$all="",$secure=""){ 
    if(empty($secure)){ 
     $qry=$this->query($query); 
    }else{ 
     $qry=$this->prepare($query); 
     $qry->execute($this->cleanup($secure)); 
    } 
    if($all=="all"){ 
     return $qry->fetchAll(PDO::FETCH_ASSOC); 
    }else{ 
     return $qry->fetch(PDO::FETCH_ASSOC); 
    } 
} 



private function cleanup($secure) { 
    if(!is_array($secure)) { 
     if(!empty($secure)) 
      $secure = array($secure); 
     else 
      $secure = array(); 
    } 
    return $secure; 
} 

public function rowCount($table,$extra=""){ 
    $query="Select count(*) from ".$table; 
    if(!empty($extra)){ 
     $query="Select count(*) from ".$table." ".$extra; 
    } 
    $qry=$this->query($query)->fetchColumn(); 
    return $qry; 
} 

public function select($table,$extra=""){ 
    $query="Select * from ".$table; 
    if(!empty($extra)){ 
     $query="Select * from ".$table." ".$extra; 
    } 
    return $this->query($query); 
} 


} 

是什麼如下代碼,爲什麼我沒有得到同樣的結果之間的差異?

//usage 1 (it doesnt work that way) 
$return =$qry->fetchAll(PDO::FETCH_ASSOC); 

return $return; 

//usage 2 (it is exactly what i need but i want to learn the difference) 
return $qry->fetchAll(PDO::FETCH_ASSOC); 

編輯:我真的不知道我在做什麼錯,但它似乎有兩個工作,現在這些usages.They之間沒有什麼區別。

這是我用我的方法

$result=$db->run("my query","all"); 
foreach($result as $r){ 
    // 
} 

在構造方法中我使用PDO的查詢方法,以字符集爲UTF-8,但它不工作。如果我在創建了一個DB對象之後使用它,

try { 
    parent::__construct($dsn, $user,$pass,$options); 
    $this->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
      $this->query("SET NAMES 'UTF8'"); 
      $this->query("SET CHARACTER SET UTF8"); 
} 

最後一個問題

  //what do u think about this usage.I didnt run accross some thing like this 
      //all the pdo classes i checked use it just 
      // return $qry->fetchAll(PDO::FETCH_ASSOC); 
      //do you think i need to separate "fetchAll" and "fetch" 
      if($all=="all"){ 
     return $qry->fetchAll(PDO::FETCH_ASSOC); 
    }else{ 
     return $qry->fetch(PDO::FETCH_ASSOC); 
    } 
+1

在你學習OOP之前,你應該學習如何一致地縮進 – 2013-03-06 13:21:36

+0

然後我只需要學習如何在stackoverflow的編輯器中進行操作:) – kres 2013-03-06 13:42:39

回答

2

不要擴展PDO,它在很多方面都是錯誤的。喜歡你的標題所暗示的

class Database 
{ 
    protected $pdoInstance; 

    public function __construct($pdoInstance) 
    { 
      $this->pdoInstance = $pdoInstance; 
    } 

    public function query($query) 
    { 
     $preparedStatement = $this->pdoInstance->prepare(); 
     /* bla bla bla */ 
    } 
} 

該代碼使得很多更有意義,而且是良好的面向對象編程的一個更好的例子你應該用它代替。 (但它仍然讓我畏縮不過,但這是一個好開始)

1

首先,這樣一個很好的問題可以在這裏很少見到。
很少有人瞭解PDO抽象類的需求。

所以,這裏有一些建議。

  1. 請勿將run設置爲單一功能。爲不同的結果類型分別使用不同的方法會更加方便。比較

    $data = $db->getAll($sql); 
    $data = $db->run($sql,"all"); 
    
    $data = $db->getOne($sql); 
    $data = $db->run($sql,"one"); 
    
    $data = $db->getCol($sql); 
    $data = $db->run($sql,"col"); 
    
  2. 您需要考慮函數名稱。您的「清理」功能不會進行任何清理。
    我會使用func_get_args()來代替。

  3. 以下代碼之間有什麼區別,爲什麼我不會得到相同的結果?

    沒有區別

    $return = $qry->fetchAll(PDO::FETCH_ASSOC); 
    return $return; 
    

    應該工作。定義「它不起作用」。

  4. 在構造方法中,我使用PDO的查詢方法將字符設置爲utf-8,但它不起作用。

    雖然你應該在DSN中設置charset,但這個應該也能工作。定義「不工作」

  5. 另外我會建議在構造函數中創建DSN,使配置文件更熟悉。 你也可以從我的mysql helper class得到一些想法。雖然它使用準備好的語句中的不同方法,但它比PDO更安全

+2

'$ var = $ othervar'不是語法錯誤,但'$ var $ othervar'是..我困惑嗎? – 2013-03-06 13:43:47

+2

回答這個問題時你喝醉了嗎? – Shoe 2013-03-06 13:45:51

+0

我再次檢查了第3個問題,您說的沒有區別。感謝您的所有答案。 – kres 2013-03-07 03:22:56