安静
PHP技术博客

140115 wordpress 源生代码直接修改文章分类

张 清月阅读(541)

昨天论坛干货看了个关于单本小说论坛的事,本来这事知道很早,也能很好的Seo,做起来也很简单,没想到权重可以这么高,反正不废什么事,于是自己做了个,过程中遇到了 分类转换的问题,当然这里已经解决了,共享下:

<?php
// wordpress 目录新建个 reset_cat.php 复制代码 稍作修改即可
// wordpress 源生代码解决批量分类转换 目前用于 小说站的分类解决
// 有问题请联系 cfrs2005(Hostloc@cfrs2005)
// 博客:80aj.com
// 2014/01/15

include "wp-config.php";
error_reporting ( E_ALL );
global $wpdb;
//文章序列号 开始到结束 可自行修改代码
$begin_end_arr = array (
		'6' => array (
				1048,
				1400 
		) 
);
foreach ( $begin_end_arr as $key => $single_arr ) {
	$posts = $wpdb->get_results ( "SELECT id FROM $wpdb->posts where id >={$single_arr[0]} and id<={$single_arr[1]}" );
	foreach ( $posts as $post ) {
		wp_set_post_categories ( $post->id, array (
				$key 
		) );
	}
}


单站小说:

http://www.jueshitangmenquanben.com 绝世唐门全本 By the way: 出售小说站源码采集+自动更新 only for liunx demo: 采集开始 开始处理 总数据 7 条 http://www.xxxx.com/xxx113773.html 当前文章 第三佰四一章 龙皇、饕餮、本体(上) 已经插入过 标题无变更 http://www.xxx.com/xx115793.html 当前文章 第三百四拾一章 龙皇、饕餮、本体(中)下)14第三 已经插入过 标题无变更 http://www.xxx.com/xx119686.html 当前文章 第三百四一章节 龙皇、饕餮、本体(下)第三04 已经插入过 标题无变更 http://www.xxx.com/xx2164.html 当前文章 第三百四二章节 黄金蝶龙变(上)第三04中) 已经插入过 标题无变更 http://www.xxx.com/xx22169.html 当前文章 第三佰四二章 黄金蝶龙变(中) 已经插入过 标题无变更 http://www.xxx.com/xx28248.html 当前文章 第三百四拾二章 黄金蝶龙变(下)中)14第三 已经插入过 标题无变更 http://www.xxx.com/xx1309.html 当前文章 第三百四三章节 好多、好多啊!第三04 已经插入过 标题无变更 执行结束

140114 wordpress源生代码实现SEO

张 清月阅读(497)

很早之前看到macdang.com的时候,觉得这套模板很清新,比较适合coder做自己的技术博客,想把自己的博客模板也换成这个。可惜查看相关代码没有找到模板作者。昨天查看wopus的时候看到了这套模板: 原名为M2模板。作者通过最wordpress源生php代码实现了翻页,阅读计数等常见插件的功能,不过对于seo这一块并没有做,这里补充下实现wordpress 源生代码实现Seo .

以下代码替换模板代码 header.php中 ***部分:


<?php
if (is_home ()) {
	$keywords = "相关关键字描述";
	$description = "相关desc描述";
} elseif (is_single ()) {
	if ($post->post_excerpt) {
		$description = $post->post_excerpt;
	} else {
		$str = csubstr ( strip_tags ( $post->post_content ), 0, 220 );
		$str = trim ( $str );
		$str = strip_tags ( $str, "" );
		$str = ereg_replace ( "\t", "", $str );
		$str = ereg_replace ( "\r\n", "", $str );
		$str = ereg_replace ( "\r", "", $str );
		$str = ereg_replace ( "\n", "", $str );
		$str = ereg_replace ( " ", " ", $str );
		$description = trim ( $str );
	}
	$keywords = "";
	$tags = wp_get_post_tags ( $post->ID );
	foreach ( $tags as $tag ) {
		$keywords = $keywords . $tag->name . ", ";
	}
}
?>
<title><?php
global $page, $paged;
wp_title ( '|', true, 'right' );
bloginfo ( 'name' );
$site_description = get_bloginfo ( 'description', 'display' );
if ($site_description && (is_home () || is_front_page ()))
	echo " | $site_description";
if ($paged >= 2 || $page >= 2)
	echo ' | ' . sprintf ( __ ( 'Page %s' ), max ( $paged, $page ) );
?></title>
<meta name="keywords" content="<?=$keywords?>" />
<meta name="description" content="<?=$description?>" />


function csubstr($str, $start=0, $length, $charset="utf-8", $suffix=true){
        if(function_exists("mb_substr"))
                return mb_substr($str, $start, $length, $charset);
        $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
        $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
        $re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
        $re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
        preg_match_all($re[$charset], $str, $match);
        $slice = join("",array_slice($match[0], $start, $length));
        if($suffix) return $slice."¡­";
}

