23

织梦文档关键词维护中设置词语重叠后出错的修改方法

使用织梦系统的文档关键词维护,假如增加两个关键词为“织梦”和“织梦先生”,那么在文章中出现“织梦先生”这个词的时候,锚文本HTML就会出错,我想这是很多用过这个功能的SEOer见到过的。

在很早以前我就发现过,但是因为自己已经很长时间没有使用织梦系统了,只是这次帮助客户修改时,有这个需求,就在这里做一下记录。

需要修改两个函数,都在同一个文件中(include/arc.archives.class.php),一个是类Archives中的ReplaceKeyword()函数,另一个是文件最末尾的_highlight()函数。

修改源码中把织梦原版代码注释掉了,以便比较源码和理解修改思路,源码如下: Continue reading

17

织梦结合小程序的方法及插件安装

最近发现有很多朋友来到我的某篇文章中找“织梦结合小程序”的方法,但是我那篇文章不是关于这个问题的记录,所以在这里做一个织梦结合小程序的方法的外部链接吧,

织梦CMS万能API插件

这里有详细的文字和视频介绍,如果看不明白,他可联系作者,如果还是不明白可以联系我,一同研究。

十一 04

linux各文件夹的作用

linux下的文件结构,看看每个文件夹都是干吗用的
/bin二进制可执行命令
/dev设备特殊文件
/etc系统管理和配置文件
/etc/rc.d启动的配置文件和脚本
/home用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示
/lib标准程序设计库,又叫动态链接共享库,作用类似windows里的.dll文件
/sbin系统管理命令,这里存放的是系统管理员使用的管理程序
/tmp公用的临时文件存储点
/root系统管理员的主目录(呵呵,特权阶级)
/mnt系统提供这个目录是让用户临时挂载其他的文件系统。
/lost+found这个目录平时是空的,系统非正常关机而留下“无家可归”的文件(windows下叫什么.chk)就在这里
/proc虚拟的目录,是系统内存的映射。可直接访问这个目录来获取系统信息。
/var某些大文件的溢出区,比方说各种服务的日志文件
/usr最庞大的目录,要用到的应用程序和文件几乎都在这个目录。其中包含:
/usr/x11r6存放xwindow的目录
/usr/bin众多的应用程序
/usr/sbin超级用户的一些管理程序
/usr/doclinux文档
/usr/includelinux下开发和编译应用程序所需要的头文件
/usr/lib常用的动态链接库和软件包的配置文件
/usr/man帮助文档
/usr/src源代码,linux内核的源代码就放在/usr/src/linux里
/usr/local/bin本地增加的命令
/usr/local/lib本地增加的库 Continue reading

31

MySQL的两种常用数据库存储引擎:MyISAM与InnoDB

问题1:MySQL的data里的网站数据库里只有.frm 而没有.MYD和.MYI文件?

解释:首先排除误删的情况,那么,你的此数据库的存储引擎可能为innoDB类型(把数据库导入为.sql后,可以在每个表结构后看到写着“ENGINE=InnoDB”;或者使用phpmyadmin查看数据表时,在“类型”列下,显示每个表的类型为“ENGINE=InnoDB”)。
那么,在windows主机下查看数据库目录./mysql/data/数据库名/ ,这样只能看到.frm文件和一个db.opt文件,它的数据文件位置在“./mysql/data/ibdata1”文件中保存着。

问题2:直接在服务器中直接迁移WordPress网站的数据库文件则数据丢失?

解释:WordPress博客系统是数据库引擎是InnoDB类型的,所以,看了第一个问题的解释后,这第二个问题就明白了。
那么,要直接对WordPress系统网站的数据文件迁移的时候,同时也要迁移这个文件(“./mysql/data/ibdata1”),网站就会正常显示出原数据了。

相关知识:

MyISAM与InnoDB是mysql目前比较常用的两个数据库存储引擎,MyISAM与InnoDB的主要的不同点在于性能和事务控制上。这里简单的介绍一下两者间的区别和转换方法:

MyISAM:MyISAM是MySQL5.5之前版本默认的数据库存储引擎。MYISAM提供高速存储和检索,以及全文搜索能力,适合数据仓库等查询频繁的应用。但不支持事务、也不支持外键。MyISAM格式的一个重要缺陷就是不能在表损坏后恢复数据。

InnoDB:InnoDB是MySQL5.5版本的默认数据库存储引擎,不过InnoDB已被Oracle收购,MySQL自行开发的新存储引擎Falcon将在MySQL6.0版本引进。InnoDB具有提交、回滚和崩溃恢复能力的事务安全。但是比起MyISAM存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。尽管如此,但是InnoDB包括了对事务处理和外来键的支持,这两点都是MyISAM引擎所没有的。

又学习了!

22

replace 替换参数

先来看一个简单的例子吧。

替换后的 str 是什么呢?
是 ”123$’321″ 。。。吗??
如果你的浏览器是 IE6-8 的话,确实是这个结果,可是那只是变态IE的结果。
标准浏览器下会是什么呢?

