PHP和PDO类

问题描述:

我正在尝试学习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

然后我只需要学习如何在*的编辑器中进行操作:) – kres 2013-03-06 13:42:39

不要扩展PDO,它在很多方面都是错误的。喜欢你的标题所暗示的

class Database 
{ 
    protected $pdoInstance; 

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

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

该代码使得很多更有意义,而且是良好的面向对象编程的一个更好的例子你应该用它代替。 (但它仍然让我畏缩不过,但这是一个好开始)

首先,这样一个很好的问题可以在这里很少见到。
很少有人了解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