本文资料:

www.macdang.com mac党 主要是下载破解mac软件的,目前已经不怎么更新 www.mangguo.org m2 主题作者

131108 Discuz 主从配置原理

张 清月阅读(767)

之前有提到 discuz x3 开启 db主从后 报bug导致无法 正常使用 后来通过修改

// source/class/db/db_driver_mysql_slave.php 参数设置为1

解决 。

原帖:131101 discuz x3 主从数据库配置

本周深入了解了下 原来是因为 二次开发的时候 某些不是很规范的写法引起的:

db查询的时候没有使用 discuz 提供的 DB::table 导致。

修正完毕后 就可以正常使用了。
在这里转一篇关于 discuz 主从原理的文章

/source/class/class_core.php
当配置了从库信息时,直接连接从库
discuz_core::_init_db()

function _init_db() {
                $class = 'db_mysql';
                if(count(getglobal('config/db/slave'))) {
                        require_once libfile('class/mysql_slave');
                        $class = 'db_mysql_slave';
                }
                $this->db = & DB::object($class);
                $this->db->set_config($this->config['db']);
                $this->db->connect();
        }

db_mysql::table_name
table_name方法,每次将数据库连接curlink重置了主库连接。
其中$this->map为对数据库分库的配置,哪些表适用哪一个数据库,然后建立连接。

function table_name($tablename) {
                if(!empty($this->map) && !empty($this->map[$tablename])) {
                        $id = $this->map[$tablename];
                        if(!$this->link[$id]) {
                                $this->connect($id);
                        }
                        $this->curlink = $this->link[$id];
                } else {
                        $this->curlink = $this->link[1];
                }
                return $this->tablepre.$tablename;
        }

DB::table
此方法调用db_mysql::table_name方法

function table($table) {
                return DB::_execute('table_name', $table);
        }

/source/class/class_mysql_slave.php
db_mysql_slave::table_name
slave的table方法,判断表是否在“slave_except_table”中,slave_except_table为配置的不使用从库连接的数据表

