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

30

Discuz触摸屏版 贴子列表页修改方法(调用帖子内容及附件、点赞、分享、收藏)

DZ触摸屏版 贴子列表页修改方法
模板文件位置/template/default/touch/forum/forumdisplay.htm
如果使用得不是默认模板,位置为/template/自定义模板名文件夹名/touch/forum/forumdisplay.htm

修改参看DZ数据表字典
discuz列表页调用帖子内容(正文)
实际使用下面实例时,去掉代码中双正斜杠“//”的注释内容。

DZ触摸屏版贴子列表页调用一张附件图片

如果有则调用,如果没有则不调用

DZ触摸屏版贴子列表页调用所有(多张)附件图片

解释如下:
表pre_forum_thread中字段attachment,附件类型,0无附件 1普通附件 2有图片附件
{if $thread['attachment'] == 2} //如果此贴字段attachment等于2时
$table等于forum_attachment_2
查询数据表pre_forum_attachment_2得到$thread['aid']的新值(调用单张图片的实例中使用的)
查询数据表pre_forum_attachment_2得到数组$thread['attachmentimg']
循环输出数据$thread['attachmentimg']的键和值($keyimg和$valimg,都为数组)
数据表pre_forum_attachment_2中字段attachment即为图片附件路径
所以图片附件路径为$valimg['attachment']
注:DB::fetch_all很好的东东

DZ触摸屏版贴子列表页调用点击收藏

DZ触摸屏版贴子列表页调用点赞(顶、支持)

开启DZ顶踩功能的方法:网站后台>>全局>>站点功能>>主题评价>>启用议题评价是(是)

DZ触摸屏版贴子列表页点击分享、调用分享数

前提条件:开启QQ互联功能插件
此没有完全测试,但我感觉这个分享还是直接使用其它分享插件,如百度分享等

原创文章,转载请注明出处(http://mrdede.com/?p=662),谢谢!

29

discuz模板中调用数据库的某个字段的方法

discuz模板中调用数据库的某个字段的方法

<!--{eval $slides = DB::fetch_all("    //执行SQL语句
SELECT *                                         //读取全部字段
FROM pre_common_block_item  //数据表 可以自定义 这个是DIY帖子内容表
WHERE bid=15                            //查询条件 BID 是DIY的模块id
ORDER BY displayorder ASC,id DESC //排序条件
LIMIT 0, 10                                      //获取前10条信息
");}-->
< !–{loop $slides $slide}–>    //循环 $slides 数组 使用  $slide[字段名]  获取内容
<a href="$slide[url]" target="_black"><img src="data/attachment/$slide[thumbpath]" width="300" height="450" alt="$slide[title]"/></a>
< !–{/loop}–>

29

Discuz! X3 数据字典 DZ数据表结构

pre_common_admincp_cmenu 后台菜单收藏表

字段名 数据类型 默认值 允许非空 自动递增 备注
id smallint(6) unsigned NO
title varchar(255) NO 菜单名称
url varchar(255) NO 菜单地址
sort tinyint(1) 0 NO 菜单类型,备用
displayorder tinyint(3) NO 显示顺序
clicks smallint(6) unsigned 1 NO 点击数,备用
uid mediumint(8) unsigned NO 添加用户
dateline int(10) unsigned NO 添加时间

pre_common_admincp_group 后台管理组

字段名 数据类型 默认值 允许非空 自动递增 备注
cpgroupid smallint(6) unsigned NO 后台组id
cpgroupname varchar(255) NO 后台组名称

pre_common_admincp_member 后台管理成员

字段名 数据类型 默认值 允许非空 自动递增 备注
uid int(10) unsigned NO 成员uid
cpgroupid int(10) unsigned NO 成员组id
customperm text NO 自定义管理权限

Continue reading

25

discuz列表页调用帖子内容及附件方法

功能:获取主题内容和图片附件

找到文件\source\module\forum\forum_forumdisplay.php

搜索(大约812行)$threadids[$threadindex] = $thread['tid'];

在此代码后增加如下代码:

修改后截图如下:

discuz列表页调用帖子内容及附件方法

调用方法:调用帖子文字内容

调用方法:调用附件图片

说明:

参看\source\function\function_post.php中的getattach_row函数(在文件的第61行)

首页要确定$thread['attachment'] == 2和数组$thread['attachments']['used']为真,才可以运行以下代码。

循环搜索数组$thread['attachments']['used']

在循环内数组$valimg[]可以调用表pre_forum_attachment_2中的键值(参看:Discuz! X3 数据字典 DZ数据表结构

DZ触摸屏版帖子列表页其它修改方法能看http://mrdede.com/?p=662