PHP和PDO类

时间:2013-03-06 13:09:31

标签: php mysql pdo

我正在努力学习OOP,并决定创建一个使用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);

编辑:我真的不知道自己做错了什么,但似乎这些用法没有区别。他们现在都在工作。

这就是我使用方法的方法

$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);
    }

2 个答案:

答案 0 :(得分: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 :(得分: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

  6. 更安全