织梦设置SQL语句(替换sql前缀)函数SetQuery($sql)

admin2023-01-181174

函数名:SetQuery($sql)

功能:替换sql前缀

所在文件:dedesql.class.php

源代码:

    function SetQuery($sql)
    {
        $prefix="#@__";
        $sql = str_replace($prefix,$GLOBALS['cfg_dbprefix'],$sql);
        $this->queryString = $sql;
    }

为了更简便调用,织梦又把这个函数封装在敢setsql,函数代码如下所示。

    function SetSql($sql)
    {
        $this->SetQuery($sql);
    }

个人觉得这样更简单,使用起来方便,但是,为什么不把这个直接封装一个呢?

直接封成:

    function SetSql($sql)
    {
        $prefix="#@__";
        $sql = str_replace($prefix,$GLOBALS['cfg_dbprefix'],$sql);
        $this->queryString = $sql;
    }

当然,如果你要改成这样的话,也要对dedesql.class.php相关文件做相关的修改,否则会出错。

分析:

我们在写sql语句查询网站数据库时,数据库表前缀标准的写法是#@__表名,但是,我们在安装系统时,假设用的是dedebase_表名,但是我们查询时用的是#@__表名,为什么织程序就可以通过#@来辨别dedebase呢?感觉很神奇啊,用个符号就可以辨别出数据库表前缀,而且,无论你的数据库表前缀起什么名字,我们在增、删、改、查时都可以用#@来表示数据库表前缀,哪怕我们不知道我们的网站的数据库表前缀是什么,只要写上这个符号就织梦程序就可以识别出来,感觉很神奇的。

其实,这个功能的实现比较简单,是通过函数SetQuery($sql)来实现的。就是把#@替换成我们数据库表中的前缀就可以了。按照这个理解,难道程序要查询数据库,然后,替换?绝不可能,因为,现在就为了查询数据库而解决这个表前缀,如果能查询数据库就不用解决数据库表前缀了。

实际上,我们织梦系统里的数据库表是在我们安装时就已经定义好的,所以,只要把我们在安装时的前缀查询出来替换即可。

当我们安装织梦程序时,在data/common.inc.php里面就已经配置好的数据库信息,当然,包括表信息,只需要通过超全局变量$GLOBAL取出来就行了,即$GLOBAL['cfg_dbpreffix']。

然后,通过字符串替换函数str_replace()替换掉#@就可以了。


网友评论