16

我仍然主要从我买的书上学习,但今天我知道我的书很旧,尽管我今年买了一本关于 PHP 编程的书。现在我知道 PHP 中的 mysql_* 命令已被弃用,应该用更安全和稳定的预处理语句和 PDO 替换。所以我让自己根据它重写我所有的网络,也许我需要你的一些建议如何正确地做到这一点,并从你们所有更有经验的人那里工作:)

所以我将在这里只用主要部分(连接到数据库并选择数据库)开始我的重写(其余的我可以用谷歌和手册自己做)。我会在这里写下我的旧脚本,并问你我是否做对了所有事情并且没有遗漏任何东西,我希望这对其他人来说也是一些很好的手册/答案。所以让我们开始吧。

所以在配置中我有这样的东西:

$db = new dbConn('127.0.0.1', 'root', 'pass', 'people', 'animals');

应该是这样的:

$db = new PDO('mysql:host=127.0.0.1;dbname=people;charset=UTF-8', 'root', 'pass');

对?但是当我以后需要选择数据库时,我应该不这样做dbname=people;吗?但是以后如何选择数据库呢?

这是我唯一的一个重写脚本,它在大多数 Web 项目中都是基本的,我希望它不仅能让我了解新的 PDO 系统是如何工作的:

class dbConn
{
  public function __construct($server, $user, $pass, $db_people, $db_animals)
  {    
    if (!empty($server) && !empty($user) && !empty($pass) && !empty($db_people) && !empty($db_animals))
    {
      $this->server = $server;
      $this->user =  $user;
      $this->pass = $pass;
      $this->db_people = $db_people;  
      $this->db_animals = $db_animals;  
      $this->connect(); 
    }  
    else
    {
      die("Set up connection to db");
    }
  }

  public function connect()
  {
    $this->conn = mysql_connect($this->server, $this->user, $this->pass) or die ('cannot connect to MySQL');
  }

  public function selectDb($database)
  {
    switch($database)
    {
      case 'people':
        mysql_select_db($this->db_people, $this->conn) or die ('cannot connect to database '.$this->db_people.'.');
        mysql_query("SET NAMES 'utf8'");
        break;

      case 'animals':
        mysql_select_db($this->db_animals, $this->conn) or die ('cannot connect to database '.$this->db_animals.'.');
        mysql_query("SET NAMES 'utf8'"); 
    }
  }

  public function __destruct() 
  {
    if (!empty($this->conn))
    {
      mysql_close($this->conn); 
    }
  }  
}

因此,根据我从 Google 和 Wiki 中了解到的信息 - 类似public function __construct并且public function __destruct()不再需要的功能,对吧?与public function connect()SO 之类的功能相同,只剩下什么了,public function selectDb($database)但我不知道如何正确地做到这一点,而不会破坏与数据库的所有连接。因为在我的其余代码(此处未提及)中,我可以通过此代码轻松选择数据库:$this->db->selectDb("people");但是使用准备好的语句,我不知道这是否可能以简单的方式实现。我希望你的一些建议能帮助我和其他用户更好地理解这个新代码。您可能拥有的代码中的其他部分在此PDO Tutorial for MySQL Developers中进行了说明。谢谢你。

4

2 回答 2

5

实际上,一个简单、甜蜜和简短的:是的,不再需要了。

让我们回顾一下代码,而不是我们丢失了一些东西:

  • __construct- 构造函数仅包含所有配置。PDO 在这里有一个更简单的概念,一个包含最多信息的连接字符串:

     mysql:host=127.0.0.1;dbname=people;charset=UTF-8
    

    另外 PDO 提供了现成的构造函数供使用,所以不需要加倍。

  • connect- 不再需要连接功能。这是通过已经实例化 PDO 来完成的。您可以查找异常,PHP 手册在其构造函数页面上有一个示例。

  • selectDb- 这个复杂的功能也不再需要了。哇,由于 PDO 连接字符串,我们可以删除第三个函数。这么少的字符却有很大的力量。干杯!

  • __destruct- 析构函数。公平地说:MySQL 也不需要这个。但是,使用 PDO,我们可以免费获得它 - 无需编写任何代码。

看起来挺好的!通过删除过时的代码,您设法从那个晦涩的数据库类迁移到 PDO!恭喜:

$db = new PDO('mysql:host=127.0.0.1;dbname=people;charset=UTF-8', 'root', 'pass');

如果您现在想,如果我想自己拥有数据库类怎么办?好吧,您可以这样做,因为您可以从 PDO 扩展(是的,可行!):

class DB extends PDO
{
   ... my super-new-shiny-code
}

为什么你可能想这样做?不知道,但也许它对您的代码更流畅。如果您正在寻找更好的代码示例,我在PHP/MySQL Table with Hyperlinks中有一个。

于 2012-06-06T18:48:45.093 回答
1

我认为在应用程序中切换数据库的最简单方法是:

$pdo_instance->query("USE people");

$pdo_instance->query("USE animals");

或者可能更好(和更清洁)的方式可能是

$db_people = new PDO('mysql:host=127.0.0.1;dbname=people;charset=UTF-8', 'root', 'pass');

$db_animals = new PDO('mysql:host=127.0.0.1;dbname=animals;charset=UTF-8', 'root', 'pass');

如果您将班级中的数据库标记为活动的,则可以使用$db_people->query()或访问数据$db_animals->query()

于 2012-06-06T18:47:51.230 回答