Typecho在PHP7以上版本中出现Database Server Error错误的解决办法

Typecho程序,之前安装的时候是PHP5.X版本,切换PHP7.X以上版本的时候,页面出现 "Database Server Error" 的错误问题。
目前发现这个问题,就搜索了一下,确有解决办法。

config.inc.php可以看到问题了。直接在config.inc.php文件中找到:

$db = new Typecho_Db('Mysql', 'typecho_');

修改成:

$db = new Typecho_Db('Pdo_Mysql', 'typecho_');

替换后,刷新前台、后台均正常使用。

企业网站联系方式页调用百度地图API,支持位置偏移

在做企业站的时候,经常需要百度地图API显示公司位置信息,百度地图生成器本身提供这个服务。但显示不够理想,网络搜索本文章介绍网页百度地图API,支持位置偏移,主要包括网页百度地图API,支持位置偏移使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。需加载 jQuery

<style type="text/css">
#allmap {width:100%; height:100%; border:#ccc solid 1px; box-sizing:border-box; position:relative; z-index:1;}
.mapbox {width:100%; height:420px; margin-top:15px; position:relative;}
.mapbox.on {height:100%; margin-top:0; position:fixed; top:0; left:0; z-index:1000;}
.mapbox .zw {width:100%; height:100%; position:absolute; top:0; left:0; z-index:2; display:none;}
.anchorBL, .BMap_cpyCtrl {display:none;}
.BMap_pop {transform:translateY(-15px);}
.mapbigest {width:26px; height:26px; position:absolute; top:10px; right:10px; z-index:10; cursor:pointer; background-size:100% 100%; background-repeat:no-repeat; background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAMAAABHPGVmAAAAhFBMVEUAAABJSUlKSkpJSUlBQUFDQ0NJSUlJSUlLS0tJSUlFRUVJSUlKSkpKSkpJSUlJSUlJSUlJSUlHR0dISEhJSUlKSkpJSUlLS0tKSkpJSUlJSUlISEhJSUlKSkpISEhJSUlJSUlISEhERERJSUlISEhJSUlJSUlISEhJSUlJSUlHR0dKSkrAS+lAAAAAK3RSTlMAwIBjCAT77BHMDfLjxT3n1qVLNL+0RSIc+GZR9LpYit13F5JuXjAnrpwrMVj51gAAAsxJREFUaN7t2tuSojAQgOEeTARFwRMIKiDo6Dj9/u+3U+xGxA7ZkFC7N/yXXvCVZVGSbgA+3dPiQ1LmMOhRFfko7VQCTLCzGdc32Bk7K+CE3R30kSN2lwIqKvSRAypSIht95NsQSQvoUamHhIXz2sGDXm1L57VHKkVw5cFg3XwkyNDK1keCUMXeoIg/qBKIyy1aSLkQSjWAIW7w2bWFTPZCOVfDGfNJG4FGSSyN9GnAOwKJUBZWSvxiUASS8wBKPG0MGQLVSij7IQw5Ap6tsmkZFKGKvUGRthIaKMc3gyJCmQnlbmws56BGYC4Ut6eSPw0GCsRKyZEaFGmUpVC+bQw1Aqy/8tkyCBJKHhnYTig3KwM29YchXOqLeSBXfC3l0GHA3MWfLsCiHyOAt1gmlG0PY8fIX2SIGDEASG4cSFxfuVKjid8S6I5HRNH+HvrxL3Hve6BonxLDSDmCotzMaJS1xiNx0BiG1Uo4B0W8vnMzBuY5iO4WlHlrHy8cbPK2HMbGxsbGxsbGxsbG/l9864FV+cpfe6AsdhEdG8NpdjXqM+Pa3CiwLtA4YK8tDczVKw0r5YK/m+5B0T0VCrcw8KA5sPtSKPKxBzyIYaTcgwSgHuAstiYGHaJGRJlM6wHORXpUXxPDSEnqH+zyZ6gWmxhNcaNIto+uGA/Kjc/ea4CMg3oGSQ2DpUnGdBBOjH7Kjv0d4V/E0FR8ohCEGLnxSm7J1AiPiGGuUKRtTHMw6OYKZd6N8EwYRzDq21UuaYhhrcgRRgyD7o0iQ9iOGEZKKBSPIo2xAav2Qll57whbEsNYWTyVNnIlxiDKtYWchRHDACVCCVvIkIbY8DYBMQapOnchaWPYKys5Mn04r5UB9CoondcKlyDSHn2Mxz94zWeDpkihjxRKxMfurvrIFbsLIcfOXE8f8VzsLAAIzqfT7IMWlRX0qHKyD0mLkxvDLyOFWNKlbrTlAAAAAElFTkSuQmCC');}
@media (max-width: 640px) {
    .BMap_scaleCtrl {display:none;}
    .mapbox .zw {display:block;}
}
</style>

<script type="text/javascript" src="//api.map.baidu.com/api?v=2.0&ak=【你的密匙】"></script>

<div class="mapbox"><div class="mapbigest"></div><div class="zw"></div><div id="allmap"></div></div>
<script type="text/javascript">
//手机版点击才可拖动
$(document).on("click",".mapbox",function(){
    $(this).find(".zw").hide();
});

//地图最大化
$(document).on("click",".mapbigest",function(){
    $(this).parent(".mapbox").toggleClass("on");
    baidu_map();
});

//键盘Esc退出全屏
var isPiss = 0;
document.onkeydown = function(event) {
    var e = event || window.event || arguments.callee.caller.arguments[0];
    if(e.keyCode == 27){
        if($(".mapbox").hasClass("on")){
            $(".mapbox").removeClass("on");
            baidu_map();
        }
    }
};

function pix(p)
{
    p = p/100000;
    return p;
}

function poi_move(x,y,type)
{
    //x: +往右偏移 -往偏左移
    //y: +往上偏移 -往偏下移
    arr = type.split(",");
    xarr = xpoi = new Array();
    if(type){
        if(arr){
            for(i=0;i<arr.length;i++)
            {
                xarr.push(arr[i].split(":"));
            }
        }
        if(xarr){
            for(i=0;i<xarr.length;i++)
            {
                if(xarr[i][0]=="left"){
                    x = x+pix(xarr[i][1]);
                }else if(xarr[i][0]=="right"){
                    x = x-pix(xarr[i][1]);
                }else if(xarr[i][0]=="top"){
                    y = y-pix(xarr[i][1]);
                }else if(xarr[i][0]=="bottom"){
                    y = y+pix(xarr[i][1]);
                }
                console.log(xarr[i])
            }
        }
    }
    xpoi["x"] = x;
    xpoi["y"] = y;
    return xpoi;
}

function baidu_map()
{
    //公司名称
    var my_company = '天泽数字';
    //公司地址
    var my_address = '地址:泰州市海陵区凤凰东路58号';
    //坐标
    var my_poix = 119.929529;
    var my_poiy = 32.462353;
    //地图位置偏移
    var move_type = "left:15,top:15"; // 往左偏移15像素,往上偏移15像素
    
    poi_arr = poi_move(my_poix,my_poiy,move_type);
    my_poix_p = poi_arr["x"];
    my_poiy_p = poi_arr["y"];
    
    // 百度地图API功能
    var map = new BMap.Map("allmap");
    var point = new BMap.Point(my_poix,my_poiy)
    var point_p = new BMap.Point(my_poix_p,my_poiy_p);
    var myIcon = new BMap.Icon("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAhCAMAAAAMPGBYAAAA3lBMVEUAAAArAAMrAAM+fOBHh/AuacQvasUrAANGhu5JifNJifNHiPEtZ8E/feIwa8Y3dNNFhOs+fN9Bf+RKivQ0cM4pY7smX7Y9et04ddVCgecxbMksZr8mU58uacQ1ctAoYblKivRDgukoPHUybssqZL06dthKivQlXLE7edo7edpEmP42kfc/lvtJmv8wkPQqjPE8lPlBlvw5k/gtjvIki+5JkfggiO1Lmv9FjfQpfd4gg+VLl/1Dkvc8j/Q0jvI7iOsxhuk4hegugOE0f+A6fd8xeNckdNIobsolZr8gddO/82ARAAAAKnRSTlMAMigGgiwnGBT3w73+/f349vPp5d7d3NDAvr2wqKeBfnV0aVBEOBr0k5GheLO3AAAA90lEQVQoz13Q1XqDQBRF4Q0BgsTdPalBS2UGiXv6/i8UggSG/3J959xs+BYjtapU1dECkYygkKVlWUuiCBn4ZI1YRsAimuxfacSIEfVxKdhGki0AcumdVZIxtlPNHqO9SrVVGxX9m6VXkNfT8iibqWSW0VybrHUTb9sf1vYV89MH6zQHWnsm7VsApOImkTZFCZ7B8TN2HATz1XbPtKuFA07Pv5HzFKHO4Stw6CAiFsJWEPHUd/zk9BETc38POREJXcdLThdJsyul9DoDo+5Stw7W8EIvQ7CkG71JSGm4DbCyfO+/x2eRwHPc5GXCcTzTAjz765Xo9w5VVEDyLqlpqQAAAABJRU5ErkJggg==", new BMap.Size(19,33)); //自定义图标
    var marker = new BMap.Marker(point,{icon:myIcon});
    map.addOverlay(marker);                      // 将标注添加到地图中
    //marker.setAnimation(BMAP_ANIMATION_BOUNCE);  // 跳动的动画
    map.centerAndZoom(point_p, 15);
    var opts = {
      width : 300,     // 信息窗口宽度
      height: 150,     // 信息窗口高度
      //title : "" , // 信息窗口标题
      //enableMessage:true,//设置允许信息窗发送短息
      //message:""
    }
    var infoWindow = new BMap.InfoWindow('<strong style="color:#d55522;font-size:14px;padding-bottom:10px;">'+my_company+'</strong><p>'+my_address+'</p>', opts);  // 创建信息窗口对象 
    
    var top_left_control = new BMap.ScaleControl({anchor: BMAP_ANCHOR_TOP_LEFT});// 左上角,添加比例尺
    var top_left_navigation = new BMap.NavigationControl();  //左上角,添加默认缩放平移控件
    
    map.addControl(top_left_control);
    map.addControl(top_left_navigation);
    
    map.openInfoWindow(infoWindow,point); //开启信息窗口
    marker.addEventListener("click", function(){          
        map.openInfoWindow(infoWindow,point); //开启信息窗口
    });
}
baidu_map();
</script>

百度地图坐标拾取器:http://api.map.baidu.com/lbsapi/getpoint/index.html

帝国CMS把栏目下的文章转移到新栏目里,URL地址保持不变

有时候需要把一个栏目下的部分或全部文章,转移到别的栏目下。比如某个栏目现在要创建子栏目,创建子栏目之前,要先把它转换成非终极栏目,要转换成终极栏目,就必须把栏目下的文章转移了。

文章较多,且文章都被搜索引擎收录了,最好要保持URL地址不变,这样对SEO更友好。

如果是转移到新建栏目下,那很好办,可以保持URL地址不变。在新建栏目的“生成选项”里,找到“内容页存放目录”一项。
1、如果以前文章的URL结构是/AAA/BBB/文章id.html,选择“自定义”,输入AAA/BBB
2、下面的“内容页目录存放形式”,选择不设置目录

ECMS-SEO-CLASS

剩下就是更新系统各种缓存,更新信息页地址,然后重新生成新的栏目页及下面的文章页。如果没配置错的话,文章的URL是一点也不会改变的。

如果是转移到已存在的栏目下,怎么保持文章URL地址不变? 我之前实现过了几次,当时没有记录到博客里,现在倒搞忘记了。

文章转自:http://www.dongchuanmin.com/archives/652.html

帝国ECMS微信分享好友朋友圈带缩微图和简介的JSSDK分享接口

前提是必须有公众号,且公众号中需要填写你的域名为安全域名才能成功。以下分享接口已采用微信开发文档中最新的接口,2020年04月测试通过,可以正常使用。

第一步:部署jssdk.php到根目录

<?php
class JSSDK {
  private $appId;
  private $appSecret;

  public function __construct($appId, $appSecret) {
    $this->appId = $appId;
    $this->appSecret = $appSecret;
  }

  public function getSignPackage() {
    $jsapiTicket = $this->getJsApiTicket();

    // 注意 URL 一定要动态获取,不能 hardcode.
    $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
    $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

    $timestamp = time();
    $nonceStr = $this->createNonceStr();

    // 这里参数的顺序要按照 key 值 ASCII 码升序排序
    $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";

    $signature = sha1($string);

    $signPackage = array(
      "appId"     => $this->appId,
      "nonceStr"  => $nonceStr,
      "timestamp" => $timestamp,
      "url"       => $url,
      "signature" => $signature,
      "rawString" => $string
    );
    return $signPackage; 
  }

  private function createNonceStr($length = 16) {
    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    $str = "";
    for ($i = 0; $i < $length; $i++) {
      $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
    }
    return $str;
  }

  private function getJsApiTicket() {
    // jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例
    $data = json_decode($this->get_php_file("jsapi_ticket.php"));
    if ($data->expire_time < time()) {
      $accessToken = $this->getAccessToken();
      // 如果是企业号用以下 URL 获取 ticket
      // $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken";
      $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
      $res = json_decode($this->httpGet($url));
      $ticket = $res->ticket;
      if ($ticket) {
        $data->expire_time = time() + 7000;
        $data->jsapi_ticket = $ticket;
        $this->set_php_file("jsapi_ticket.php", json_encode($data));
      }
    } else {
      $ticket = $data->jsapi_ticket;
    }

    return $ticket;
  }

  private function getAccessToken() {
    // access_token 应该全局存储与更新,以下代码以写入到文件中做示例
    $data = json_decode($this->get_php_file("access_token.php"));
    if ($data->expire_time < time()) {
      // 如果是企业号用以下URL获取access_token
      // $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$this->appId&corpsecret=$this->appSecret";
      $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
      $res = json_decode($this->httpGet($url));
      $access_token = $res->access_token;
      if ($access_token) {
        $data->expire_time = time() + 7000;
        $data->access_token = $access_token;
        $this->set_php_file("access_token.php", json_encode($data));
      }
    } else {
      $access_token = $data->access_token;
    }
    return $access_token;
  }

  private function httpGet($url) {
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_TIMEOUT, 500);
    // 为保证第三方服务器与微信服务器之间数据传输的安全性,所有微信接口采用https方式调用,必须使用下面2行代码打开ssl安全校验。
    // 如果在部署过程中代码在此处验证失败,请到 http://curl.haxx.se/ca/cacert.pem 下载新的证书判别文件。
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
    curl_setopt($curl, CURLOPT_URL, $url);

    $res = curl_exec($curl);
    curl_close($curl);

    return $res;
  }

  private function get_php_file($filename) {
    return trim(substr(file_get_contents($filename), 15));
  }
  private function set_php_file($filename, $content) {
    $fp = fopen($filename, "w");
    fwrite($fp, "<?php exit();?>" . $content);
    fclose($fp);
  }
}

