php - PHP MYSQL覆盖最后一个连接链接

标签 php mysql database

背景
我有一个项目已经开发了好几年了。很多代码已经过时,并且使用旧的编程风格。现在我改变了数据库结构。我把一些表移到了一个新的数据库中,这个数据库仍然在同一台服务器上。
在没有给定数据库资源的情况下,还有很多mysql_*函数(未设置$link)。在一些重要的情况下,我已经将数据库访问替换为一种新的编程风格,但是由于大量的代码,我不能简单地替换所有mysql_*函数。
问题
问题是,没有给定资源的所有mysql_*函数都将连接到上次打开的数据库。在我的例子中,最后打开的数据库是错误的数据库。我想更改这个“默认”连接。
一些更好理解的代码

// old database, new connection is forced
$db1 = mysql_connect($hostname, $username, $password, true); 
// new database, new connection is forced
$db2 = mysql_connect($hostname, $username, $password, true); 

mysql_select_db($dbn1, $db1);
mysql_select_db($dbn2, $db2);

两个数据库连接具有相同的$hostname、相同的$username和相同的$password。它们只在数据库中不同($dbn1$dbn2)。
mysql_query("SELECT DATABASE();", $db1); // $dbn1
mysql_query("SELECT DATABASE();", $db2); // $dbn2
mysql_query("SELECT DATABASE();"); // $dbn2 <- this should be changed

数据库(没有给定的资源)现在将拥有最后一个连接,即$db2。但为了向后兼容,我希望它是$db1
已经尝试过的解决方案
更改数据库
现在我只想改变数据库。
mysql_select_db($dbn1, $db1);

mysql_query("SELECT DATABASE();", $db1); // $dbn1
mysql_query("SELECT DATABASE();", $db2); // $dbn2
mysql_query("SELECT DATABASE();"); // $dbn2 <- still the same

选择具有给定资源的数据库最后一个连接(显然)不会更改。这意味着对于带有省略的$link参数的函数调用,数据库仍然是错误的。
更改数据库(不带$link参数)
mysql_select_db($dbn1); // no $link parameter

mysql_query("SELECT DATABASE();", $db1); // $dbn1
mysql_query("SELECT DATABASE();", $db2); // $dbn1 <- now this is wrong
mysql_query("SELECT DATABASE();"); // $dbn1

在没有$link参数的情况下更改数据库$db2会更改数据库。即使他们被迫使用一个新的资源对象。(资源对象不同,我选中了它们。)再次连接$db2到数据库$dbn2将再次更改最后一个连接(最后一个查询)。
因此,更改数据库不会更改$link资源,这是有意义的。因此,php内部存储的$link变量对于$link函数是错误的。
重新打开连接
$db1 = mysql_connect($hostname, $username, $password); 
mysql_select_db($dbn1, $db1);

mysql_query("SELECT DATABASE();", $db1); // $dbn1
mysql_query("SELECT DATABASE();", $db2); // $dbn1 <- now this is wrong again
mysql_query("SELECT DATABASE();"); // $dbn1

我试图创建一个新的连接,而不强制创建一个新的mysql_*。这样,最后创建的连接就是我想要的连接。但现在$link是错误的。这也有意义,因为$db2$db1位于同一服务器上。打开一个具有相同数据的新连接,而不强制使用新连接,当然会覆盖这两个数据(我没有检查这个)。
超级丑陋和混乱的解决方案
我想出的唯一解决方案是为$db2重新创建连接,然后再次为$db2重新创建连接。所以我一次又一次地创建数据库连接。代码(总结和简化,当然这不在一个文件中。而且我不能简单地删除第一行!)看起来像这样:
// the $db1 and $db2 are created elsewhere so they will always exist
$db1 = mysql_connect($hostname, $username, $password, true); 
$db2 = mysql_connect($hostname, $username, $password, true); 

mysql_select_db($dbn1, $db1);
mysql_select_db($dbn2, $db2);

// in the actual database files before accessing the database
$db2 = mysql_connect($hostname, $username, $password); 
mysql_select_db($dbn2, $db2);

$db1 = mysql_connect($hostname, $username, $password, true); 
mysql_select_db($dbn1, $db1);

但在我看来,这看起来超级丑陋和多余。问题是数据库对象$db1$db1也经常用于异步ajax请求。有时只有一个数据库资源。
此外,上述代码的最后4行必须在每个$db1请求之前或每个$db1请求之后执行。这对我来说是个大麻烦。
所以我总的问题是:有人知道我该如何解决这个问题吗?
注意:替换所有功能不是一个选项。另外,我知道$db2在php 7中被弃用和删除,但我仍然不能替换这些函数。也不能简单地在mysql之前创建$db2。这两个数据库连接都是在不同的代码点上创建的,或者是在相互独立的ajax请求中并行创建的。根本不可能保证创作的顺序。此外,我需要一些来自$db1的数据来使用$db1
编辑
此外,上述代码的最后4行必须在每个$db2请求之前或每个$db1请求之后执行。
为了澄清这一点:在代码中还有一个$db2类。数据库1和连接Database有一个对象$database,数据库2和连接$db1有一个对象$new_database
起初只有一个数据库连接。这就是以前的程序员简单地编写这样的东西的原因:
$sql = "SELECT * FROM `example_table` WHERE id = 100;";
$result = mysql_query($query);
$result = mysql_fetch_assoc($result);

然后调查$db2类。现在编写的代码如下:
$database->setQuery("SELECT * FROM `example_table` WHERE id = 100;");
$result = $database->getAssocResult();

现在我们介绍了另一个数据库。现在也有
$new_database->setQuery(...);
...

所有这些变体在代码中都是并行的。在10000个不同的文件中有大量的行。数据库2始终且仅与Database类和Database对象一起使用。引用这一行,我讨论修改$new_database类。
class Database{
    protected function query(){
        // handle the actual query stuff

        global $db1, $dbn1, $dbn2;
        if($this->database_name == $dbn2){
            $this->link = mysql_connect($this->hostname, $this->username, $this->password); 
            mysql_select_db($dbn2, $this->link);

            $db1 = mysql_connect($this->hostname, $this->username, $this->password, true); 
            mysql_select_db($dbn1, $db1);
        }

        return $result;
    }
}

这样,到Database的数据库连接将始终重置为旧数据库。现在可以使用$db1函数。但正如我所说,这个解决方案很难看。

最佳答案

使用mysqli而不是mysql它将工作…

关于php - PHP MYSQL覆盖最后一个连接链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52775138/

相关文章:

mysql - 字段大小会影响查询时间吗?

mysql - 插入带有自动增量列的 MySQL 表

php - 将 CSS 规则减少到最小公分母

mysql - 使用 MySQL 在 Slick 3 中做主/从的最佳方法

php - 在OpenCart中,如何获取当前产品的id、名称和图片?

MySQL Join AND EXISTS 组合

MySQL 将 UTF-8 更改为 ASCII-8BIT

database - Oracle - "record"常量

php - 使用PHP脚本将上传的图像转换为PNG

php - 显示 php 中内容的前两个段落