2

我正在尝试学习 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,但它不起作用。如果我在创建数据库对象后使用它就可以工作。

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

2 回答 2

2

不要扩展 PDO,它在很多方面都是错误的。你应该像你的标题所暗示的那样使用它

class Database
{
     protected $pdoInstance;

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

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

这段代码更有意义,是良好的面向对象编程的一个更好的例子。(它仍然让我畏缩,但这是一个好的开始)

于 2013-03-06T14:25:56.780 回答
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 中设置字符集,但这个也应该可以工作。定义“不工作”

  5. 另外我建议在构造函数中创建 DSN,使配置文件更加熟悉。您可能还希望从我的mysql 助手类中获得一些想法。尽管它使用与准备好的语句不同的方法,但它比 PDO 更安全

于 2013-03-06T13:40:44.073 回答