function table_name($tablename) {
                if($this->slaveid && !$this->slaveexcept && $this->excepttables) {
                        if(in_array($tablename, $this->excepttables)) {
                                $this->slaveexcept = true;
                        }
                }

db_mysql_slave::query
slave的query方法,判段没有配置不使用从库的表,且sql语句为select时,才将curlink指向从库,否则curlink仍执行主库。

function query($sql, $type = '') {
                if($this->slaveid && !$this->slaveexcept && strtoupper(substr($sql, 0 , 6)) == 'SELECT') {
                        $this->slave_connect();
                }
                $this->slaveexcept = false;
                return parent::query($sql, $type);
        }

总结:

1. 在扩展或做插件,使用数据库操作时,使用“DB::table($tablename)”来获取表名拼接sql就能兼容Discuz!X的主从库配置
2. 若仅使用主库连接,系统不会使用到db_mysql_save的类
3. 每次页面请求,只有一个db对象。 使用connect和设置curlink来实现主从连接

转载自:
http://discuzx.sinaapp.com/thread-12-1-1.html

131104 discuz 会员头像展示 – jquery 代码

张 清月阅读(1039)

jquery的使用级别 我一直停留在简单应用,是非常大的弱项,很可悲。
特别是 div 层的图片滚动的计算 。 写这个只是为了赞美 某强大 的JS工程师 桃子 .

discuz会员头像展示主要功能:
将一组A标签 以6个为单位分割 并且组建新的div 进行互换展示 支持鼠标的停留

discuz会员头像展示效果图片:

jsxiaoguo

discuz会员头像展示代码:

lewaStar=function(){
		var targetArea=$("#fly_stars");
		alert(targetArea);
		var elems = $('.lewabbs-star'), parts = [],i=0;
		do{
			parts[i] = elems.splice(0,6);
			$('<div class="star-block"></div>').append(parts[i]).appendTo(targetArea);
			i++;
		}while(elems.length>0);
		var objs = $('.star-block');
		var t,	 time = 200, delay = 4000, curr = 0,call_x = function(){
			$(objs[curr]).fadeOut(time, call_y);
		}, call_y = function(){
			curr ++;
			if(curr >= objs.length) curr=0;
			$(objs[curr]).fadeIn();
			t = setTimeout(call_x, delay);
		};
		objs.mouseover(function(){
			if(t) clearTimeout(t);
		});
		objs.mouseout(function(){
			t = setTimeout(call_x, delay);
		});
		call_x();
	}

discuz会员头像展示主要过程:

1:timer 定时器的 触发轮换
2:鼠标的 onmouse 和mouseout 处理
3:jquery [object Object] 和 jquery [object HTMLDivElement] 的处理

附加一篇关于 jquery [object Object] 和 jquery [object HTMLDivElement] 的处理 的文章 :

来源:
http://www.cnblogs.com/daisuki/archive/2013/04/04/2999745.html

在使用jQuery时,发现有两种对象,一个是[object Object],另一个是就像[object HTMLDivElement]

前者是jQuery对象,通过jQuery的选择器$(‘selector’)获得;
后者是DOM元素,为 javascript中的getElementById, getElementsByTagName等方法的返回类型。

只有jQuery对象才能使用jQuery的一系列方法,DOM元素是不能用的。 其实,jQuery对象就类似一个数组,它包含了一个或多个与jQuery选择器匹配的DOM元素。

//一个js获取的标签为li的元素数组
var normalArray = document.getElementsByTagName('li');  

//相当于上面的,但是是一个jQuery对象
var jQueryArray = $('li');

//如果是由元素Id获得DOM元素的话,则jQuery对象就像一个长度为1的数组。
//比如,以下三个alert的结果是相同的
alert(document.getElementById('myID'));
alert($('#myID')[0]);
alert($('#myID').get(0));

//*** jQuery对象与DOM元素之间的转换 ***

//返回与 jQuery 选择器匹配的DOM元素的数量
jQueryArray.length;
jQueryArray.size();

//从jQuery对象获得普通的DOM集合,[<li id="foo">, <li id="bar">]
jQueryArray.get();
jQueryArray.toArray();

//根据index获取数组中的某个元素
jQueryArray.get(index);
jQueryArray[index];

//当index是-1时,由于负数index是从数组最后开始算,所以返回数组的最后一个元素
jQueryArray.get(-1);

//当从一个jQuery对象获得一个DOM元素后,把该元素再转变成一个jQuery对象,以便调用jQuery的方法
$(jQueryArray[0]);

131101 discuz x3 主从数据库配置

张 清月阅读(1356)

discuz x3 配置安装文件 官方描述因为是藏在安装包里的 并没有对外公布:

// ----------------------------  CONFIG DB  ----------------------------- //
// ----------------------------  数据库相关设置---------------------------- //
/**
* 数据库主服务器设置, 支持多组服务器设置, 当设置多组服务器时, 则会根据分布式策略使用某个服务器
* @example
* $_config['db']['1']['dbhost'] = 'localhost'; // 服务器地址
* $_config['db']['1']['dbuser'] = 'root'; // 用户
* $_config['db']['1']['dbpw'] = 'root';// 密码
* $_config['db']['1']['dbcharset'] = 'gbk';// 字符集
* $_config['db']['1']['pconnect'] = '0';// 是否持续连接
* $_config['db']['1']['dbname'] = 'x1';// 数据库
* $_config['db']['1']['tablepre'] = 'pre_';// 表名前缀
*
* $_config['db']['2']['dbhost'] = 'localhost';
* ...
*
*/
$_config['db'][1]['dbhost']             = 'localhost';
$_config['db'][1]['dbuser']             = 'root';
$_config['db'][1]['dbpw']               = 'root';
$_config['db'][1]['dbcharset']          = 'utf8';
$_config['db'][1]['pconnect']           = 0;
$_config['db'][1]['dbname']             = 'ultrax';
$_config['db'][1]['tablepre']           = 'pre_';
/**
* 数据库从服务器设置( slave, 只读 ), 支持多组服务器设置, 当设置多组服务器时, 系统根据每次随机使用
* @example
* $_config['db']['1']['slave']['1']['dbhost'] = 'localhost';
* $_config['db']['1']['slave']['1']['dbuser'] = 'root';
* $_config['db']['1']['slave']['1']['dbpw'] = 'root';
* $_config['db']['1']['slave']['1']['dbcharset'] = 'gbk';
* $_config['db']['1']['slave']['1']['pconnect'] = '0';
* $_config['db']['1']['slave']['1']['dbname'] = 'x1';
* $_config['db']['1']['slave']['1']['tablepre'] = 'pre_';
* $_config['db']['1']['slave']['1']['weight'] = '0'; //权重:数据越大权重越高
*
* $_config['db']['1']['slave']['2']['dbhost'] = 'localhost';
* ...
*
*/
$_config['db']['1']['slave'] = array();
//启用从服务器的开关
$_config['db']['slave'] = false;
/**
* 数据库 分布部署策略设置
*
* @example 将 common_member 部署到第二服务器, common_session 部署在第三服务器, 则设置为
* $_config['db']['map']['common_member'] = 2;
* $_config['db']['map']['common_session'] = 3;
*
* 对于没有明确声明服务器的表, 则一律默认部署在第一服务器上
*
*/
$_config['db']['map'] = array();
/**
* 数据库 公共设置, 此类设置通常对针对每个部署的服务器
*/
$_config['db']['common'] = array();
/**
*  禁用从数据库的数据表, 表名字之间使用逗号分割
*
* @example common_session, common_member 这两个表仅从主服务器读写, 不使用从服务器
* $_config['db']['common']['slave_except_table'] = 'common_session, common_member';
*
*/
$_config['db']['common']['slave_except_table'] = '';

 

 

实际demo:

$_config['db']['slave'] = true;
$_config['db']['1']['slave'] = array();
$_config['db']['1']['slave']['1']['dbhost'] = 'localhost';
$_config['db']['1']['slave']['1']['dbuser'] = 'slave';
$_config['db']['1']['slave']['1']['dbpw'] = 'slave';
$_config['db']['1']['slave']['1']['dbcharset'] = 'utf8';
$_config['db']['1']['slave']['1']['pconnect'] = '0';
$_config['db']['1']['slave']['1']['dbname'] = 'ultrax';
$_config['db']['1']['slave']['1']['tablepre'] = 'pre_';
$_config['db']['1']['slave']['1']['weight'] = '99';
//再使用过程中可能会有BUG 会在未来的时间里去更新 解决为什么会产生这个BUG 可能是不规范的 开发导致
//暂时性的BUG解决
// source/class/db/db_driver_mysql_slave.php 参数设置为1
public $serverid = 1;

130726 php 关于反射

张 清月阅读(20490)

自反馈 弱点 不知PHP 反射 应用,场景,随学习之。

1:关于学习后 对于 PHP 反射的理解:

PHP反射 即 根据反射函数 Reflection 可反馈 class ,function 的 情况 ,状态 ,属性,并且支持 实例化 并且调用 函数。

2:关于 学习过程代码:

Demo 1:

class ga{
public function gd(){
echo "en dashi nihao";
}
}
$class=new ReflectionClass('ga');    //建立 fuc这个类的反射类
echo $class; //输出这反射类!

Demo 2 :

//输出反射API的完整最新的导出结果
Reflection::export(new ReflectionExtension('reflection'));
//使用反射技术来创建所有内置类的导出结果
foreach(get_declared_classes() as $class)
{
Reflection::export(new ReflectionClass($class));
}
//获取用户声明类的导出结果
class userClass
{
public function userMethod($userPatameter = 'default')
{
}
}
foreach(get_declared_classes() as $class)
{
$reflectionClass = new ReflectionClass($class);
if($reflectionClass->isUserDefined())
{
Reflection::export($reflectionClass);
}
}

Demo 3 : PHP 反射 应用场景 插件实现

<?php
//定义插件的接口规则
interface IPlugin
{
public static function getName();
}
//使用反射查找所有的插件
function findPlugins()
{
$plugins = array();
// 获取所有当前 已经加载的class 
foreach(get_declared_classes() as $class)
{
// 实例化一个反射 class的对象
$reflectionClass = new ReflectionClass($class);
//检查是否继承 IPlugin 接口
if($reflectionClass->implementsInterface('Iplugin'))
{
$plugins[] = $reflectionClass;
}
}
return $plugins;
}
//确定用于菜单的类成员
function computeMenus()
{
$menu = array();
if($plugins = findPlugins())
{
//遍历 所有 实现  IPlugin 插件的 Class
foreach($plugins as $plugin)
{
//检查是否存在函数  getMenuItems
if($plugin->hasMethod('getMenuItems'))
{
//获取  getMenuItems 函数属性
$reflectionMethod = $plugin->getMethod('getMenuItems');
//如果该函数 的 标注为  static   则继续
if($reflectionMethod->isStatic())
{
//执行 Method
$item = $reflectionMethod->invoke(null);
}
else
{
//执行method    不过我这里没懂  为什么  $plugins 和 $plugin 都可以
$pluginInstance = $plugins->newInstance();
//调用 很 反射啊  
$item = $reflectionMethod->invoke($pluginInstance);
}
}
//Item必须返回的是数组
$menu = array_merge($menu, $item);
}
}
return $menu;
}
//确定用于侧边类和文章类的成员
function computeArticles()
{
$articles = array();
if($plugins = findPlugins())
{
foreach($plugins as $plugin)
{
if($plugin->hasMethod('getArticles'))
{
$reflectionMethod = $plugin->getMethod('getArticles');
if($reflectionMethod->isStatic())
{
$item = $reflectionMethod->invoke(null);
}
else
{
$pluginInstance = $plugins->newInstance();
$item = $reflectionMethod->invoke($pluginInstance);
}
}
//Item必须返回的是数组
$articles = array_merge($articles, $item);
}
}
return $articles;
}
function computeSideBars()
{
$sidebars = array();
if(!($plugins = findPlugins()))
{
foreach($plugins as $plugin)
{
if($plugin->hasMethod('getsidebars'))
{
$reflectionMethod = $plugin->getMethod('getsidebars');
if($reflectionMethod->isStatic())
{
$item = $reflectionMethod->invoke(null);
}
else
{
$pluginInstance = $plugins->newInstance();
$item = $reflectionMethod->invoke($pluginInstance);
}
}
//Item必须返回的是数组
$sidebars = array_merge($sidebars, $item);
}
}
return $sidebars;
}
//创建一个用于测试的插件
class MyBlogPlugin implements Iplugin
{
public static function getName()
{
return 'BlogName For Iphper';
}
public static function getMenuItems()
{
return array(array(
'brief'=>'My Iphper Blog',
'link'=>'http://www.iphper.com',
));
}
public static function getArticles()
{
return array(array(
'path'=>'http://www.iphper.com/archives/202.html',
'title'=>'This a Iphper Blog title',
'text'=>'This is a good Blog For studying PHP',
));
}
}
//以下的代码可以使更加复杂的代码
$menu = computeMenus();
print_r($menu);
$articles = computeArticles();
print_r($articles);
$sidebars = computeSideBars();
print_r($sidebars);

参考:
1:http://php.net/manual/zh/book.reflection.php PHP反射 手册
2:http://www.douban.com/note/217633029/ PHP反射初步学习
3: http://www.iphper.com/?p=202 php 反射进阶

130723 关于一些电影资源站的 采集 PHP代码

张 清月阅读(1387)

OSChina是个不错的社区,在这里你可以学习到很多东西,如果你想在进阶 或许这里是个不错的地方【初-》中】

看到一个关于正则的 问题 实际上就是想采集 这些资源的电影,页面上已经很明确的通过 html注释 来区分内容 ,但看着下面的回答 好像没有人清楚 好吧 简单写了个 因为 之前从没有注册过帐号 代码 不能贴上去 所以 贴这里了

具体问题帖:

http://www.oschina.net/question/614279_119348

<?php 
$data = file_get_contents('http://www.fensizy.com/details_zy.asp?name_id=15012');
$data = mb_convert_encoding($data, 'utf-8', 'gbk');
preg_match("/<!--播放列表开始代码-->(.*?)<!--播放列表结束代码-->/ms",$data,$arr);
preg_match_all("/<ul>(.*?)<\/ul>/ms",$arr[1],$list_arr);
$movie_list=array();
if(is_array($list_arr[1])){
foreach($list_arr[1] as $item){
preg_match_all("/<li><a.*?>(.*?)<\/a><\/li>/ms",$item,$list);
if(is_array($list[1])){
foreach($list[1] as $movie){
$str_pos=stripos($movie, "qvod");
if($str_pos>-1){
$movie_list['qvod'][]=$movie;
}else{
$movie_list['bdhd'][]=$movie;
}
}
}
}
}
var_dump($movie_list);
exit();

其实 我的 正则也好菜的 不知道什么时候才能进阶

130717 wordpress 主题恶意代码 __popular_posts 的清除

张 清月阅读(1353)

安装完主题以后 出现了 500错误,而又无从下手 或许本文可以帮助到你

主题使用久了 总没新鲜感,随上了点社区论坛之类的,找了几个主题下载。装了上去,之前也没什么反映,突然一下子就出现了500错误。

悲催的 nginx -error-log 和 apache-error-log 毫无反映。

尝试调整代码 error_reporting() 解决 发现也有太多 地方直接强制把注释改为了 0 伤感。

清理思路:

1:查看 当前使用的主题 路径
登陆mysql 查看 options 表中 的 template ,因为我一直也没有太关注 关于主题字段的名字,随便猜测了下 结果中了

SELECT * 
FROM wp_options
WHERE  `option_name` LIKE  '%temp%'
LIMIT 0 , 30

wordpress 中使用 wp-options 中 使用 字段名 为 template 的 来存储当前博客使用的 主题路径。

2: 将错误主题 替换为 之前试用过的 或者是正常的主题。
简单的mv mv 依然还是错误。。

3:无解的时候 看了下 为什么 各种日志为什么不打印 php错误日志。
php.ini 中

display_errors = off

被设置关闭了

4: 直接在 wordpress 的index.php中强制开启 disaply_errors

ini_set('display_errors', 'on');

5:看到了 万年前邪恶错误代码

Fatal error: Cannot redeclare __popular_posts() (3 posts)

这个自我复制 修改 themes 目录下所有 functions.php 代码 实在是太恶心了

6:确认目录下所有 主题都已经被感染,瞬间有种蛋疼到家的感觉
将所有 主题 移除。
留一份 当前使用的 清理掉 functions.php 中 对应的 自我复制代码。
到此结束,最后找了篇 关于 代码解释的 希望你喜欢。

呃 其实也没什么,只是感觉很悲催的样子,前段时间 还在某群里 咆哮 君,作为一个技术人员你都能QQ中毒不耻辱么 哎。

恶意病毒代码解读:
http://www.chukuangren.com/wordpress-zhongdu.html

恶意病毒代码完整版:
http://wpcme.com/pics/01204/wordpress-malicious-code.html

130607 discuz X2 过滤UBB,discuz自带幻灯片引用

张 清月阅读(1156)

ubb代码有的时候 dz 数据库直接存了 导致调用的时候看着挺恶心的 这里给个 过滤的 其实是discuz自带的不过被我稍微删了点东西。

discuzUbb代码过滤

function _ubb_fillter($string){
$string = preg_replace(
array('/&amp;(#\d{3,5};)/', "/\[hide=?\d*\](.*?)\[\/hide\]/is", "/\[\/?\w+=?.*?\]/"),
array('&\\1','<b>**** Hidden Message *****</b>',''),
$string);
return $string;
}

论坛改版 需要自己弄个 图片滚动 。jqeury 插件得不兼容一直都认为是 $的问题 这次又遇到了更诡异的事 好吧可能有冲突。
不管怎么样 discuz 自带的还是很简单的

discuz自带幻灯片代码:

<div class="slidebox">
<ul class="slideshow">
<!--{loop $bigpic $key $val}-->
<li style="width: 345px; height: 293px;">
<a href="{$val[weburl]}" target="_blank">
<img src="{$val['attachment']}" width="345px;" height="293px;" />
</a>
<span class="title">{$val[title]}</span>
</li>
<!--{/loop}-->
</ul>
</div>
<script lang="javascript">
runslideshow();
</script>

130524 discuz x2.0 关于 memcache得应用

张 清月阅读(1200)

让discuz支持多组memcache

discuz 是不支持多组memcache 共同使用 所以我们需要修改代码:

//修改公共配置文件  bbs/config/config_global.php
$_config['memory']['memcache']['server'] = 'true';
$_config['memory']['memcache']['host'][]='192.168.1.1';
$_config['memory']['memcache']['host'][]='192.168.1.2';
//$_config['memory']['memcache']['server'] = 'localhost';
//$_config['memory']['memcache']['port'] = 11211;
$_config['memory']['memcache']['pconnect'] = 1;
$_config['memory']['memcache']['timeout'] = 1;
//修改 discuz memcache class类  bbs/source/class/class_memcache.php 
function init($config) {
if (! empty ( $config ['server'] )) {
$this->obj = new Memcache ();
if ($config ['pconnect']) {
$i = 1;
foreach ( $config ['host'] as $one_host ) {
if ($i == 1) {
$connect = @$this->obj->pconnect ( $one_host, 11211 );
} else {
$connect = @$this->obj->addServer ( $one_host, 11211 );
}
$i ++;
}
// $connect = @$this->obj->pconnect($config['server'], $config['port']);
//因为使用长连接 短连接就不改了
} else {
$connect = @$this->obj->connect ( $config ['server'], $config ['port'] );
}
$this->enable = $connect ? true : false;
}
}

discuz memcache 使用

require_once libfile('class/memcache');
@include DISCUZ_ROOT.'./config/config_global.php';
//获取
$m = new discuz_memcache();
$m->init($_config['memory']['memcache']);
$mail="5991168@qc.com";
$userinfo=$m->get(md5($email));
//写入 
$md5_name=md5($email);
$m->set($md5_name,$userinfo,MEMCACHE_COMPRESSED,time()+43200);

discuz 存储session by memcache


//修改配置文件 php.ini
php_value[session.save_handler] = memcached
php_value[session.save_path] = 192.168.1.1:11211

130508 discuz pre_forum_modwork 用户管理记录对照

张 清月阅读(22959)

discuz 关于 统计管理员操作记录表 有哪些行为被记录 并且成为管理记录的

中英文对照

'EDT' => '编辑',
'DEL' => '删除',
'DLP' => '删除回复',
'DCM' => '删除点评',
'PRN' => '批量删帖',
'UDL' => '反删除',
'DIG' => '加入精华',
'UDG' => '解除精华',
'EDI' => '限时精华',
'UED' => '解除限时精华',
'CLS' => '关闭',
'OPN' => '打开',
'ECL' => '限时关闭',
'UEC' => '解除限时关闭',
'EOP' => '限时打开',
'UEO' => '解除限时打开',
'STK' => '置顶',
'UST' => '解除置顶',
'EST' => '限时置顶',
'UES' => '解除限时置顶',
'SPL' => '分割',
'MRG' => '合并',
'HLT' => '设置高亮',
'UHL' => '解除高亮',
'EHL' => '限时高亮',
'UEH' => '解除限时高亮',
'BMP' => '提升',
'DWN' => '下沉',
'MOV' => '移动',
'CPY' => '复制',
'TYP' => '分类',
'RFD' => '强制退款',
'MOD' => '审核通过',
'ABL' => '加入文集',
'RBL' => '移除文集',
'PTS' => '推送主题',
'RFS' => '解除推送',
'RMR' => '取消悬赏',
'BNP' => '屏蔽帖子',
'UBN' => '解除屏蔽',
'REC' => '推荐',
'URE' => '解除推荐',
'WRN' => '警告',
'UWN' => '解除警告',
'SPA' => '鉴定为',
'SPD' => '撤销鉴定',
'REG' => '群组推荐',

查询单个用户的管理记录

select uid, SUM(count) from pre_forum_modwork  where uid =1 and dateline > '2013-04-30' ;

130506 Discuz X2.5 PHP 登陆发布模块

张 清月阅读(35806)

Class 类 class_dz.php

/*
* @author 80aj
* @email a@80aj.com
* @descripton: 原作者:大水车,实现discuz2.5登陆发帖
* @filename class_dz.php
*/
class discuz_post {
const LOGIN_PROGRAM = 'member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes';
const POST_PROGRAM = 'forum.php?mod=post&action=newthread&fid=';
private $host;
private $cookie_file;
/**
*
* @param unknown $host        	
*/
public function __construct($host) {
$this->host = $host;
}
/**
*
* @return unknown
*/
public function get_formhash() {
$login_url = $this->_get_Login_Url ();
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, $login_url );
curl_setopt ( $ch, CURLOPT_HEADER, false );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
$contents = curl_exec ( $ch );
curl_close ( $ch );
preg_match ( '/<input type="hidden" name="formhash" value="(.*)" \/>/isU', $contents, $matches );
if (! empty ( $matches )) {
$formhash = $matches [1];
} else {
// die('Not found the forumhash.');
}
return $formhash;
}
/**
*
* @param unknown $post        	
* @return string
*/
public function login($user, $pass) {
$login_info = array (
'username' => $user,
'password' => $pass,
'referer' => $this->host,
'questionid' => 0,
'answer' => '',
'seccodeverify' => '',
'formhash' => $this->get_formhash () 
);
$login_url = $this->_get_Login_Url ();
$cookie_file = tempnam ( './temp', 'cookie' );
$ch = curl_init ( $login_url );
curl_setopt ( $ch, CURLOPT_HEADER, false );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt ( $ch, CURLOPT_POST, true );
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $login_info );
curl_setopt ( $ch, CURLOPT_COOKIEJAR, $cookie_file );
curl_exec ( $ch );
curl_close ( $ch );
$this->cookie_file = $cookie_file;
return $cookie_file;
}
/**
*
* @param unknown $fid        	
* @return string
*/
public function use_cookie($fid) {
$send_url = $this->_get_Post_Url ( $fid );
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, $send_url );
curl_setopt ( $ch, CURLOPT_HEADER, false );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt ( $ch, CURLOPT_COOKIEFILE, $this->cookie_file );
$contents = curl_exec ( $ch );
curl_close ( $ch );
preg_match_all ( '/<input type="hidden" name="formhash" id="formhash" value="(.*)" \/>/isU', $contents, $matches );
if (! empty ( $matches )) {
$formhash = $matches [1] [0];
} else {
$formhash = '';
}
return $formhash;
}
/**
*
* @param unknown $fid        	
* @param unknown $thread_data        	
*/
public function post_newthread($fid, $title, $content, $tags) {
$thread_data = array (
'subject' => $title,
'message' => $content,
'topicsubmit' => "yes",
'extra' => '',
'tags' => $tags,
'formhash' => $this->use_cookie ( $fid ) 
);
$send_url = $this->_get_Post_Url ( $fid );
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, $send_url );
curl_setopt ( $ch, CURLOPT_REFERER, $send_url );
curl_setopt ( $ch, CURLOPT_HEADER, false );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt ( $ch, CURLOPT_COOKIEFILE, $this->cookie_file );
curl_setopt ( $ch, CURLOPT_POST, true );
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $thread_data );
$contents = curl_exec ( $ch );
curl_close ( $ch );
return;
}
/**
*
* @param unknown $fid        	
* @return string
*/
private function _get_Post_Url($fid) {
return $this->host . self::POST_PROGRAM . intval ( $fid );
}
/**
*
* @return string
*/
private function _get_Login_Url() {
return $this->host . self::LOGIN_PROGRAM;
}
}