第二步:微信公众号中设置JS安全域名
登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。

第三步:增加模版变量,填入代码,appid和appsecret填入你的微信公众号相关的信息(模版变量紧挨着</body>,放在它前面):

<?
//开始微信分享代码
require '../../jssdk.php';
$appid = '******';
$appsecret = '******';
$jssdk = new JSSDK($appid,$appsecret);
$signPackage = $jssdk->GetSignPackage();
//结束微信分享代码
?>

<script src="http://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
<script>
  // 注意:所有的JS接口只能在公众号绑定的域名下调用,公众号开发者需要先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。
  // 如果发现在 Android 不能分享自定义内容,请到官网下载最新的包覆盖安装,Android 自定义分享接口需升级至 6.0.2.58 版本及以上。
  // 完整 JS-SDK 文档地址:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html
  wx.config({
    debug: !1,
    appId: '<?php echo $signPackage["appId"];?>',
    timestamp: <?php echo $signPackage["timestamp"];?>,
    nonceStr: '<?php echo $signPackage["nonceStr"];?>',
    signature: '<?php echo $signPackage["signature"];?>',
    jsApiList: [
        "updateAppMessageShareData",
        "updateTimelineShareData",
        "onMenuShareWeibo",
        "onMenuShareQZone"
    ]
  });
  wx.ready(function () {
    // 在这里调用 API
    wx.checkJsApi({
    jsApiList: ["updateAppMessageShareData",
        "updateTimelineShareData",
        "onMenuShareWeibo",
        "onMenuShareQZone"], // 需要检测的JS接口列表,所有JS接口列表见附录2,
        success: function(res) {
            //alert(JSON.stringify(res));
            if(res.errMsg !='checkJsApi:ok'){
                alert('请升级您的微信版本');
                return;
            }
        }
    });
  //分享Demo
//获取“分享给朋友”按钮点击状态及自定义分享内容接口
    wx.updateAppMessageShareData({
    title: '<?=$navinfor[title]?>', // 分享标题
    desc: '<?=$navinfor[smalltext]?>', // 分享描述
    link: 'http://www.xxx.com<?=$navinfor[titleurl]?>', // 分享链接
    imgUrl: '<?=$navinfor[titlepic]?>', // 分享图标
        success: function () {
          // 设置成功
        }
    });

//获取“分享到朋友圈”按钮点击状态及自定义分享内容接口
    wx.updateTimelineShareData({
    title: '<?=$navinfor[title]?>', // 分享标题
    link: 'http://www.xxx.com<?=$navinfor[titleurl]?>', // 分享链接
    imgUrl: '<?=$navinfor[titlepic]?>', // 分享图标
        success: function () {
          // 设置成功
        }
    });
  wx.onMenuShareWeibo({
    title: '<?=$navinfor[title]?>', // 分享标题
    desc: '<?=$navinfor[smalltext]?>', // 分享描述
    link: 'http://www.xxx.com<?=$navinfor[titleurl]?>', // 分享链接
    imgUrl: '<?=$navinfor[titlepic]?>', // 分享图标
    success: function () {
       // 用户确认分享后执行的回调函数
    },
    cancel: function () {
        // 用户取消分享后执行的回调函数
    }
  });

});
</script>

效果演示站点:https://www.tztjfc.com/

本文转自:https://xiaaijun.com/ecms_js_wechat.html