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

2022-08-31 01:20:56

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

因此,我将在这里仅从主要部分(连接到db并选择DB)开始重写(其余的我可以用谷歌和手册自己完成)。我会在这里写下我的旧脚本,并问你是否做对了一切,没有遗漏任何东西,我希望这也可以成为其他人的一些好的手册/答案。让我们开始吧。

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

$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中了解到的情况 - 功能就像并且不应该再需要了,对吧?与SO这样的函数相同,只有剩下的是什么,但我不知道如何正确执行此操作,而不会阻止与数据库的所有连接。因为在我的代码的其余部分(这里没有提到),我可以通过以下代码轻松选择数据库:但是对于预准备语句,我不知道这是否以简单的方式实现。我希望您在这方面的一些建议能够帮助我和其他用户更好地理解这个新代码。您可能拥有的代码中的其他部分在此面向MySQL开发人员的PDO教程中进行了说明。谢谢。public function __constructpublic function __destruct()public function connect()public function selectDb($database)$this->db->selectDb("people");


答案 1

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

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

  • __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上有一个。


答案 2

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

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


推荐