测试实现类

include_once 'class_dz.php';
$host = "http://localhost/dz/"; // 服务器地址
$fid = 2; // 板块ID
$user = "admin"; // 用户名
$pass = "admin"; // 用户密码
$title = "美女大家一起来看"; // 标题
$content = "必须是美女才发,你说是不"; // 正文
$tags = "美女万岁,oh yeah"; // tags
$rc = new discuz_post ( $host );
$rc->login ( $user, $pass );
$rc->post_newthread ( $fid, $title, $content, $tags );

130428 discuz 关于 发送失败,您当前超出了24小时内两人会话的上限

张 清月阅读(1466)

实际上很多人遇到这个问题 但很快就能解决 因为这个设置是在 ucenter 基本设置中 设置的 只需要将 25设置成0 或者设置成你想要的数量即可。可有的时候遇到 权限混乱的 服务器 真心就尴尬了

如果出现了 已经将24小时 发送限制取消了 还是无法正常发送 请查看
uc_client/data/cache/settings.php 文件

整体上来说 这个的排查很漫长 这里提供下 整体的 实现逻辑,转自disucz开发人员 专贴:

一、在ucenter中进行短消息的相关设置,每一项设置都会对应一个变量,
发短消息最少注册天数(pmsendregdays )
同一用户在24小时内允许发起两人会话的最大数(privatepmthreadlimit )
同一用户在24小时内允许发起群聊会话的最大数(chatpmthreadlimit )
参与同一群聊会话的最大用户数(chatpmmemberlimit )
发短消息灌水预防(pmfloodctrl )
启用短消息中心(pmcenter )
开启发送短消息验证码(sendpmseccode )

