背景
我有一个项目已经开发了好几年了。很多代码已经过时,并且使用旧的编程风格。现在我改变了数据库结构。我把一些表移到了一个新的数据库中,这个数据库仍然在同一台服务器上。
在没有给定数据库资源的情况下,还有很多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/