【问题标题】:How does PHP know what the last database connection is when mysql_select_db() or mysql_query() is used without the optional database parameter?当 mysql_select_db() 或 mysql_query() 在没有可选数据库参数的情况下使用时,PHP 如何知道最后一个数据库连接是什么?
【发布时间】:2010-03-29 19:21:24
【问题描述】:

考虑以下代码:

<?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())

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

【问题讨论】:

    标签: php


    【解决方案1】:

    我想最后打开的连接的链接保存在内存中的某处,以使事情变得更容易(因为我们通常只使用一个连接)


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

    • 名为 mysql_connect 的用户空间函数似乎对应于名为 php_mysql_do_connect 的 C 级函数(第 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.cext/mysql/php_mysql_structs.h

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

    【讨论】:

    • 不客气 :-) ;;如果有这样的疑问,PHP 的一大优点是它是开源的 ;-)
    【解决方案2】:

    希望这门课能帮到你,我已经写好了……对不起,需要测试

    class connectionManager(){
    
    protected $array = array(
    "connection1" => "host3-username-password-database1" , 
    "connection2" => "host2-username-password-database2" , 
    "connection3" => "host1-username-password-database3" , 
    )
    protected $history = array();
    public function __construct($connectionID = connection1){
     $this->savelastConnecton($connectionID);
         /*do you magic here to change the string above to desired format 
             sorry but i gatta go 
            btw i liked your question 
         */
          mysql_connect($host , $username , $password);
          mysql_select_db($database);
         return true ;
    }
    publich function getLastConnection( ){
        return end($this->history[$lastnumber]) ; 
    }
    private function saveLastConnection($connectionID){}
       $this->history[] = $connectionID ; 
        return true ;    
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-13
      • 2018-11-06
      • 2012-07-11
      • 2014-12-31
      • 2019-02-19
      • 2013-03-12
      • 1970-01-01
      相关资源
      最近更新 更多