织梦系统增、删、改、查数据库操作五大函数对比分析

admin2019-12-25993

在织梦数据库类里面操作数据库的函数主要有五个分别是:

1.ExecuteNoneQuery():执行一个不返回结果的SQL语句,如update,delete,insert等

2.ExecuteNoneQuery2():执行一个返回影响记录条数的SQL语句,如update,delete,insert等

3.Execute():执行一个带返回结果的SQL语句,如SELECT,SHOW等

4.GetOne():执行一个SQL语句,返回前一条记录或仅返回一条记录

5.ExecuteSafeQuery():执行一个不与任何表名有关的SQL语句,Create等

我们知道在实例化数据库类,调用这些函数时,会连接数据库服务器、选择数据库、设置编码,接下来就是这五个函数要做的,他们要做的就是执行sql命令,然后,把结果打印到浏览器。

由于这五个函数有相同点,所以,放在一起对比分析,这样理解起来方便,而且,还可知道它们之间的区别与联系。

这五个函数的共同点:

1.大部分相同的代码是。

 global $dsql;
        if(!$dsql->isInit)
        {
            $this->Init($this->pconnect);
        }
        if($dsql->isClose)
        {
            $this->Open(FALSE);
            $dsql->isClose = FALSE;
        }

        if(!empty($sql))
        {
            $this->SetQuery($sql);
        }
        if(is_array($this->parameters))
        {
            foreach($this->parameters as $key=>$value)
            {
                $this->queryString = str_replace("@".$key,"'$value'",$this->queryString);
            }
        }
       
        if($this->safeCheck) CheckSql($this->queryString;

    $t1 = ExecTime();
        mysql_query($this->queryString,$this->linkID);
        
        //查询性能测试
        if($this->recordLog) {
    $queryTime = ExecTime() - $t1;
            $this->RecordLog($queryTime);
        }

也就是这部分代码,它们几个函数几乎一样,但也有细微的差别,有的函数会比这些代码少,有的则比这些公共部分多一点,我们先把这段分析一下再来看看在这段代码里面,这几个函数的异同点。

前三个if条件判断分别是:判断是不是已经初始化,若没有则初始化;判断是不是关闭了到mysql数据库服务器的连接,若关了,再连接数据库服务器;判断sql语句是否为空,若不空,则把sql语句里面的#@符号替换掉我们安装时配置的数据库表前缀。

第四个if条件判断$this->parameters是不是数组,这个其实织梦已经注销了,所以这一个条件判断在这里已经作废不用了。只是织梦官方没有把这一行代码删除旧罢了。

第五个if条件判断:SQL语句安全检查CheckSql($this->queryString),检查我们的sql语句是不是有注入危险,一个正常的sql语句必须有这个安全检查,这个检查sql语句的函数比较复杂,我们只需要知道是用来安全检测即可。

ExecTime():执行时间,这个用来测试执行代码所用时间,也就是测试我们写的代码性能,做同一件事,如果用的时间越长则性能越低,反之,则越高。这个函数在/inlude/debu.helper.php文件里面有定义。

sql语句查询:mysql_query($this->queryString,$this->linkID)这是我们熟悉的了也是这些函数里面的核心内容。一般我们看到的数据库类直接用这一行代码就查询sql而没有通过上面的几步又测试性能,又检查数据库是不是连接好了等,只需要这一行代码,但不管写的如何复杂或写的如何简单,但是,最终都是执行这一行代码,这也是这几个函数里面的核心代码。

查询性能测试:这个不用多说如果是一个完美的系统应当有这个测试,但是,如果我们一般的数据库类还真没有这个功能。

以上代码基本上这五个函数都包括,现在我们对这几个函数进行分析,找到异同点。

1、ExecuteNoneQuery($sql=''):return $rs

这个函数是执行不带返回结果的sql语句,但是,它返回的是一个资源而不是一个结果。

2.ExecuteNoneQuery2($sql=''):return mysql_affected_rows($this->linkID),

它返回的是影响记录的条数,举例子说明,例如我们查询数据库表里面的7条数据,那么,这个函数返回值就是7,若,向数据库表插入7条数据,则这个函数返回的也是7,它影响了几条就返回几条,这里说的影响,并不是说我们插入了7天,就影响到了数据库表里面的其它数据而返回其它数据个数。无论插入还是查询等,并不影响其它数据,要说影响也是影响表,这一点要注意。

3. Execute($id="me", $sql=''):

执行一个带返回结果的SQL语句,这里的结果有可能是一个结果标识符也就是结果集,例如ELECT,SHOW,DESCRIBE 或 EXPLAIN 等,但除了这几个sql语句外,其它sql语句将返回的是bool值,这一点要注意,不要一用到mysql_query()就认为返回的是一个结果集,还要看里面的sql语句。

还要注意的是在这个函数里面并没有return之类的返回语句,但是,例如当我们执行这个函数时,确实返回了一个结果集或bool值,这是为什么?因为里面有这一行代码:

$this->result[$id] = mysql_query($this->queryString,$this->linkID)

也就是这个函数所在的类里面定义了一个全局变量$result,并把

mysql_query($this->queryString,$this->linkID)赋给了数组$this->result['me'],

注意这个数组是:

array(1) { ["me"]=> resource(28) of type (mysql result) }

看似这个函数并没有返回任何东西,也确实如此,但是,这个函数把mysql_query()到的结果放在了$this->result[$id],这一放就大不相同了,如果没有放在这里面,那么,这个函数什么也做不了,正是放在这个数组里面,所以,后面我们用到的遍历这个资源时,就用到了$this->result[$id],这一点我们可以查看

GetArray($id="me",$acctype=MYSQL_ASSOC),GetObject($id="me")

等函数,它都是以$this->result['me']作为参数进行查询记录的。

从以前分析我们可以看出这个函数Execute($id="me", $sql='')必须与GetArray($id="me",$acctype=MYSQL_ASSOC),GetObject($id="me")等参数带有$id值的函数结果使用,否则,调用不出内容来。

例子:调用数据库表里面7条数据

代码如下:

<?php
require_once("./include/common.inc.php");
$sql="select * from dede_archives limit 0,7";
$dsql->Execute('me',$sql);
while($row=$dsql->GetArray('me')){

    echo $row['title'];
    echo "<br />";
}
?>

显示结果如下图所示。
image.png

假设我们不使用织梦给我们定义的GetArray($id="me",$acctype=MYSQL_ASSOC),GetObject($id="me")这样的函数,而是使用mysql_fecth_row($res)等这样的函数,如果再使用上面的代码就不行了。这时候我们就要对这个函数进行改进,既然要使用mysql_fecth_row($res)就需要,执行$dsql->Execute('me',$sql)后返回一个资源。所以,我们在$dsql->Execute('me',$sql)函数里面添加return $this->result[$id]即可。

然后调用代码如下:

<?php

$res=$dsql->Execute('me',$sql);

while($row=mysql_fetch_array($res)){

    echo $row['title'];
    echo "<br />";
}

?>

同样可以实现调用7条数据。

4.GetOne($sql='',$acctype=MYSQL_ASSOC):

这个函数与其它函数最大不同是通过limit限制显示1条记录,即if(!preg_match("/LIMIT/i",$sql)) $this->SetQuery(preg_replace("/[,;]$/i", '', trim($sql))." LIMIT 0,1;")这行代码,这行代码的作用是若sql语句没有limit限制条件则在sql语句里面加上这行语句。

还有在这个函数里面,调用了上面的Excute('me',$sql)函数,并把调用出来的一条结果存放在$arr并return回来。

5.ExecuteSafeQuery($sql,$id="me"):

执行一个不与任何表名有关的SQL语句,Create等,这个函数与上面的代码有很大不同,连参考位置都不一样,这个函数与Excute()函数一样,也是把mysql_query()的结果保存到 $this->result[$id]里面。

现在我对这五个函数作了对比分析,相信看后应该明白了,调用方式更是简单,但是,大家发现没有除了Excute()函数名比较简明外,其它都比较长,织梦也想到了,所以,把这么长的函数又给我们封装好了。以后,我们可以使用这些简洁的名称就可以。

 1.Execute($id="me", $sql='')的简写:query($id="me", $sql=''),GetFetchRow($id='me')

    function Query($id="me",$sql='')
    {
        $this->Execute($id,$sql);
    }

    function GetFetchRow($id='me')
    {
        return @mysql_fetch_row($this->result[$id]);
    }

  2.ExecuteNoneQuery($sql)的简写:ExecNoneQuery($sql='')

    function ExecNoneQuery($sql='')
    {
        return $this->ExecuteNoneQuery($sql);
    }
        
  3.ExecuteNoneQuery2($sql)的简写:GetAffectedRows()
    function GetAffectedRows()
    {
        return mysql_affected_rows($this->linkID);
    }


网友评论