织梦是怎么连接数据库的,函数Open($pconnect=FALSE)

admin2019-12-231033

相关函数:

函数名:Open($pconnect=FALSE)

参数:$Pconnect持久连接

功能:连接数据库,选择数据库,设置编码

所在文件:dedesql.class.php

源代码:

function Open($pconnect=FALSE)
    {
        global $dsql;
        //连接数据库
        if($dsql && !$dsql->isClose && $dsql->isInit)
        {
            $this->linkID = $dsql->linkID;
        }
        else
        {
            $i = 0;
            
            while (!$this->linkID)
            {
                if ($i > 100) break;
                
                if(!$pconnect)
                {
                    $this->linkID  = @mysql_connect($this->dbHost,$this->dbUser,$this->dbPwd);
                }
                else
                {
                    $this->linkID = @mysql_pconnect($this->dbHost,$this->dbUser,$this->dbPwd);
                }
                $i++;
            }
            
            //复制一个对象副本
            CopySQLPoint($this);
        }
        
        //处理错误,成功连接则选择数据库
        if(!$this->linkID)
        {
            $this->DisplayError("DedeCms错误警告:<font color='red'>连接数据库失败,可能数据库密码不对或数据库服务器出错!</font>");
            exit();
        }
    $this->isInit = TRUE;
        @mysql_select_db($this->dbName);
        $mysqlver = explode('.',$this->GetVersion());
        $mysqlver = $mysqlver[0].'.'.$mysqlver[1];
        
        if($mysqlver>4.0)
        {
            @mysql_query("SET NAMES '".$GLOBALS['cfg_db_language']."', character_set_client=binary, sql_mode='', interactive_timeout=3600 ;", $this->linkID);
        }

        return TRUE;
    }

无论是织梦系统还是其它系统,要连接数据库,首先需要知道主机,数据库名,数据库密码至少这三项,才能连接数据库,所以,织梦这个连接数据库函数在分析时,不能单独只看上面的代码,还要研究一下织梦初始化数据库信息相关函数,故在研究这个函数前,我们看看织梦数据库信息的配置。

在实例化Dedesql这个类的时候,构造函数,已经初始化了$this->isClose = FALSE,当调用对象$dsql里面的某个方法时(例如调用$dsql->Excute('me'),启动方法init()后,执行这个方法里面的代码,代码如下:

        $this->linkID = 0;
        $this->dbHost   =  $GLOBALS['cfg_dbhost'];
        $this->dbUser   =  $GLOBALS['cfg_dbuser'];
        $this->dbPwd    =  $GLOBALS['cfg_dbpwd'];
        $this->dbName   =  $GLOBALS['cfg_dbname'];
        $this->dbPrefix =  $GLOBALS['cfg_dbprefix'];

这样我们就得到了数据库的相关配置资料了,接下来程序就执行连接数据库函数open()(此时正确的应当叫方法),我们跟着程序来分析。

该函数代码:

        if($dsql && !$dsql->isClose && $dsql->isInit)
        {
            $this->linkID = $dsql->linkID;
        }

判断当对象存在并且没有关闭连接并且已经初始化连接到了数据库,也就是说已经连接到了数据库并且没有关闭连接,若这三个条件同时成立,则把这个$dsql->linkID的值赋给$this->linkID,这个$dsql->linkID表示的是打开MySQL 服务器的连接,也就是

mysql_connect($this->dbHost,$this->dbUser,$this->dbPwd)

判断当对象存在并且没有关闭连接并且已经初始化连接到了数据库,也就是说已经连接到了数据库并且没有关闭连接,若这三个条件同时成立,则把这个$dsql->linkID的值赋给$this->linkID,这个$ds它的返回值的数据类型是资源型。这个要知道要不很难理解为什么在init()后,把$this->linkID设置为0,因为此时,只是初始化配置信息并没有连接到mysql服务器肯定设置为0了,当执行到后面的open()后$this->isInit = TRUE。

所以,这个条件的前半部分就是判断,是不是连接上了数据库,如何判断?就是通过$this->isInit是否等于True,因为,刚开始$this->isInit = False,只有连接了数据库这个才变成True,此时,当然,我们就得获得连接标识$dsql->linkID,而不用再去连接数据库了。

还有$dsql->isClose刚开始时,这个值为false,只有当关闭了连接后,这个值才为True,这个在大约165行,所以,这个条件也不能漏掉。

若这个条件中任何一个不成立,就要重新去连接数据库也就是else后面的代码。

从这个while可以判断,这个最大的数据库服务器连接数是不超过100个,而且织梦把持久连接也考虑来了,不亏为官方,就是考虑周全,其实,一般的我们不需要这个持久连接,只需要一个普通连接就可以了。mysql_close()无法关闭持久连接mysql_pconnect(),也正是由于这个原因,所以,叫持久连接。以前听老师讲的时候,不建议使用持久连接,这样浪费资源。

复制一个对象副本:CopySQLPoint($this),这个函数比较简单,它的底层代码是把对象放到超全局数组$GLOBAL里面,即$GLOBALS['dsql'] = $ndsql,相当于我们在电脑上面修改文件时,为了防止出错,先把文件备份一下,万一出错,可以用备分的文件恢复一下,这里这个函数也有这个意思。

处理错误:从某种程序上来说,上面的所有代码的执行都是为了获得$this->linkID,因为,数据库连接这才是最重要的,所以,处理错误就不用多解释,调用一个数据库错误处理函数DisplayError()处理。

接下来初始化标识设置为true    $this->isInit = TRUE

到此,数据库已经连接好了,连接好了后,就要选择数据库了。

选择数据库:@mysql_select_db($this->dbName),这个织梦没有封装,也没有什么好封装的。

设置字符编码:mysql_query(),只不过织梦在这里对mysql服务器作了一个版本的判断,若版本大于4的就设置编码。

到此,织梦数据库连接函数结束。接下来应当是设置sql语句了,然后,遍历结果集,打开到浏览器。

从上面的分析,我们可以知道,实际上织梦的这个open()函数,功能如下:

1. 连接数据库mysql服务器

2.选择数据库

3.设置编码

这不就是我们教程“操作数据库mysql具体流程”教程里面讲的前三步吗?是的,织梦连接数据库就做了这三步。接下来的增,删、改、查就通过某些具体的函数例如Excute()来执行了。


网友评论