- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
背景
我有一个项目已经开发了好几年了。很多代码已经过时,并且使用旧的编程风格。现在我改变了数据库结构。我把一些表移到了一个新的数据库中,这个数据库仍然在同一台服务器上。
在没有给定数据库资源的情况下,还有很多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请求。有时只有一个数据库资源。
$db1
请求之前或每个
$db1
请求之后执行。这对我来说是个大麻烦。
$db2
在php 7中被弃用和删除,但我仍然不能替换这些函数。也不能简单地在
mysql
之前创建
$db2
。这两个数据库连接都是在不同的代码点上创建的,或者是在相互独立的ajax请求中并行创建的。根本不可能保证创作的顺序。此外,我需要一些来自
$db1
的数据来使用
$db1
。
$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(...);
...
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/
这个问题在这里已经有了答案: “return” and “try-catch-finally” block evaluation in scala (2 个回答) 7年前关闭。 为什么method1返
我有一个动态列表,需要选择最后一项之前的项目。 drag your favorites here var lastLiId = $(".album
我想为每个线程执行特定操作,因此,我认为tearDown Thread Group 不起作用。 是否有任何替代方法可以仅在线程的最后一次迭代时运行“仅一次 Controller ”? 谢谢。 最佳答案
在我的书中它使用了这样的东西: for($ARGV[0]) { Expression && do { print "..."; last; }; ... } for 循环不完整吗?另外,do 的意义何
我想为每个线程执行特定操作,因此,我认为tearDown Thread Group 不起作用。 是否有任何替代方法可以仅在线程的最后一次迭代时运行“仅一次 Controller ”? 谢谢。 最佳答案
有没有可能 finally 不会被调用但应用程序仍在运行? 我在那里释放信号量 finally { _semParallelUpdates.Re
我收藏了 对齐的元素,以便它们形成两列。使用 nth-last-child 的组合和 nth-child(even) - 或任何其他选择器 - 是否可以将样式应用于以下两者之一:a)最后两个(假设
我正在阅读 Jon Skeet 的 C# in Depth . 在第 156 页,他有一个示例, list 5.13“使用多个委托(delegate)捕获多个变量实例化”。 List list = n
我在 AM4:AM1000 范围内有一个数据列表(从上到下有间隙),它总是被添加到其中,我想在其中查找和总结最后 4 个结果。但我只想找到与单独列相对应的结果,范围 AL4:AL1000 等于单元格
我最近编写了一个运行良好的 PowerShell 脚本 - 然而,我现在想升级该脚本并添加一些错误检查/处理 - 但我似乎被第一个障碍难住了。为什么下面的代码不起作用? try { Remove-
这个问题在这里已经有了答案: Why does "a == x or y or z" always evaluate to True? How can I compare "a" to all of
使用 Django 中这样的模型,如何检索 30 天的条目并计算当天添加的条目数。 class Entry(models.Model): ... entered = models.Da
我有以下代码。 public static void main(String[] args) { // TODO Auto-generated method stub
这个问题在这里已经有了答案: Why does "a == x or y or z" always evaluate to True? How can I compare "a" to all of
这个问题已经有答案了: Multiple returns: Which one sets the final return value? (7 个回答) 已关闭 8 年前。 我正在经历几个在工作面试中
$ cat n2.txt apn,date 3704-156,11/04/2019 3704-156,11/22/2019 5515-004,10/23/2019 3732-231,10/07/201
我可以在 C/C++ 中设置/禁用普通数组最后几个元素的读(或写)访问权限吗?由于我无法使用其他进程的内存,我怀疑这是可能的,但如何实现呢?我用谷歌搜索但找不到。 如果可以,怎样做? 因为我想尝试这样
我想使用在这里找到的虚拟键盘组件 http://www.codeproject.com/KB/miscctrl/touchscreenkeyboard.aspx就像 Windows 中的屏幕键盘 (O
我正在运行一个 while 循环来获取每个对话的最新消息,但是我收到了错误 [18-Feb-2012 21:14:59] PHP Warning: mysql_fetch_array(): supp
这个问题在这里已经有了答案: How to get the last day of the month? (44 个答案) 关闭 8 年前。 这是我在这里的第一篇文章,所以如果我做错了请告诉我...
我是一名优秀的程序员,十分优秀!