竟然是 ”123321321″ 为什么会是这个结果呢?
还是看权威的文档吧,《Specifying a string as a parameter》。
在这里,我们可以看到 $$, $&, $, $' 和 $n/$nn 的格式。
相信很多学过 js 正则的应该都用印象。
其实我一直以为只有在正则里才能用这些替换参数,直到前些天被坑才真正掌握这个知识点。

其实 $$, $&, $, $’ 在普通字符串替换时也可以使用
$$ 表示 $ 字符
$& 表示匹配到的字符
$` 表示匹配到的字符之前的那部分
$’ 表示匹配到的字符之后的那部分
但是 $n 或 $nn 只有在正则模式捕获组才能使用。

例如

 

十一 07

织梦获取文章链接的函数GetOneArchive

在某自自定义的会员页面中调用指定栏目(typeid=’36′)最新文章,前提是这个页面允许直接使用PHP代码,循环中使用GetOneArchive函数,带入文章ID,返回的是数组,$url['arcurl']即为此文章链接。

 

10

修改Discuz论坛的浏览量为每次增加随机数

文件位置:/source/module/forum/forum_viewthread.php

对函数viewthread_updateviews进行修改,约1025行到1049行。

一般来讲,修改如下代码

意为每次浏览增加2~9之间(含2和9)的随机数更新数据库中的记录。

但是这么修改也不是绝对的可以改变浏览量,还要结合网站管理后台的设置。

如果按上面的修改方法不好使,可以进入后台,按下面方法设置:

后台>>全局>>性能优化>>服务器优化>>是否优化更新主题浏览量

设置为“否” >> 提交

另外,也可以把下面这项设置为“否”,

后台>>全局>>性能优化>>服务器优化>>查看数开启防刷新

 

15

PHP中extract()的使用方法

年前年后没什么活儿,闲着没事时准备把织梦折采集功能提出来,经过改造移植进Destoon网站系统。在改造的过程中,也碰到了很多新知识来学习。

Destoon源码根目录common.inc.php文件约第80多行,源码如下:

if($_POST) extract($_POST, EXTR_SKIP);
if($_GET) extract($_GET, EXTR_SKIP);

注:不要对不能信任的数据使用 extract()

测试实例:

form.html

action.php

extract(),它的主要作用是将数组展开,键名(name)作为变量名,元素值(value)为变量值,可以说为数组的操作提供了另外一个方便的工具,比方说,可以很方便的提取$_POST或者$_GET的元素,对表单提交过来的内容不用一一赋值。

int extract ( array $var_array [, int $extract_type [, string $prefix ]] )

extract() 检查每个键名看是否可以作为一个合法的变量名,同时也检查和符号表中已有的变量名的冲突。对待非法/数字和冲突的键名的方法将根据 extract_type 参数决定。可以是以下值之一:

EXTR_OVERWRITE
如果有冲突,覆盖已有的变量。
EXTR_SKIP
如果有冲突,不覆盖已有的变量。
EXTR_PREFIX_SAME
如果有冲突,在变量名前加上前缀 prefix 。
EXTR_PREFIX_ALL
给所有变量名加上前缀 prefix 。自 PHP 4.0.5 起这也包括了对数字索引的处理。
EXTR_PREFIX_INVALID
仅在非法/数字的变量名前加上前缀 prefix 。本标记是 PHP 4.0.5 新加的。
EXTR_IF_EXISTS
仅在当前符号表中已有同名变量时,覆盖它们的值。其它的都不处理。可以用在已经定义了一组合法的变量,然后要从一个数组例如 $_REQUEST 中提取值覆盖这些变量的场合。本标记是 PHP 4.2.0 新加的。
EXTR_PREFIX_IF_EXISTS
仅在当前符号表中已有同名变量时,建立附加了前缀的变量名,其它的都不处理。本标记是 PHP 4.2.0 新加的。
EXTR_REFS
将变量作为引用提取。这有力地表明了导入的变量仍然引用了 var_array 参数的值。可以单独使用这个标志或者在 extract_type 中用 OR 与其它任何标志结合使用。本标记是 PHP 4.3.0 新加的。
如果没有指定 extract_type ,则被假定为 EXTR_OVERWRITE。

注意 prefix 仅在 extract_type 的值是 EXTR_PREFIX_SAME,EXTR_PREFIX_ALL,EXTR_PREFIX_INVALID 或 EXTR_PREFIX_IF_EXISTS 时需要。如果附加了前缀后的结果不是合法的变量名,将不会导入到符号表中。前缀和数组键名之间会自动加上一个下划线。

extract() 的一种可能用法是将 wddx_deserialize() 返回的结合数组中的内容导入到符号表变量中去。

Example#1 extract() 例子

上例将输出:

blue, large, sphere, medium

$size 没有被覆盖,因为指定了 EXTR_PREFIX_SAME,这使得 $wddx_size 被建立。如果指定了 EXTR_SKIP,则 $mrdede_size 也不会被建立。EXTR_OVERWRITE 将使 $size 的值为“medium”,EXTR_PREFIX_ALL 将建立新变量 $mrdede_color,$mrdede_size 和 $mrdede_shape。

必须使用关联数组,数字索引的数组将不会产生结果,除非用了 EXTR_PREFIX_ALL 或者 EXTR_PREFIX_INVALID。

04

Discuz触摸屏版的注册页面增加其它字段(如手机号、真实姓名等等)

一、后台设置

进入后台>>用户>>用户栏目>>栏目列表(默认的),
找到“注册页显示”这列,向下找到“手机”或其它需要增加到注册页面选项的行,
之后点选对勾。
如果想进行其它编辑,点击项目右侧的“编辑”。

二、模板修改

在模板\template\模板文件名\touch\member\register.htm中
在适合的位置增加如下代码:

三、程序修改

1、打开文件\source\language\lang_blockclass.php
'blockclass_member_field_title' => '用户名', 的下一行增加如下代码
'blockclass_member_field_realname' => '真实姓名',
原因:为了使在页/home.php?mod=spacecp&ac=profile&op=base 的真实姓名项中的placeholder调用
2、打开文件\source\function\function_profile.php
在第189行esle内 增加 placeholder=\"".lang('blockclass', 'blockclass_member_field_'.$fieldid)."\"
修改后为:
$html = "<input type=\"text\" name=\"$fieldid\" id=\"$fieldid\" class=\"px\" value=\"$space[$fieldid]\" placeholder=\"".lang('blockclass', 'blockclass_member_field_'.$fieldid)."\" tabindex=\"1\" />";
原因:为了实现在手机显示表单时可以在框内直接显示标题提示信息
3、打开文件\source\class\class_member.php
大约672行 找到if(defined('IN_MOBILE'))把他连同下面的中括号内容全部注释,注释后如下:

原因:不注释,在手机注册时保存不了新增加的字段值

完成!

原创,转载请注明出处,谢谢!

03

Discuz数据库操作类

DZ数据库类详解

函数 功能
DB::table($tablename) 获取正确带前缀的表名,转换数据库句柄
DB::delete($tablename, 条件,条数限制) 删除表中的数据
DB::insert($tablename, 数据(数组),是否返回插入ID,是否是替换式,是否silent) 插入数据操作
DB::update($tablename, 数据(数组)条件) 更新操作
DB::fetch(查询后的资源) 从结果集中取关联数组,注意如果结果中的两个或以上的列具有相同字段名,最后一列将优先。
DB::fetch_first($sql) 取查询的第一条数据fetch
DB::fetch_all($sql) 查询并fetch
DB::result_first($sql) 查询结果集的第一个字段值
DB::query($sql) 普通查询
DB::num_rows(查询后的资源) 获得记录集总条数
DB::_execute(命令,参数) 执行mysql类的命令
DB::limit(n,n) 返回限制字串
DB::field(字段名, $pid) 返回条件,如果为数组则返回 in 条件
DB::order(别名, 方法) 排序

注意:由于 X1.5 里增加了SQL的安全性检测。因此,如果你的SQL语句里包含以下开头的函数 load_file,hex,substring,if,ord,char。 或者包含以下操作 intooutfile,intodumpfile,unionselect,(select’)都将被拒绝执行。

替换参数 功能
%t 表名,
%s 字串,如果是数组就序列化
%f 按 %F 的样式格式化字串
%d 整数
%i 不做处理
%n 若为空即为0,若为数组,就用’,’ 分割,否则加引号

C对象,可以有效的利用缓存,并且数据获得都统一在 class/table 目录下,好处是所有的查询都集中和复用。方便维护和升级。默认的T方法有以下默认的获得数据方式。每个数据表还需要看具体的表数据定义函数。#开头的,是插件表定义,会去插件目录下的table目录下找,所以插件开发也可以用这种方法。

函数 功能
C::t($tablename’)->count() 获取表所有行数
C::t($tablename’)->update(键值,$data) 更新键值数据
C::t($tablename’)->delete(键值) 删除键值数据
C::t($tablename’)->truncate() 清空表
C::t($tablename’)->insert($data, $return_insert_id,$replace) 插入数据
C::t($tablename’)->fetch_all($ids) fetch 数据,可以是单一键值或者多个键值数组
C::t($tablename’)->fetch_all_field() fetch所有的字段名表
C::t($tablename’)->range($start, $limit, $sort) fetch值域范围
C::t($tablename’)->optimize() 优化表

DB::query

修改数据库方法实例:
此查询的结果是把tid为10000的主题的浏览数增加1
DB::query("update ".DB::table('forum_thread')." set views=views+1 where tid = 10000");

此查询的结果是删除tid为10000的主题
DB::query("delete from ".DB::table('forum_thread')." where tid = 10000");

此查询的结果是在标签主表里面增加一个标签“标签名称”
DB::query("insert into ".DB::table('common_tag')." (tagname,status) values ('标签名称','0')");

DB::query与DB::fetch配合

DB::query 执行SQL查询,包括两种,一种是执行update,delete这些修改数据库的操作,还有一种与DB::fetch配合做一个循环查询
DB::fetch 与DB::query和while配合使用,形成一个循环

Continue reading