织梦设置SQL语句(替换sql前缀)函数SetQuery($sql)
函数名: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()替换掉#@就可以了。