【问题标题】:PHP and PDO classPHP 和 PDO 类
【发布时间】:2013-03-06 13:09:30
【问题描述】:

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

【问题讨论】:

  • 在学习 OOP 之前,您应该学习如何一致地缩进
  • 那我只需要在stackoverflow的编辑器中学习如何做:)

标签: php mysql pdo


【解决方案1】:

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

class Database
{
     protected $pdoInstance;

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

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

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

【讨论】:

    【解决方案2】:

    首先,这么好的问题在这里很少见。
    很少有人了解 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 helper class 获得一些想法。虽然它使用与预准备语句不同的方法,但它比 PDO 更安全

    【讨论】:

    • $var =$othervar 不是语法错误,但$var $othervar 是..我很困惑吗?
    • 你在回答这个问题时喝醉了吗?
    • 我又检查了第三个问题,和你说的没有区别。谢谢你的所有回答。
    • 列表中代码的双缩进 :) 我冒昧地清理了它,希望你不介意
    猜你喜欢
    • 2011-09-11
    • 2016-11-09
    • 2011-07-05
    • 2015-10-24
    • 2015-09-14
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多