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

Bya*_*gan 16 php mysql database deprecated

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

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

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

$db = new dbConn('127.0.0.1', 'root', 'pass', 'people', 'animals');
Run Code Online (Sandbox Code Playgroud)

这应该是这样的:

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

对?但是当我需要选择数据库以后我应该没有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); 
    }
  }  
}
Run Code Online (Sandbox Code Playgroud)

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

hak*_*kre 5

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

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

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

     mysql:host=127.0.0.1;dbname=people;charset=UTF-8
    
    Run Code Online (Sandbox Code Playgroud)

    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');
Run Code Online (Sandbox Code Playgroud)

如果你现在想,如果我想自己拥有数据库类呢?那么你可以做到这一点,因为你可以从PDO扩展(是的,这是有效的!):

class DB extends PDO
{
   ... my super-new-shiny-code
}
Run Code Online (Sandbox Code Playgroud)

为什么你可能想这样做?不知道,但也许它对你的代码更流畅.如果你正在寻找一个更好的代码示例,我有一个带有超链接的PHP/MySQL表.