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

我仍然大部分都是从我购买的书籍中学习,但是今天我发现我的书虽然今年在PHP上编程,但是我买了它。 现在我知道PHP中的mysql_ *命令已被废弃,应该用更安全,更稳定的准备语句和PDOreplace。 所以我把自己重写所有我的networking据此,也许我会需要从你的一些build议如何做到这一点,并从你的工作更有经验的家伙:)

所以我会开始我的重写只有主要部分(连接到DB和select数据库)在这里(其余我可以做我自己的谷歌和手册)。 我会在这里写下我的旧脚本,问你是否正在做一切正确的事,而不是错过任何东西,我希望这可能是一些很好的手动/其他人的答案。 所以让我们开始。

所以在configuration我有这样的事情:

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

对? 但是当我需要select数据库后,我应该没有dbname=people; ? 但以后如何select数据库?

这是我唯一的脚本来重写这是大多数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 __constructpublic function __destruct()这样的public function __construct ,对吧? 与public function connect()一样,只剩下public function selectDb($database)但我不知道如何正确地做到这一点,而不会损坏与数据库的所有连接。 因为在我的代码的其余部分(这里没有提到),我可以很容易地通过这段代码select数据库: $this->db->selectDb("people"); 但有了准备的陈述,我不知道这是否甚至可能以简单的方式。 我希望你的一些build议能帮助我和其他用户更好地理解这个新代码。 其他代码中的部分可能已经在这个针对MySQL开发人员的PDO教程中出现了 。 谢谢。

其实,简单,甜美,简短:是的,没有必要了。

让我们回顾一下代码,不是我们失去了一些东西:

  • __construct – 构造函数只包含所有的configuration。 PDO有一个更容易的概念在这里,一个连接string包含最多的信息:

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

    另外PDO提供了使用现成的构造函数,所以双重没有必要。

  • connect – 连接function不再是必要的。 这是通过实例化PDO来完成的。 您可以查找exception,PHP手册在其构造器页面上有一个示例。

  • selectDb – 这个复杂的函数不再需要。 哇,因为PDO连接string,我们可以放弃第三个函数。 很less有字符的权力。 干杯!

  • __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 } 

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

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

 $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()来访问数据。