如何使用不推荐的mysql_*函数成功重写旧的mysql php代码?

如何使用不推荐的mysql_*函数成功重写旧的mysql php代码?,php,mysql,database,deprecated,Php,Mysql,Database,Deprecated,我仍然主要从我买的书中学习,但今天我知道我的书很旧了,尽管我今年买的是关于PHP编程的书。现在我知道PHP中的mysql_*命令已经被弃用,应该用更安全、更稳定的预处理语句和PDO来代替。所以我决定根据它重写我所有的网站,也许我需要你们的一些建议,如何正确地完成它,以及你们所有更有经验的人的建议:) 因此,我将在这里开始我的重写,其中只有主要部分(连接到db并选择db)(其余部分我可以用google和manuals自己完成)。我会在这里写下我的旧剧本,问你我是否做得对,没有遗漏任何东西,我希望这

我仍然主要从我买的书中学习,但今天我知道我的书很旧了,尽管我今年买的是关于PHP编程的书。现在我知道PHP中的mysql_*命令已经被弃用,应该用更安全、更稳定的预处理语句和PDO来代替。所以我决定根据它重写我所有的网站,也许我需要你们的一些建议,如何正确地完成它,以及你们所有更有经验的人的建议:)

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

因此,在配置中,我有如下内容:

$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');
应该是这样的:

$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\uuu construct
public function\uu destruct()
这样的函数应该不再需要了,对吧?类似于
public function connect()
的函数也是如此,所以只剩下
public function selectDb($database)
了,但我不知道如何在不破坏与数据库的所有连接的情况下正确执行此操作。因为在我剩下的代码中(这里没有提到),我可以通过以下代码轻松地选择数据库:
$this->db->selectDb(“人”)但对于准备好的语句,我不知道这是否可以用简单的方法实现。我希望您的一些建议能帮助我和其他用户更好地理解这段新代码。您可能拥有的代码中的其他部分将在本文中介绍。谢谢。

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

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

或者更好(更干净)的方法可能是

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


如果您将类中的数据库标记为活动数据库,则可以使用
$db\u people->query()
$db\u animals->query()

访问数据实际上,一个简单、甜蜜且简短的提示:是的,不再需要了

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

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

    PDO还提供了现成的构造函数供使用,因此不需要使用双构造函数

  • 连接
    -也不再需要连接功能。这是通过已经实例化PDO来完成的。您可以查找异常,PHP手册中有一个例子

  • selectDb
    -这个复杂的功能也不再需要了。哇,由于PDO连接字符串,我们可以删除的第三个函数。用更少的角色获得更多的力量。干杯

  • \u析构函数
    -析构函数。公平地说:MySQL也不需要这个。然而,有了PDO,我们可以免费获得它,而不用编写一行代码

看起来不错!通过删除过时的代码,您成功地从那个晦涩难懂的数据库类迁移到了PDO!祝贺你:

$db = new PDO('mysql:host=127.0.0.1;dbname=people;charset=UTF-8', 'root', 'pass');
如果您现在想一想,如果我想自己拥有数据库类呢?您可以这样做,因为您可以从PDO进行扩展(是的,这很有效!):


你为什么要这么做?不知道,但也许你的代码更流畅。如果您正在寻找更好的代码示例,我有一个。

Woah!Super duper特别推荐您大胆地将自己从疲惫的旧
mysql.*
恐龙中升级!不,那只是无效的PHP代码。但也许你想描述一下你想做什么,我可以给你一个或另一个提示。出于安全原因,我有时会更改传入数据库,因此此代码应该检查连接是否有效,如果为false,则返回消息:),或者这一切真的是PDO代码本身的作用吗?我建议你只使用例外。如果没有正确配置,您将获得异常。然后你就把它修好了。无需实际添加代码,它是通过异常在PDO中内置的。啊,好的,我认为这是必要的,但好的,谢谢你的帮助:)不,不需要。代码越简单越好。如果你“需要”什么,你会很早知道的。很抱歉用
extends
示例来激怒您,这更多是出于完整性的原因,以防您会说:但是我的类名为
DB
,而不是
PDO
或类似的东西
$db = new PDO('mysql:host=127.0.0.1;dbname=people;charset=UTF-8', 'root', 'pass');
class DB extends PDO
{
   ... my super-new-shiny-code
}