gpt4 book ai didi

php - 在没有可选数据库参数的情况下使用 mysql_select_db() 或 mysql_query() 时,PHP 如何知道最后一个数据库连接是什么?

转载 作者:可可西里 更新时间:2023-11-01 12:50:20 27 4
gpt4 key购买 nike

考虑以下代码:

<?php

$conn = mysql_connect('localhost', 'username', 'password');
mysql_select_db('database', $conn);

?>

这按预期工作,但 PHP 如何知道在以下示例中调用 mysql_select_db() 时要使用哪个数据库连接?

<?php

mysql_connect('localhost', 'username', 'password');
mysql_select_db('database');

?>

PHP 文档指出“如果未指定链接标识符,则假定为 mysql_connect() 打开的最后一个链接。” ( PHP: mysql_select_db() )

从哪里存储或检索最后一个连接?

最佳答案

我想上次打开的连接的链接保存在内存中的某个地方,以简化操作(因为我们通常只使用一个连接)


快速浏览 ext/mysql 的源代码:
(所有行号都在 php_mysql.c 中——源版本是几周前 PHP 5.3.2-dev 的随机快照;因此,他们可能已经改变了一点)

  • 名为 mysql_connect 的用户空间函数似乎对应于名为 php_mysql_do_connect 的 C 级函数 < em>(第 922 行)
  • php_mysql_do_connect 函数调用 php_mysql_set_default_link (第 832 行)
    • 存储最后打开的连接
  • 还有一个名为 php_mysql_get_default_link 的函数 (第 908 行)
  • 当没有链接传递给它时,php_mysql_get_default_link 函数由 mysql_select_db 调用 (第 992 行)


php_mysql_set_default_link 调用它来存储 default_link :

MySG(default_link) = id; 

MySG 是一个宏,定义如下(在 php_mysql_structs.h 中):

#ifdef ZTS
# define MySG(v) TSRMG(mysql_globals_id, zend_mysql_globals *, v)
#else
# define MySG(v) (mysql_globals.v)
#endif

对我来说,它看起来像一个全局变量 ;-)


如果需要,您可以自己查看源代码: ext/mysql/php_mysql.c ext/mysql/php_mysql_structs.h .

正如我所说,自从我检查的版本以来,这可能已经做了一些修改——这意味着行号可能不完全匹配;但是函数名称很容易理解,因此您应该能够追踪到什么调用了什么以及在哪里:-)

关于php - 在没有可选数据库参数的情况下使用 mysql_select_db() 或 mysql_query() 时,PHP 如何知道最后一个数据库连接是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2540635/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com