在uc_server\control\admin\setting.php文件的onls函数中,通过

$this->set_setting('privatepmthreadlimit', intval($privatepmthreadlimit));

将设置值更新到数据库中

function set_setting($k, $v, $encode = FALSE) {
$v = is_array($v) || $encode ? addslashes(serialize($v)) : $v;
$this->db->query("REPLACE INTO ".UC_DBTABLEPRE."settings SET k='$k', v='$v'");
}

可见,这些设置提交后,只会保存到ucenter的设置表settings中,还不会影响论坛的操作。

二、当论坛更新缓存时,程序会按照顺序执行各个函数,

updatecache(function_cache.php) -> build_cache_setting(cache_setting.php)-> uc_app_ls(client.php)-> init_cache(base.php)-> cache(base.php)-> updatedata(cache.php)-> _get_settings(cache.php)-> get_setting(base.php)

在get_setting函数中取出设置的参数值,

$settings = $this->db->fetch_all("SELECT * FROM ".UC_DBTABLEPRE."settings $sqladd");

在updatedata函数中写入到uc_client/data/cache/settings.php文件中。

function updatedata($cachefile = '') {
if($cachefile) {
foreach((array)$this->map[$cachefile] as $modules) {
$s = "<?php\r\n";
foreach((array)$modules as $m) {
$method = "_get_$m";
$s .= '$_CACHE[\''.$m.'\'] = '.var_export($this->$method(), TRUE).";\r\n";
}
$s .= "\r\n?>";
@file_put_contents(UC_DATADIR."./cache/$cachefile.php", $s);
}
} else {
foreach((array)$this->map as $file => $modules) {
$s = "<?php\r\n";
foreach($modules as $m) {
$method = "_get_$m";
$s .= '$_CACHE[\''.$m.'\'] = '.var_export($this->$method(), TRUE).";\r\n";
}
$s .= "\r\n?>";
@file_put_contents(UC_DATADIR."./cache/$file.php", $s);
}
}
}

