Php 转换为PDO

Php 转换为PDO,php,pdo,Php,Pdo,非常感谢您阅读我的帖子 我对PHP相当陌生。我已经在一个使用mysqli的项目上工作了一段时间,我正在尝试将它转换为使用PDO。在我当前的设置中,我有一个数据库类。但我已经断断续续地读到,当使用PDO时,使用PDO时拥有一个数据库类是毫无意义的,或者至少是不必要的。我想得到一些关于这方面的意见。我知道这是一个普遍的问题,但我想确保,当我转换我的网站,我正在以正确的方式进行 非常感谢 好的,这里是我的第一个绊脚石的最基本的例子。请不要笑得太厉害…看看这个 try { $handler =

非常感谢您阅读我的帖子

我对PHP相当陌生。我已经在一个使用mysqli的项目上工作了一段时间,我正在尝试将它转换为使用PDO。在我当前的设置中,我有一个数据库类。但我已经断断续续地读到,当使用PDO时,使用PDO时拥有一个数据库类是毫无意义的,或者至少是不必要的。我想得到一些关于这方面的意见。我知道这是一个普遍的问题,但我想确保,当我转换我的网站,我正在以正确的方式进行

非常感谢

好的,这里是我的第一个绊脚石的最基本的例子。请不要笑得太厉害…看看这个

  try {

  $handler = new PDO('mysql:host=localhost;dbname=app', 'root', 'fidelio');
  $handler->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    } catch(PDOException $e){

    echo $e->getMessage();
    die();
 }

  $name = "pdotest";
  $message = "Test message";
  $sql = "INSERT INTO guestbook (name, message, posted) VALUES (?, ?, NOW())";
  $query = $handler->prepare($sql);
  $query->execute(array($name, $message));
这很有效

但为什么这不起作用

  class Database {


   private $handler;

    function Connect() {
    $db_host = "localhost";
    $db_name = "app";
    $db_user = "root";
    $db_pass = "fidelio";
    try {
        $this->handler = new PDO("mysql:host=" . $db_host . ";dbname=" . $db_name,  $db_user, $db_pass);
    } catch(PDOException $e) {
        die($e);
    }
}
}


首先,$handler是私有的,您不能直接访问它们

其次,您忘记使用$database->Connect()

注意getHandler()函数

正如“@Your Common Sense”所说的,注意Connect函数应该只被调用一次——因此,您可以在类构造函数中调用该函数

可以在类构造函数中调用Connect()函数


确实没有必要,但是有一个抽象层是一个非常好的主意。想一想,如果您只需要更改包装类,那么将站点从
mysqli
转换为
PDO
可以节省多少时间。您的数据库类具体做什么?PDO本身就是一个类,当然它可以执行大多数任务,因此另一个类包装它不是强制性的,但是如果你有良好的结构,它可以使开发更容易、更舒适,并避免重复代码。。。对我来说,听起来像是
OOP
PDO的一些关键,它已经是一个具有相当小且体面的API的类。用另一个包装器进一步抽象它是没有实际意义的。话虽如此,如果要包装它,它确实给了您更多的灵活性,例如,您可以延迟实际的数据库连接,直到有东西实际查询数据库。这是否有用取决于你的特殊需要。非常感谢。就目前而言,使用mysqli,我确实有一个数据库类(我认为它不像我在上面写文章的方式那样清晰)。这个类连接到数据库等。所以这是我转换中的第一个调用端口。我只是想把这个类中的所有mysqli转换成PDO。让我困惑的是,在SOF上,一些帖子使用类数据库扩展PDO,而另一些帖子只使用类数据库。基于PDO是一个类,它当然应该是前者?扩展PDO几乎总是一个坏主意。人们必须非常清楚地了解他们在做什么。大多数PHP用户不这样做。@GhostRider注意,在所有应用程序中,您应该只调用一次
Connect()
database = new Database;
$name = "pdotest";
$message = "Test message";
$sql = "INSERT INTO guestbook (name, message, posted) VALUES (?, ?, NOW())";
$database->handler->prepare($sql);
database->execute(array($name, $message));
class Database {
  .....
  public function getHandler() {
    return $this->handler;
  }
}

$database = new Database;
$database->Connect();
$name = "pdotest";
$message = "Test message";
$sql = "INSERT INTO guestbook (name, message, posted) VALUES (?, ?, NOW())";

$database->getHandler()->prepare($sql);
$database->getHandler()->execute(array($name, $message));
class Database {
  .....
   /**
    * Class constructor called when creating new object
    */
   public function __construct() {
       $this->Connect();
   }
}