如何使用已弃用的mysql_ *函数成功重写旧的mysql-php代码?

时间:2012-06-06 17:39:09

标签: php mysql database deprecated

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

所以我将在这里开始我的重写只有主要部分(连接数据库并选择数据库)(其余的我可以自己用google和手册)。我会在这里写下我的旧剧本,并问你我是否正在做一切正确而且没有遗漏任何东西,我希望这也可以成为其他人的好手册/答案。让我们开始吧。

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

$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;的情况下执行此操作吗?但是如何在以后选择数据库?

这是我唯一的重写脚本,这是大多数网络项目的基础,我希望它不仅能让我理解新的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); 
    }
  }  
}

因此,根据我从谷歌和维基的知识,不再需要像public function __constructpublic function __destruct()这样的功能了,对吧?与public function connect()之类的函数相同,仅剩下public function selectDb($database)但我不知道如何在不损坏与数据库的所有连接的情况下正确执行此操作。因为在我的其余代码中(这里没有提到),我可以通过以下代码轻松选择数据库:$this->db->selectDb("people");但是使用预处理语句我不知道这是否可以轻松实现。我希望你的一些建议可以帮助我和其他用户更好地理解这个新代码。您可能拥有的代码中的其他部分在此PDO Tutorial for MySQL Developers中列出。谢谢。

2 个答案:

答案 0 :(得分:5)

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

让我们回顾一下我们丢失的代码:

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

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

    PDO也提供了现成的构造函数,因此不需要加倍。

  • connect - 不再需要连接功能。这是通过实例化PDO来完成的。您可以查找异常,PHP手册有一个示例on it's constructor page

  • 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

答案 1 :(得分: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()访问数据。