三、当会员发送短消息的时候,在uc_client\control\pm.php文件的 onsendpm 函数中,所使用的$this->settings[‘pmsendregdays’] 等,就是uc_client/data/cache/settings.php文件中的值。

if($this->settings['pmsendregdays']) {
if($user['regdate'] > $this->time - $this->settings['pmsendregdays'] * 86400) {
return PMSENDREGDAYS;
}
}
if($this->settings['chatpmmemberlimit']) {
if($type == 1 && ($countmsgto > ($this->settings['chatpmmemberlimit'] - 1))) {
return CHATPMMEMBERLIMIT_ERROR;
}
}
if($this->settings['pmfloodctrl']) {
if(!$_ENV['pm']->ispminterval($this->user['uid'], $this->settings['pmfloodctrl'])) {
return PMFLOODCTRL_ERROR;
}
}
if($this->settings['privatepmthreadlimit']) {
if(!$_ENV['pm']->isprivatepmthreadlimit($this->user['uid'], $this->settings['privatepmthreadlimit'])) {
return PRIVATEPMTHREADLIMIT_ERROR;
}
}
if($this->settings['chatpmthreadlimit']) {
if(!$_ENV['pm']->ischatpmthreadlimit($this->user['uid'], $this->settings['chatpmthreadlimit'])) {
return CHATPMTHREADLIMIT_ERROR;
}
}

这就是ucenter中进行短消息设置时,影响前台短消息发送的过程。
有种常见的问题是,其他操作都没有问题,就是uc_client\data\cache目录权限不对,造成设置的缓存不能更新,导致会员发送短消息时出现各种问题。

130423 jquery textarea append bug

张 清月阅读(1318)

一连串的英文 只是因为 遇到这样的问题 真心无语

在 jquery 插件 使用的时候

textarea append 时而有效 时而无效 ,强迫者使用者 刷新页面 再次适用 ,这不是我的本意。

//问题代码
<textarea id="description"></textarea>
<script language="javascript">
$("#description").append(txt);
</script>
//实际解决
<script language="javascript">
$("#description").val($('#description').val() + "text");
</script>