1. discuz在一個空間建兩個網站共用同一個資料庫,使用兩個網站用戶同步,可以么
可以,你可以在一個主機上安裝多個discuz,2個網站資料庫可以公用一內個資料庫你要用資料庫表頭來區容分不同的系統,如果是vps或者是獨立伺服器可以在資料庫系統裡面建立多個資料庫,便於日後維護,把這些discuz當作應用添加到uc裡面就可以實現同步登錄同步用戶數據。
2. 讓Discuz3.2用戶數據同步第三方api介面怎麼做
第一步:在網站根文件夾建立「1.php」文件,寫入以下數據:
<?php
define('CHARSET', 'GBK'); //伺服器端數據編碼
require './source/class/class_xml.php'; //XML格式的文檔和array的相互轉換的類
error_reporting(7);
$charset = $_GET['charset'] ? $_GET['charset'] : $_POST['charset']; //客戶端數據編碼
//數據轉碼
if(strtoupper($charset) != CHARSET) {
foreach($POST as $key => $value) {
$POST[$key] = iconv($charset, CHARSET, $value);
}
foreach($GET as $key => $value) {
$GET[$key] = iconv($charset, CHARSET, $value);
}
}
$data = array('html'=>'', 'data'=>''); //初始化要返回數據
$sign = $_GET['sign'] ? $_GET['sign'] : $_POST['sign']; //獲取客戶端請求數據的簽名
$clientid = $_GET['clientid'] ? $_GET['clientid'] : $_POST['clientid']; //客戶端ID
$client = get_client_by_clientid($clientid); //得到客戶端的相關信息
if(empty($client)) { //客戶端不存在
exit('CLIENT_NOT_EXISTS'); //直接返回失敗
}
$datasign = ''; //數據簽名
if(!empty($_POST)) {
unset($_POST['sign']); //刪除簽名參數,此參數不參加簽名計算
$datasign = get_sign($_POST, $client['key']); //計算數據的簽名
} else {
unset($_GET['sign']); //刪除簽名參數,此參數不參加簽名計算
$datasign = get_sign($_GET, $client['key']); //計算數據的簽名
}
if($datasign != $sign) { //簽名不正確
exit('SIGN_ERROR'); //輸入簽名錯誤
}
if($_POST['op'] == 'getdata') { //判斷是否為請求數據列表
$datalist = $data = array();//數據列表
$wherearr = array(); //SQL 條件數組
//獲取客戶端POST參數
$start = intval($_POST['start']); //起始數據行數
$limit = intval($_POST['items']); //要顯示多少條數
$bannedids = addslashes($_POST['bannedids']); //客戶端屏蔽的IDS
$param1 = addslashes($_POST['param1']); //數據調用參數1,假設此值要求為string型
$param2 = intval($_POST['param2']); //數據調用參數2,假設此值要求為int型
//處理參數1
if(!empty($param1)){
$wherearr[] = "fieldsparam1='$param1'";
}
//處理參數2
if(!empty($param2)) {
$wherearr[] = "fieldsparam2='$param2'";
}
//處理客戶端屏蔽的IDS
if(!empty($bannedids)) {
$banids = explode(',', $bannedids);
$wherearr[] = "csid NOT IN (".implode("','", $banids)."')";
}
$where = !empty($wherearr) ? 'WHERE '.implode(' AND ', $wherearr) : ''; //構造條件
/*資料庫相關處理
$query = DB::query('SELECT * FROM '.DB::table('tablename')." $where LIMIT $start, $limit"); //SQL查詢
while($value = DB::fetch($query)) {
//此處為數據處理邏輯代碼
$data[] = $value;
}
*/
//以下為臨時測試數據,正式環境請根據自己的業務做相關調整
$url = 'http://www.xxx.com/';
$data = range($start, $start + $limit);//構造臨時的假數據
foreach($data as $value) {
//需要注意: 除 id, title, url, pic, picflag, summary 幾個欄位外,其它欄位需要放到 fields 數組里。
$datalist[] = array(
'id' => $value,
'title' => 'xml_block_title'.$value, //標題
'url' => $url.'xml_server.php?csid='.$value, //鏈接地址
'pic' => $url.'/data/attachment/photo.gif', //圖片地址
'picflag' => '0', //0為url 1為本地 2 為ftp遠程;如果圖片是DX系統中的圖片可以情況設置為1或2,其它情況為0
'summary' => '', //簡介
'fields' => array( //配置規范中fields中指定的欄位
'author' => 'xml_user'.$value,
'authorid' => $value,
'field1' => 'field1value'.$value,
'field2' => 'field2value'.$value
)
);
}
$data['data'] = $datalist;
//如果要返回HTML代碼,可直接使用以下代碼
//$data['html'] = 'HTML CODE';
$xml = array2xml($data); //轉換為XML文檔
} else if($_GET['op'] == 'getconfig') {
$xml = file_get_contents('block_xml_sample.xml');//block_xml_sample.xml文件中的內容為 配置規范XML文檔示例 的內容
} else {
$xml = 'NO_OPERATION';
}
ob_end_clean();
@header("Expires: -1");
@header("Cache-Control: no-store, private, post-check=0, pre-check=0, max-age=0", FALSE);
@header("Pragma: no-cache");
header("Content-type: text/xml");
echo $xml;
exit();
/**
* 獲得客戶端信息
* @param $clientid
* @return array 客戶端信息數組
*/
function get_client_by_clientid($clientid){
$client = array();
$clientid = intval($clientid);
if($clientid) {
/*資料庫相關處理
$client = DB::fetch_first('SELECT * FROM '.DB::table('clienttable')." clientid='$clientid'"); //SQL查詢
*/
//以下為臨時測試數據,正式環境請根據自己的業務做相關調整
//模擬資料庫
$CLIENTSDB = array(
'100000' => array(
'clientid' => '100000',
'key' => '*654%#(asd94',
),
'200000' => array(
'clientid' => '200000',
'key' => '1#9!(@@34#94',
),
'300000' => array(
'clientid' => '300000',
'key' => '7$@^8^$7as89',
),
'400000' => array(
'clientid' => '400000',
'key' => '23@#86^%4&32',
),
);
$client = isset($CLIENTSDB[$clientid]) ? $CLIENTSDB[$clientid] : array();
}
return $client;
}
/**
* 生成簽名
* @param array $para 參數數組
* @param string $key 加密密鑰
* @return string 簽名
*/
function get_sign($para, $key = ''){
ksort($para);
$signarr = array();
foreach($para as $k => $v) {
$signarr[] = $k.'='.$v;
}
$sign = implode('&', $signarr);
$sign = md5($sign.$key);
return $sign;
}
?>
注意:不是網站記錄的URL來調試的時候,會出現「Access Denied」,那是網站防止文件外部打開的標志,進入「./source/class/class_xml.php」暫時關閉開頭的二行:
if(!defined('IN_DISCUZ') || !defined('IN_ADMINCP')) {
exit('Access Denied');}
特別注意:99行時候的「$xml = file_get_contents('block_xml_sample.xml');//block_xml_sample.xml文件中的內容為 配置規范XML文檔示例 的內容」;就是這個文件造成很多人安裝第三方插件不成功的。這個文件改名稱的同時記得要修改1.php的99行;
特別注意文件block_xml_sample.xml中的「<item id="name"><![CDATA[C/S 數據類]]></item>」中間的「C/S 數據類」就是模塊名稱;有的時候如「<item id="version"><![CDATA[X1.5]]></item>」版本號不對也會報錯;修改為網站的版本即可。
第二步:建立「block_xml_sample.xml」文件,寫入如下數據:
<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
<item id="Title"><![CDATA[Discuz! Block]]></item>
<item id="Data">
<item id="version"><![CDATA[X1.5]]></item>
<item id="name"><![CDATA[C/S 數據類]]></item>
<item id="fields">
<item id="url">
<item id="name"><![CDATA[鏈接地址]]></item>
<item id="formtype"><![CDATA[text]]></item>
<item id="datatype"><![CDATA[string]]></item>
</item>
<item id="title">
<item id="name"><![CDATA[標題]]></item>
<item id="formtype"><![CDATA[title]]></item>
<item id="datatype"><![CDATA[title]]></item>
</item>
<item id="pic">
<item id="name"><![CDATA[圖片]]></item>
<item id="formtype"><![CDATA[pic]]></item>
<item id="datatype"><![CDATA[pic]]></item>
</item>
<item id="summary">
<item id="name"><![CDATA[簡介]]></item>
<item id="formtype"><![CDATA[summary]]></item>
<item id="datatype"><![CDATA[summary]]></item>
</item>
<item id="author">
<item id="name"><![CDATA[作者]]></item>
<item id="formtype"><![CDATA[text]]></item>
<item id="datatype"><![CDATA[text]]></item>
</item>
<item id="authorid">
<item id="name"><![CDATA[作者ID]]></item>
<item id="formtype"><![CDATA[text]]></item>
<item id="datatype"><![CDATA[int]]></item>
</item>
<item id="field1">
<item id="name"><![CDATA[欄位1]]></item>
<item id="formtype"><![CDATA[text]]></item>
<item id="datatype"><![CDATA[string]]></item>
</item>
<item id="field2">
<item id="name"><![CDATA[欄位2]]></item>
<item id="formtype"><![CDATA[text]]></item>
<item id="datatype"><![CDATA[string]]></item>
</item>
</item>
<item id="getsetting">
<item id="param1">
<item id="title"><![CDATA[數據調用參數1]]></item>
<item id="type"><![CDATA[text]]></item>
<item id="default"><![CDATA[]]></item>
</item>
<item id="param2">
<item id="title"><![CDATA[數據調用參數2]]></item>
<item id="type"><![CDATA[mcheckbox]]></item>
<item id="value">
<item id="0">
<item id="0"><![CDATA[1]]></item>
<item id="1"><![CDATA[選項1]]></item>
</item>
<item id="1">
<item id="0"><![CDATA[2]]></item>
<item id="1"><![CDATA[選項2]]></item>
</item>
</item>
<item id="default"><![CDATA[1]]></item>
</item>
<item id="titlelength">
<item id="title"><![CDATA[標題長度]]></item>
<item id="type"><![CDATA[text]]></item>
<item id="default"><![CDATA[40]]></item>
</item>
<item id="summarylength">
<item id="title"><![CDATA[簡介長度]]></item>
<item id="type"><![CDATA[text]]></item>
<item id="default"><![CDATA[80]]></item>
</item>
<item id="start">
<item id="title"><![CDATA[起始數據行數]]></item>
<item id="type"><![CDATA[text]]></item>
<item id="default"><![CDATA[0]]></item>
</item>
</item>
<item id="style">
<item id="0">
<item id="name"><![CDATA[模板名稱]]></item>
<item id="template"><![CDATA[<div class="mole cl xl xl1"><ul>[loop]<li><em><a href="home.php?uid={authorid}"><FONT COLOR="RED">{author}</FONT></a></em><a href="{url}">{title}</a></li>[/loop]</ul></div>]]></item>
</item>
<item id="1">
<item id="name"><![CDATA[模板名稱紅色]]></item>
<item id="template"><![CDATA[<div class="mole cl xl xl1"><ul>[loop]<li><em><font color="red"><a href="home.php?uid={authorid}">{author}</a></font></em><a href="{url}">{title}</a></li>[/loop]</ul></div>]]></item>
</item>
</item>
</item>
</root>
第三步:建立第三方模塊
管理平台 》 門戶 》 第三方模塊 》 添加:
第三方地址:url/1.php
客戶短ID:200000 見1.php的133行
簽名加密方式:MD5簽名
通信密匙:1#9!(@@34#94
點擊提交,完成模塊建立工作。
第四步:前台頁面調用:
DIY網頁 》 DIY 》 高級模式 》 模塊 》 第三方類
是不是看到剛剛建立的模塊了。
選擇調用即可。
第五步:擴展讀取任一(包括外部)網頁HTML代碼數據,新建一個網頁「ee.htm」,數據規范如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
<item id="html"><![CDATA[]]></item>
<item id="data">
<item id="0">
<item id="id"><![CDATA[14]]></item>
<item id="title"><![CDATA[xml_block_title14]]></item>
<item id="url"><![CDATA[xml_server.php]]></item>
<item id="pic"><![CDATA[nophoto.gif]]></item>
<item id="picflag"><![CDATA[1]]></item>
<item id="summary"><![CDATA[]]></item>
<item id="fields">
<item id="author"><![CDATA[xml_user14]]></item>
<item id="authorid"><![CDATA[14]]></item>
<item id="field1"><![CDATA[field1value14]]></item>
<item id="field2"><![CDATA[field2value14]]></item>
</item>
</item>
<item id="1">
<item id="id"><![CDATA[15]]></item>
<item id="title"><![CDATA[xml_block_title15]]></item>
<item id="url"><![CDATA[xml_server.php]]></item>
<item id="pic"><![CDATA[nophoto.gif]]></item>
<item id="picflag"><![CDATA[1]]></item>
<item id="summary"><![CDATA[]]></item>
<item id="fields">
<item id="author"><![CDATA[xml_user15]]></item>
<item id="authorid"><![CDATA[15]]></item>
<item id="field1"><![CDATA[field1value15]]></item>
<item id="field2"><![CDATA[field2value15]]></item>
</item>
</item>
</item>
</root>
第六步:讀取外部網頁(ee.htm)時1.PHP的代碼:
適合格式固化的網頁使用,安全則自己去加上。
<?php
define('CHARSET', 'GBK'); //伺服器端數據編碼
if($_POST['op'] == 'getdata') { //判斷是否為請求數據列表
$xml = file_get_contents('ee.htm');//讀取網頁數據 如下傳遞參數另..
} else if($_GET['op'] == 'getconfig') {
$xml = file_get_contents('block_xml_sample.xml'); //安裝時候需要調用的網頁;為配置規范XML文檔示例
} else {
$xml = 'NO_OPERATION';
}
ob_end_clean();
@header("Expires: -1");
@header("Cache-Control: no-store, private, post-check=0, pre-check=0, max-age=0", FALSE);
@header("Pragma: no-cache");
header("Content-type: text/xml");
echo $xml;
exit();
?>
以上的步驟就解決了DZ可以與任一網站數據共享的問題