织梦dedecms系统调用跨站跨数据库数据显示
调用方法
本标签的调用格式为:
{dede:sql sql="一条完整的SQL语句" appname="数据库配置参数"}
您的底层模板
{/dede:sql}
稍微有点细心的朋友可能就已经发现了,其实只是在SQL标签中多了一个appname参数,它的意思实际上指的就是您跨数据库调用的连接配置信息;
参数讲解
这个跨数据库调用的连接配置信息是如何配置的呢?请大家打开/include/taglib/sql.lib.php,找到大约65行开始的如下代码:
<?php
if(!defined('DEDEINC'))
{
exit("Request Error!");
}
/**
* SQL标签
*
* @version $Id: sql.lib.php 2 10:00 2010-11-11 tianya $
* @package DedeCMS.Taglib
* @copyright Copyright (c) 2007 - 2010, DesDev, Inc.
* @license http://help.dedecms.com/usersguide/license.html
* @link http://www.dedecms.com
*/
/*>>dede>>
<name>SQL标签</name>
<type>全局标记</type>
<for>V55,V56,V57</for>
<description>用于获取MySQL数据库内容的标签</description>
<demo>
{dede:sql sql='' db='default'}
[field:title/]
{/dede}
</demo>
<attributes>
<iterm>sql:需要查询的sql语句</iterm>
<iterm>appname: 默认为default,即当前dedecms的数据库,如果需要自定义,可以在data/tag/sql.inc.php中扩展,具体扩展方法查看配置文件头部说明</iterm>
</attributes>
>>dede>>*/
function lib_sql(&$ctag,&$refObj)
{
global $dsql,$sqlCt,$cfg_soft_lang;
$attlist="sql|appname";
FillAttsDefault($ctag->CAttribute->Items,$attlist);
extract($ctag->CAttribute->Items, EXTR_SKIP);
//传递环境参数
preg_match_all("/~([A-Za-z0-9]+)~/s", $sql, $conditions);
$appname = empty($appname)? 'default' : $appname;
if(is_array($conditions))
{
foreach ($conditions[1] as $key => $value)
{
if(isset($refObj->Fields[$value]))
{
$sql = str_replace($conditions[0][$key], "'".addslashes($refObj->Fields[$value])."'", $sql);
}
}
}
$revalue = '';
$Innertext = trim($ctag->GetInnerText());
if($sql=='' || $Innertext=='') return '';
if(empty($sqlCt)) $sqlCt = 0;
$ctp = new DedeTagParse();
$ctp->SetNameSpace('field','[',']');
$ctp->LoadSource($Innertext);
$thisrs = 'sq'.$sqlCt;
$GLOBALS['autoindex'] = 0;
// 引入配置文件
if ($appname != 'default')
{
require_once(DEDEDATA.'/tag/sql.inc.php');
global $sqltag;
$config = $sqltag[$appname];
if (!isset($config['dbname'])) return '';
// 链接数据库
$linkid = @mysql_connect($config['dbhost'], $config['dbuser'], $config['dbpwd']);
if(!$linkid) return '';
@mysql_select_db($config['dbname']);
$mysqlver = explode('.',$dsql->GetVersion());
$mysqlver = $mysqlver[0].'.'.$mysqlver[1];
// 设定数据库编码及长连接
if($mysqlver > 4.0)
{
@mysql_query("SET NAMES '".$config['dblanguage']."', character_set_client=binary, sql_mode='', interactive_timeout=3600 ;", $linkid);
}
$prefix="#@__";
$sql = str_replace($prefix, $config['dbprefix'], $sql);
// 校验SQL字符串并获取数组返回
$sql = CheckSql($sql);
$rs = @mysql_query($sql, $linkid);
while($row = mysql_fetch_array($rs,MYSQL_ASSOC))
{
$sqlCt++;
$GLOBALS['autoindex']++;
// 根据程序判断编码类型,并进行转码,这里主要就是gbk和utf-8
if (substr($cfg_soft_lang, 0, 2) != substr($config['dblanguage'], 0, 2))
{
$row = AutoCharset($row, $config['dblanguage'], $cfg_soft_lang);
}
foreach($ctp->CTags as $tagid=>$ctag)
{
if($ctag->GetName()=='array')
{
$ctp->Assign($tagid, $row);
}
else
{
if( !empty($row[$ctag->GetName()]))
{
$ctp->Assign($tagid, $row[$ctag->GetName()]);
} else {
$ctp->Assign($tagid, "");
}
}
}
$revalue .= $ctp->GetResult();
}
@mysql_free_result($rs);
} else {
$dsql->Execute($thisrs, $sql);
while($row = $dsql->GetArray($thisrs))
{
$sqlCt++;
$GLOBALS['autoindex']++;
foreach($ctp->CTags as $tagid=>$ctag)
{
if($ctag->GetName()=='array')
{
$ctp->Assign($tagid,$row);
}
else
{
if( !empty($row[$ctag->GetName()]))
{
$ctp->Assign($tagid,$row[$ctag->GetName()]);
} else {
$ctp->Assign($tagid,"");
}
}
}
$revalue .= $ctp->GetResult();
}
}
return $revalue;
}
上面这段代码的意思就是如果您的SQL标签的appname参数不等于default,那么就加载 DEDEDATA.'/tag/sql.inc.php' 这个配置文件,寻找相关的配置。
而DEDEDATA 是织梦系统的全局常量,代表程序的 /data 文件夹。
我们可以打开这个文件看一下,您应该能看到如下代码:
<?php global $sqltag; // phpwind8数据库连接配置 // ------------------------------------------------------------------------ $sqltag['phpwind8']['dbhost'] = 'localhost'; $sqltag['phpwind8']['dbname'] = 'phpwind8'; $sqltag['phpwind8']['dbuser'] = 'root'; $sqltag['phpwind8']['dbpwd'] = '123456'; $sqltag['phpwind8']['dbprefix'] = 'pw_'; $sqltag['phpwind8']['dblanguage'] = 'gbk'; // phpb2b数据库连接配置 // ------------------------------------------------------------------------ $sqltag['phpb2b']['dbhost'] = 'localhost'; $sqltag['phpb2b']['dbname'] = 'phpb2b'; $sqltag['phpb2b']['dbuser'] = 'root'; $sqltag['phpb2b']['dbpwd'] = '123456'; $sqltag['phpb2b']['dbprefix'] = 'pb_'; $sqltag['phpb2b']['dblanguage'] = 'utf8'; ?>
其中phpwind8 和 phpb2b 就是跨服务器的配置信息了,您只需要将这里面的连接更改为您自己的即可。甚至还可以进行自定义,比如我们在末尾可以加上如下代码:
// discuz数据库连接配置 // ------------------------------------------------------------------------ $sqltag['discuz']['dbhost'] = 'localhost';//数据库服务器地址 $sqltag['discuz']['dbname'] = 'discuz';//数据库名称 $sqltag['discuz']['dbuser'] = 'xuewl_com';//数据库登录用户名 $sqltag['discuz']['dbpwd'] = 'xuewl_com';//数据库登录密码 $sqltag['discuz']['dbprefix'] = 'pre_';//数据库默认表前缀,用于#@__标识 $sqltag['discuz']['dblanguage'] = 'utf8';//数据库的编码
保存好文件以后关闭即可。
在前台我们就可以通过如下具体代码调用了:
{dede:sql sql="select * from #@__common_member WHERE uid > 1 ORDER BY credits DESC LIMIT 0,8" appname="discuz"}
用户名:[field:username/]
{/dede:sql}
THE END







