php intval 两位小数乘以100后结果少1
因为工作需要,价格处理的时候往往是两位小数需要换算成分,如:16.33元换算为1633分,直接乘以100也就行了的,但是又使用了一个转换为整数类型的函数intval()
这下子结果就不对了,如图:
结果:
可以看出原本结果应该是1633的,但是使用了函数intval()
之后结果居然变为了1632了,这是由于浮点类型的数字不能在不丢失一点儿精度的情况下通过内部二进制转换得到结果的,换句话说就是浮点类型的计算都会丢失精度的。
该函数的解决方法手册上也给出了,就是需要先使用strval()
函数将变量转成字符串类型,使用情况及结果如下:
还有就是直接使用类型转换也是不行的,如:(int)($pay_price*100)
结果也会损失精度的。
如图:
http://blog.csdn.net/leedaning/article/details/52485699
pre_forum_post中invisible字段说明
1.表说明:
pre_forum_threadimage 放置了帖子中宽度最宽的图片附件,且每个帖子只有一条记录
{
threadimage = DB::fetch_first(“SELECT aid, attachment, remote FROM “.DB::table(getattachtablebytid(tid)).” WHERE tid=’tid’ AND isimage IN (‘1’, ‘-1’) ORDER BY width DESC LIMIT 1″);threadimageaid = $threadimage[‘aid’];
}
2.pre_common_block_item_data itemtype说明:
(推送数据优先于模块帅选数据)
pre_common_block_item_data itemtype=3
itemtype = 1 固定数据
itemtype = 2 修改了数据
itemtype=3 推送数据
3.部分表字段说明
* table : pre_forum_post
* invisible :0 正常
* invisible :-3 已忽略
* invisible :-2 待审核
* invisible :-5 回收站
* invisible : -1 主题帖在回收站中
* table : pre_forum_thread
* displayorder : 0 正常
* displayorder : -1 回收站
* displayorder : -2 待审核
* displayorder : -4 草稿帖
4.pre_common_nav- 自定义导航栏表
navtype=>’导航类型(0:主导航 1:底部导航 2:家园导航 3:快捷导航 4:顶部导航)’
Discuz核心函数库function_core的函数注释
/** * 系统错误处理 * @param <type> message 错误信息 * @param <type>show 是否显示信息 * @param <type> save 是否存入日志 * @param <type>halt 是否中断访问 */ function system_error(message,show = true, save = true,halt = true) { ...... } /** * 更新 session * @global <type> _G * @staticvar booleanupdated * @param boolean force * @return boolean */ function updatesession(force = false) { ...... } /** * 获取 microtime float 数值,为了兼容php4 * @return <float> */ function dmicrotime() { ...... } /** * 设置全局 _G 中的变量 * @global <array>_G * @param <string> key 键 * @param <string>value 值 * @param <mix> group 组(准备废弃,尽量不用) * @return true * * @example * setglobal('test', 1); //_G['test'] = 1; * setglobal('config/test/abc') = 2; //_G['config']['test']['abc'] = 2; * */ function setglobal(key , value,group = null) { ...... } /** * 获取全局变量 _G 当中的某个数值 * @global_G * @param <type> key * @param <type>group 计划废弃的参数,不建议使用 * @return <mix> * * v = getglobal('test'); //v = _G['test'] *v = getglobal('test/hello/ok'); // v =_G['test']['hello']['ok'] */ function getglobal(key,group = null) { ...... } /** * 取出 get, post, cookie 当中的某个变量 * * @param string k key 值 * @param stringtype 类型 * @return mix */ function getgpc(k,type='GP') { ...... } /** * 根据uid 获取用户基本数据 * @staticvar array users 存放已经获取的用户的信息,避免重复查库 * @param <int>uid * @return <array> */ function getuserbyuid(uid) { ...... } /** * 获取当前用户的扩展资料 * @paramfield 字段 */ function getuserprofile(field) { ...... } /** * 对字符串或者输入进行 addslashes 操作 * @param <mix>string * @param <int> force * @return <mix> */ function daddslashes(string, force = 1) { ...... } /** * 对字符串进行加密和解密 * @param <string>string * @param <string> operation DECODE 解密 | ENCODE 加密 * @param <string>key 当为空的时候,取全局密钥 * @param <int> expiry 有效期,单位秒 * @return <string> */ function authcode(string, operation = 'DECODE',key = '', expiry = 0) { ...... } /** * 远程文件文件请求兼容函数 */ function dfsockopen(url, limit = 0,post = '', cookie = '',bysocket = FALSE, ip = '',timeout = 15, block = TRUE) { ...... } /** * HTML转义字符 * @paramstring - 字符串 * @return 返回转义好的字符串 */ function dhtmlspecialchars(string) { ...... } /** * 退出程序 同 exit 的区别, 对输出数据会进行 重新加工和处理 * 通常情况下,我们建议使用本函数终止程序, 除非有特别需求 * @param <type>message */ function dexit(message = '') { ...... } /** * 同 php header函数, 针对 location 跳转做了特殊处理 * @param <type>string * @param <type> replace * @param <type>http_response_code */ function dheader(string,replace = true, http_response_code = 0) { ...... } /** * 设置cookie * @paramvar - 变量名 * @param value - 变量值 * @paramlife - 生命期 * @param prefix - 前缀 * @paramhttponly - 安全属性 */ function dsetcookie(var,value = '', life = 0,prefix = 1, httponly = false) { ...... } /** * 获取cookie * @paramkey - cookie名称,不需要带前缀 */ function getcookie(key) { ...... } /** * 获取文件扩展名 * @paramfilename 文件名 */ function fileext(filename) { ...... } /** * 检查是否是以手机浏览器进入(IN_MOBILE) */ function checkmobile() { ...... } /** * 字符串方式实现 preg_match("/(s1|s2|s3)/",string, match) * @param stringstring 源字符串 * @param array arr 要查找的字符串 如array('s1', 's2', 's3') * @param boolreturnvalue 是否返回找到的值 * @return bool */ function dstrpos(string, &arr, returnvalue = false) { ...... } /** * 检查邮箱是否有效 * @paramemail 要检查的邮箱 * @param 返回结果 */ function isemail(email) { ...... } /** * 问题答案加密 * @paramquestionid - 问题 * @param answer - 答案 * @return 返回加密的字串 */ function quescrypt(questionid, answer) { ...... } /** * 产生随机码 * @paramlength - 要多长 * @param numberic - 数字还是字符串 * @return 返回字符串 */ function random(length, numeric = 0) { ...... } /** * 判断一个字符串是否在另一个字符串中存在 * * @param string 原始字串string * @param string 查找 find * @return boolean */ function strexists(string, find) { ...... } /** * 获取头像 * * @param intuid 需要获取的用户UID值 * @param string size 获取尺寸 'small', 'middle', 'big' * @param booleanreturnsrc 是否直接返回图片src * @param boolean real 是否返回真实图片 * @param booleanstatic 是否返回真实路径 * @param string ucenterurl 强制uc路径 */ function avatar(uid, size = 'middle',returnsrc = FALSE, real = FALSE,static = FALSE, ucenterurl = '') { ...... } /** * 加载语言 * 语言文件统一为lang = array(); * @param file - 语言文件,可包含路径如 forum/xxx home/xxx * @paramlangvar - 语言文字索引 * @param vars - 变量替换数组 * @paramdefault - 指定默认值,当找不到对应言包时生效 * @return 语言文字 */ function lang(file,langvar = null, vars = array(),default = null) { ...... } /** * 检查模板源文件是否更新 * 当编译文件不存时强制重新编译 * 当 tplrefresh = 1 时检查文件 * 当 tplrefresh > 1 时,则根据 tplrefresh 取余,无余时则检查更新 * */ function checktplrefresh(maintpl,subtpl, timecompare,templateid, cachefile,tpldir, file) { ...... } /** * 解析模板 * @return 返回域名 */ function template(file, templateid = 0,tpldir = '', gettplfile = 0,primaltpl='') { ...... } /** * 对某id进行个性化md5 */ function modauthkey(id) { ...... } /** * 获得当前应用页面选中的导航id */ function getcurrentnav() { ...... } /** * 读取缓存 * @paramcachenames - 缓存名称数组或字串 */ function loadcache(cachenames,force = false) { ...... } /** * 通过memcache\mysql\file等几种手段读缓存 * @param mixed cachenames 缓存名的数组或字串 */ function cachedata(cachenames) { ...... } /** * 格式化时间 * @param timestamp - 时间戳 * @paramformat - dt=日期时间 d=日期 t=时间 u=个性化 其他=自定义 * @param timeoffset - 时区 * @return string */ function dgmdate(timestamp, format = 'dt',timeoffset = '9999', uformat = '') { ...... } /** 得到时间戳 */ function dmktime(date) { ...... } /** * 更新缓存 * @param cachename - 缓存名称 * @paramdata - 缓存数据 */ function save_syscache(cachename,data) { ...... } /** * Portal模块 * @param parameter - 参数集合 */ function block_get(parameter) { ...... } /** * Portal 模块显示 * * @param parameter - 参数集合 */ function block_display(bid) { ...... } /** * 返回库文件的全路径 * * @param string libname 库文件分类及名称 * @param stringfolder 模块目录'module','include','class' * @return string * * @example require DISCUZ_ROOT.'./source/function/function_cache.php' * @example 我们可以利用此函数简写为:require libfile('function/cache'); * */ function libfile(libname,folder = '') { ...... } /** * 针对uft-8进行特殊处理的strlen * @param string str * @return int */ function dstrlen(str) { ...... } /** * 根据中文裁减字符串 * @param string - 字符串 * @paramlength - 长度 * @param doc - 缩略后缀 * @return 返回带省略号被裁减好的字符串 */ function cutstr(string, length,dot = ' ...') { ...... } /** * 论坛 aid url 生成 */ function aidencode(aid,type = 0, tid = 0) { ...... } /** * 返回论坛缩放附件图片的地址 url */ function getforumimg(aid, nocache = 0,w = 140, h = 140,type = '') { ...... } /** * 获取rewrite字符串 * @param string type 需要获取的rewite * @param booleanreturntype true:直接返回href, false:返回a标签 * @param string host 可选网站域名 * @return string */ function rewriteoutput(type, returntype,host) { ...... } /** * 手机模式下替换所有链接为mobile=yes形式 * @param file - 正则匹配到的文件字符串 * @paramfile - 要被替换的字符串 * @replace 替换后字符串 */ function mobilereplace(file, replace) { ...... } /** * 手机的output函数 */ function mobileoutput() { ...... } /** * 系统输出 * @return 返回内容 */ function output() { ...... } /** * ajax footer使用输出页面内容 */ function output_ajax() { ...... } /** * 运行钩子 */ function runhooks() { ...... } /** * 执行插件脚本 */ function hookscript(script, hscript,type = 'funcs', param = array(),func = '') { ...... } /** * 获取插件模块 */ function pluginmodule(pluginid,type) { ...... } /** * 执行积分规则 * @param String action: 规则action名称 * @param Integeruid: 操作用户 * @param array extrasql: common_member_count的额外操作字段数组格式为 array('extcredits1' => '1') * @param Stringneedle: 防重字符串 * @param Integer coef: 积分放大倍数 * @param Integerupdate: 是否执行更新操作 * @param Integer fid: 版块ID * @return 返回积分策略 */ function updatecreditbyaction(action, uid = 0,extrasql = array(), needle = '',coef = 1, update = 1,fid = 0) { ...... } /** * 检查积分下限 * @param string action: 策略动作Action或者需要检测的操作积分值使如extcredits1积分进行减1操作检测array('extcredits1' => -1) * @param Integeruid: 用户UID * @param Integer coef: 积分放大倍数/负数为减分操作 * @param Integerreturnonly: 只要返回结果,不用中断程序运行 */ function checklowerlimit(action,uid = 0, coef = 1,fid = 0, returnonly = 0) { ...... } /** * 批量执行某一条策略规则 * @param Stringaction: 规则action名称 * @param Integer uids: 操作用户可以为单个uid或uid数组 * @param arrayextrasql: common_member_count的额外操作字段数组格式为 array('extcredits1' => '1') * @param Integer coef: 积分放大倍数,当为负数时为反转操作 * @param Integerfid: 版块ID */ function batchupdatecredit(action,uids = 0, extrasql = array(),coef = 1, fid = 0) { ...... } /** * 添加积分 * @param Integeruids: 用户uid或者uid数组 * @param String dataarr: member count相关操作数组,例: array('threads' => 1, 'doings' => -1) * @param Booleancheckgroup: 是否检查用户组 true or false * @param String operation: 操作类型 * @param Integerrelatedid: * @param String ruletxt: 积分规则文本 */ function updatemembercount(uids, dataarr = array(),checkgroup = true, operation = '',relatedid = 0, ruletxt = '') { if(!empty(uids) && (is_array(dataarr) &&dataarr)) { require_once libfile('function/credit'); return _updatemembercount(uids,dataarr, checkgroup,operation, relatedid,ruletxt); } return true; } /** * 校验用户组 * @param uid */ function checkusergroup(uid = 0) { ...... } /** * 调试信息 */ function debuginfo() { ...... } /** * 随机取出一个站长推荐的条目 * @param module 当前模块 * @return array */ function getfocus_rand(module) { ...... } /** * 检查验证码正确性 * @param value 验证码变量值 */ function check_seccode(value, idhash) { ...... } /** * 检查验证问答正确性 * @paramvalue 验证问答变量值 */ function check_secqaa(value,idhash) { ...... } /** * 获取广告 */ function adshow(parameter) { ...... } /** * 显示提示信息 * @parammessage - 提示信息,可中文也可以是 lang_message.php 中的数组 key 值 * @param url_forward - 提示后跳转的 url * @paramvalues - 提示信息中可替换的变量值 array(key => value ...) 形式 * @param extraparam - 扩展参数 array(key => value ...) 形式 * 跳转控制 header header跳转 location location JS 跳转,限于 msgtype = 2、3 timeout 定时跳转 refreshtime 自定义跳转时间 closetime 自定义关闭时间,限于 msgtype = 2,值为 true 时为默认 locationtime 自定义跳转时间,限于 msgtype = 2,值为 true 时为默认 内容控制 alert alert 图标样式 right/info/error return 显示请返回 redirectmsg 下载时用的提示信息,当跳转时显示的信息样式 0:如果您的浏览器没有自动跳转,请点击此链接 1:如果 n 秒后下载仍未开始,请点击此链接 msgtype 信息样式 1:非 Ajax 2:Ajax 弹出框 3:Ajax 只显示信息文本 showmsg 显示信息文本 showdialog 关闭原弹出框显示 showDialog 信息,限于 msgtype = 2 login 未登录时显示登录链接 extrajs 扩展 js striptags 过滤 HTML 标记 Ajax 控制 handle 执行 js 回调函数 showid 控制显示的对象 ID */ function showmessage(message, url_forward = '',values = array(), extraparam = array(),custom = 0) { ...... } /** * 检查是否正确提交了表单 * @param var 需要检查的变量 * @paramallowget 是否允许GET方式 * @param seccodecheck 验证码检测是否开启 * @return 返回是否正确提交了表单 */ function submitcheck(var, allowget = 0,seccodecheck = 0, secqaacheck = 0) { ...... } /** * 分页 * @paramnum - 总数 * @param perpage - 每页数 * @paramcurpage - 当前页 * @param mpurl - 跳转的路径 * @parammaxpages - 允许显示的最大页数 * @param page - 最多显示多少页码 * @paramautogoto - 最后一页,自动跳转 * @param simple - 是否简洁模式(简洁模式不显示上一页、下一页和页码跳转) * @return 返回分页代码 */ function multi(num, perpage,curpage, mpurl,maxpages = 0, page = 10,autogoto = FALSE, simple = FALSE) { ...... } /** * 只有上一页下一页的分页(无需知道数据总数) * @paramnum - 本次所取数据条数 * @param perpage - 每页数 * @paramcurpage - 当前页 * @param mpurl - 跳转的路径 * @return 返回分页代码 */ function simplepage(num, perpage,curpage, mpurl) { ...... } /** * 词语过滤 * @parammessage - 词语过滤文本 * @return 成功返回原始文本,否则提示错误或被替换 */ function censor(message,modword = NULL, return = FALSE) { ...... } /** 词语过滤,检测是否含有需要审核的词 */ function censormod(message) { ...... } /** * 刷新重定向 */ function dreferer(default = '') { ...... } /** * 远程FTP使用 */ function ftpcmd(cmd, arg1 = '') { ...... } /** * 编码转换 * @param <string>str 要转码的字符 * @param <string> in_charset 输入字符集 * @param <string>out_charset 输出字符集(默认当前) * @param <boolean> ForceTable 强制使用码表(默认不强制) * */ function diconv(str, in_charset,out_charset = CHARSET, ForceTable = FALSE) { ...... } /** * 重建数组 * @param <string>array 需要反转的数组 * @return array 原数组与的反转后的数组 */ function renum(array) { ...... } /** * 获取当前脚本在线人数 * @param <int>fid 分类 ID,版块、群组 的 id, * @param <int> tid 内容 ID,帖子 的 id */ function getonlinenum(fid = 0, tid = 0) { ...... } /** * 字节格式化单位 * @paramfilesize - 大小(字节) * @return 返回格式化后的文本 */ function sizecount(size) { ...... } /** * 写入运行日志 */ function writelog(file, log) { ...... } /** * 调色板 * @param <type>colorid * @param <type> id * @param <type>background * @return <type> */ function getcolorpalette(colorid,id, background,fun = '') { ...... } /** * 取得某标志位的数值 (0|1) * * @param 数值 status * @param 位置position * @return 0 | 1 */ function getstatus(status,position) { ...... } /** * 设置某一bit位的数值 0 or 1 * * @param int position 1-16 * @param intvalue 0|1 * @param 原始数值 baseon 0x0000-0xffff * @return int */ function setstatus(position, value,baseon = null) { ...... } /** * 通知 * @param Integer touid: 通知给谁 * @param Stringtype: 通知类型 * @param String note: 语言key * @param Arraynotevars: 语言变量对应的值 * @param Integer system: 是否为系统通知 0:非系统通知; 1:系统通知 */ function notification_add(touid, type,note, notevars = array(),system = 0) { ...... } /** * 发送管理通知 * @param type - 通知类型 */ function manage_addnotify(type, from_num = 0,langvar = array()) { ...... } /** * 发送短消息(兼容提醒) * @param toid - 接收方id * @paramsubject - 标题 * @param message - 内容 * @paramfromid - 发送方id */ function sendpm(toid,subject, message,fromid = '', replypmid = 0,isusername = 0, type = 0) { ...... } /** * * 通过tid得到相应的单一post表名或post表集合 * @param <mix>tids: 允许传进单个tid,也可以是tid集合 * @param primary: 是否只查主题表 0:遍历所有表;1:只查主表 * @return 当传进来的是单一的tid将直接返回表名,否则返回表集合的二维数组例:array('forum_post' => array(tids),'forum_post_1' => array(tids)) * @TODO tid传进来的是字符串的,返回单个表名,传进来的是数组的,不管是不是一个数组,返回的还是数组,保证进出值对应 */ function getposttablebytid(tids, primary = 0) { ...... } /** * 获取论坛帖子表名 * @param <int>tableid: 分表ID,默认为:fourm_post表 * @param <boolean> prefix: 是否默认带有表前缀 * @return forum_post or forum_post_* */ function getposttable(tableid = 0, prefix = false) { ...... } /** * 内存读写接口函数 * * @param 命令cmd (set|get|rm|check) * @param 键值 key * @param 数据value * @param 有效期 ttl * @return mix * * @example set : 写入内存ret = memory('set', 'test', 'ok') * @example get : 读取内存 data = memory('get', 'test') * @example rm : 删除内存ret = memory('rm', 'test') * @example check : 检查内存功能是否可用 allow = memory('check') */ function memory(cmd, key='',value='', ttl = 0) { ...... } /** * ip允许访问 * @paramip 要检查的ip地址 * @param - accesslist 允许访问的ip地址 * @param 返回结果 */ function ipaccess(ip, accesslist) { ...... } /** * ip限制访问 * @paramip 要检查的ip地址 * @param 返回结果 */ function ipbanned(onlineip) { ...... } /** * 系统级消息 */ function sysmessage(message) { ...... } /** * 论坛权限 * @param permstr - 权限信息 * @paramgroupid - 只判断用户组 * @return 0 无权限 > 0 有权限 */ function forumperm(permstr,groupid = 0) { ...... } /** * PHP 兼容性函数 */ if(!function_exists('file_put_contents')) { if(!defined('FILE_APPEND')) define('FILE_APPEND', 8); function file_put_contents(filename,data, flag = 0) {return = false; if(fp = @fopen(filename, flag != FILE_APPEND ? 'w' : 'a')) { if(flag == LOCK_EX) @flock(fp, LOCK_EX);return = fwrite(fp, is_array(data) ? implode('', data) :data); fclose(fp); } returnreturn; } } //检查权限 function checkperm(perm) { global_G; return (empty(_G['group'][perm])?'':_G['group'][perm]); } /** * 时间段设置检测 * @param periods - 那种时间段settings[periods]settings['postbanperiods'] settings['postmodperiods'] * @paramshowmessage - 是否提示信息 * @return 返回检查结果 */ function periodscheck(periods,showmessage = 1) { ...... } /** * 用户操作日志 * @param int uid 用户ID * @param stringaction 操作类型 tid=thread pid=post blogid=blog picid=picture doid=doing sid=share aid=article uid_cid/blogid_cid/sid_cid/picid_cid/aid_cid/topicid_cid=comment * @return bool */ function useractionlog(uid,action) { ...... } /** * 得到用户操作的代码或代表字符,参数为数字返回字符串,参数为字符串返回数字 * @param string/int var * @return int/string 注意:如果失败返回false,请使用===判断,因为代码0代表tid */ function getuseraction(var) { ...... } /** * 获取我的中心中展示的应用 */ function getuserapp(panel = 0) { ...... } /** * 获取manyou应用本地图标路径 * @param <type>appid */ function getmyappiconpath(appid,iconstatus=0) { ...... } /** * 获取文字内的url列表 * * @param message 文字 * @return <array> url列表 * */ function get_url_list(message) { ...... } /** * 检查文字内的URL * * @param allowposturl 用户组设置中的值 0=禁止 1=允许但审核 2=允许但不解析 * @parammessage 待处理的文字内容 * @return 0=禁止 1=允许但审核 2=允许但不解析 */ function checkurl(allowposturl, &message) { ...... } /** * 更新页面和模块的关系 * @param string targettplname 页面名称 * @param arrayblocks 模块IDS */ function update_template_block(targettplname,blocks) { ...... } /** * 获取批定类型的关联连接 * * @param string extent 内容所需关联链接范围 article, forum, group, blog * @return string 有效的关联链接 */ function getrelatedlink(extent) { ...... } /** * 判断 Connect 链接参数有效性 * @global _G * @param arrayparams 参数数组 * @param array connect_params 返回参数 * @return boolean */ function connect_valid(params, &connect_params) { ...... } /** * 获取 Token * @global_G * @param string type * @return string */ function connect_get_access_token(type = 'USER') { ...... } /** * 获取 Connect 参数签名 * @param array params 参数数组 * @param stringaccess_token 加密 Token * @return string */ function connect_get_sig(params,access_token) { ...... } /** * 通过 AID 获取附件表名 * @param <int> aid */ function getattachtablebyaid(aid) { ...... } /** * 返回指定 TID 所对应的附件表编号 * @param <int> tid */ function getattachtableid(tid) { ...... } /** * 通过 TID 获取附件表名 * @param <int> tid */ function getattachtablebytid(tid) { ...... } /** * 通过 PID 获取附件表名 * @param <int> pid */ function getattachtablebypid(pid) { ...... } /** * 添加一个新的附件索引记录,并返回新附件 ID * @param <int> uid */ function getattachnewaid(uid = 0) { ...... } /** * 获取 SEO设置 * @param string page 调用哪个页面的 * @param arraydata 可替换数据 * @return array('seotitle', 'seodescription', 'seokeywords') */ function get_seosetting(page,data = array(), defset = array()) { ...... } /** * 需处理连续分隔符的str_replace() * @param arraysearchs 被替换的数组 * @param array replaces 用于替换的数组 * @param stringstr 目标字符串 */ function strreplace_strip_split(searchs,replaces, str) { ...... } /** * 返回带第几页的title * @global_G * @param string navtitle 源标题 * @param intpage 页码 * @return string */ function get_title_page(navtitle,page){ if(page>1) { ...... } /** * * 生成缩略图文件名 * @param StringfileStr: 原文件名,允许附带路径 * @param String extend: 新文件名后缀 * @param BooleanholdOldExt: 是否保留原扩展名 * @return 返加新的后缀文件名 */ function getimgthumbname(fileStr,extend='.thumb.jpg', holdOldExt=true) { ...... } /** * 更新数据的审核状态 * @param <string>idtype 数据类型 tid=thread pid=post blogid=blog picid=picture doid=doing sid=share aid=article uid_cid/blogid_cid/sid_cid/picid_cid/aid_cid/topicid_cid=comment * @param <array/int> ids ID 数组、ID 值 * @param <int>status 状态 0=加入审核(默认) 1=忽略审核 2=审核通过 */ function updatemoderate(idtype,ids, $status = 0) { ...... } /** * 显示漫游应用公告 */ function userappprompt() { ...... }
php及xdebug使用小结
php下搭配使用xdebug是十分好的组合,用于php的调试工作,下面分别介绍之:
1 WINDOWS下的安装
下载站点http://www.xdebug.org/
要确定使用一个跟你的PHP配合的版本才行,比如xdebug中的5。2系列版本是跟5.2
的php搭配的,5.3系列的跟5.3的PHP搭配的。目前的版本是2。1,然后你会发现
有相应的线程安全和非安全两个版本。如何知道下载哪个版本呢,可以将你跑
PHPINFO时的显示出来网页的源代码,COPY到
http://www.xdebug.org/find-binary.php中,然后提交,然后XDEBUG为告诉你
应该下载哪个版本了
将下载的文件放到d:\php\ext目录,重命名为php_xdebug.dll。
然后修改PHP。INI如下:
[Xdebug]
zend_extension=”D:\php\ext\php_xdebug.dll”
xdebug.profiler_output_dir=”D:\php53\xdebug”
xdebug.profiler_enable=On
xdebug.profiler_enable_trigger=1
xdebug.default_enable=On
xdebug.show_exception_trace=On
xdebug.show_local_vars=1
xdebug.max_nesting_level=50
xdebug.var_display_max_depth=6
xdebug.dump_once=On
xdebug.dump_globals=On
xdebug.dump_undefined=On
xdebug.dump.REQUEST=*
xdebug.dump.SERVER=REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT
xdebug.trace_output_dir=”D:\php53\xdebug”
注意要建立一个xdebug目录放调试输出的文件。
重新启动apache,在phpinfo中就可以看到有关XDEBUG的部分了
2 LINUX下的安装
tar -xzf xdebug-2.0.0RC3.gz
cd xdebug-2.0.0RC3
/usr/local/php/bin/phpize
./configure –enable-xdebug
cp modules/xdebug.so /usr/local/php/lib/php/extensions/no-debug-non-zts-20020429/
注:/usr/local/php/lib/php/extensions/no-debug-non-zts-20020429/不同的PHP版本路径不同,也不一定要放在该路径,可以在zend_extension_ts中自行指定xdebug.so所在位置。
3 使用,可以写个简单程序去看效果,比如:
Apache支持shtml实现include文件解析的配置方法
1. 确认加载include.so模块,将注释去掉:
LoadModule include_module libexec/apache2/mod_include.so
2. AddType部分去掉这两段注释:
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
3. Directory目录权限里面找到
Options Indexes FollowSymLinks
增加Includes修改为:
Options Indexes FollowSymLinks Includes
4. 重新启动Apache,测试:
<!–#include file=”head.html”–>
Holle Word!,这是中间的内容
<!–#include file=”foot.html”–>
以下是其它网友的补充:
什么是SSI?
SSI是英文Server Side Includes的缩写,翻译成中文就是服务器端包含的意思。从技术角度上说,SSI就是在HTML文件中,可以通过注释行调用的命令或指针。SSI具有强大的功能,只要使用一条简单的SSI命令就可以实现整个网站的内容更新,时间和日期的动态显示,以及执行shell和CGI脚本程序等复杂的功能。
如何使你的Apache服务器支持SSI?
Apache默认是不支持SSI的,需要我们更改httpd.conf来进行配置。我这里以windows平台的Apache 2.0.x为例,打开conf目录下的httpd.conf文件,搜索“AddType text/html .shtml”,搜索结果:
# AddOutputFilter INCLUDES .shtml
把这两行前面的#去掉。
然后搜索“Options Indexes FollowSymLinks”
在搜索到的那一行后面添加“ Includes”
即将该行改变为 Options Indexes FollowSymLinks Includes
保存httpd.conf,重起apache即可。
到此我们就完成了对Apache SSI的设置。
MAC 版 sublime text 3 安装插件管理器
sublime text3 安装插件管理器Package Control
同事用的sublime text2,搜了下,有新版本sublime text3,于是下载了一个安装上,要想快速开发,安装懒人插件,对此一无所知的我,搜了许多资料终于安装好了所谓的插件管理器Package Control。
打开Sublime,按下Control + `(Mac)或者Ctrl + `(Windows),然后粘贴上下面的代码:
import urllib.request,os; pf = ‘Package Control.sublime-package’; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); open(os.path.join(ipp, pf), ‘wb’).write(urllib.request.urlopen( ‘http://sublime.wbond.net/’ + pf.replace(‘ ‘,’%20’)).read())
查看官网设置https://sublime.wbond.net/installation#Simple
点击Preferences。如果安装成功了,Package Settings 、Package Control会出现在菜单里了。
看到这里,是不是觉得很简单呢?
ThinkPHP实现静态缓存和动态缓存
利用ThinkPHP既可以很容易实现页面静态化(静态缓存),又可以很容易实现动态缓存(文件缓存和memecache缓存等)
方法/步骤
-
弄清静态缓存和动态缓存的用途:
静态缓存:生成静态页面——缓存的是整个页面;
动态缓存:仅对数据库中的数据进行了缓存,即“通过动态缓存,不需要再读取数据库了,直接通过缓存文件来调取相应数据”;
-
第二步:静态缓存的实现,在config.php文件中作如下配置:
-
动态缓存的实现方式“文件缓存”(默认方式):
ThinkPHP的S()函数将“从数据库中获得的数据”缓存到“文件”中;
//S(‘缓存名称’,’缓存数据’,’缓存时间’)—缓存文件默认保存到“Runtime/Temp/”文件夹
存数据:S(‘index_list’,list,10); //list:是从数据库中读取的数据
读数据:S(‘index_list’); //直接从缓存文件读取,不再经过数据库
-
动态缓存的实现方式“memecache缓存”,需先安装Memcached
-
再开启memecache缓存,在config.php中作如下配置
-
其次通过S()函数实现“memecache缓存”:
ThinkPHP的S()函数将“从数据库中获得的数据”缓存到“内存”中;
存数据:S(‘index_list’,$list,10);
读数据:S(‘index_list’)
-
至此,你可以利用ThinkPHP实现静态缓存和动态缓存了
END
php转换\\u(UNICODE)字符串为汉字
<?php
test = ‘\u53c2\u8d5b\u56e2\u961f\u65b9\u6848\u540d\u79f0’; //庆重庆temp = explode(‘\u’,test); //拆分成数组rslt = array(); //保存结果的数组
array_shift(temp); //去掉第一个不含数据的
foreach(temp as k =>v) {
v = hexdec(v); //将16进制转换成十进制
rslt[] = ‘&#’ .v . ‘;’; //转换成html实体
}
rslt = implode(”,rslt); //组合结果数组成字符串
echo $rslt;
?>
Ajax+jQuery: $.post() 与 Access-Control-Allow-Origin.
写了个json数据接口,为了方便调试,html和js部分就直接在本地用浏览器打开调试
结果提示这个错误
XMLHttpRequest cannot load Origin “xxx” is not allowed by Access-Control-Allow-Origin.
查过是js的安全机制有关,默认不允许跨域调用
解决方法(PHP版)
在接口源码内声明
header(‘Access-Control-Allow-Origin: *’); //只允许特定的而另一个域名访问,把*替换成特定被允许的域名
或者..把html文件上传到服务器上。