如何用已废弃的MySQL_*函数成功地重写MySQL-php旧代码?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (98)

因此,在配置中,我有如下所示:

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

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 __constructpublic function __destruct()不应该再需要了,对吧?类似的函数也是如此public function connect()所以只剩下什么public function selectDb($database)但是,我不知道如何在不影响到数据库的所有连接的情况下正确地完成这个任务。因为在我的其余代码中(这里没有提到),我可以通过以下代码轻松地选择数据库:$this->db->selectDb("people");但是,有了事先准备好的声明,我不知道这是否可能以简单的方式进行。我希望你的一些建议能帮助我和其他用户更好地理解这个新代码。您可能有的代码中的其他部分在下面的代码中有所体现.

提问于
用户回答回答于

让我们回顾一下代码,而不是我们丢失了什么:

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

另外,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
}
用户回答回答于

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

$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()...

扫码关注云+社区