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 boolean $updated
 * @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 string $type 类型
 * @return mix
 */
function getgpc($k, $type='GP') {
    ......    
}

/**
 * 根据uid 获取用户基本数据
 * @staticvar array $users 存放已经获取的用户的信息,避免重复查库
 * @param <int> $uid
 * @return <array>
 */
function getuserbyuid($uid) {
    ......    
}

/**
* 获取当前用户的扩展资料
* @param $field 字段
*/
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转义字符
* @param $string - 字符串
* @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
* @param $var - 变量名
* @param $value - 变量值
* @param $life - 生命期
* @param $prefix - 前缀
* @param $httponly - 安全属性
*/
function dsetcookie($var, $value = '', $life = 0, $prefix = 1, $httponly = false) {
    ......    
}

/**
 * 获取cookie
 * @param $key - cookie名称,不需要带前缀
 */
function getcookie($key) {
    ......    
}

/**
 * 获取文件扩展名
 * @param $filename 文件名
 */
function fileext($filename) {
    ......    
}

/**
* 检查是否是以手机浏览器进入(IN_MOBILE)
*/
function checkmobile() {
    ......    
}

/**
 * 字符串方式实现 preg_match("/(s1|s2|s3)/", $string, $match)
 * @param string $string 源字符串
 * @param array $arr 要查找的字符串 如array('s1', 's2', 's3')
 * @param bool $returnvalue 是否返回找到的值
 * @return bool
 */
function dstrpos($string, &$arr, $returnvalue = false) {
    ......    
}

/**
* 检查邮箱是否有效
* @param $email 要检查的邮箱
* @param 返回结果
*/
function isemail($email) {
    ......    
}

/**
* 问题答案加密
* @param $questionid - 问题
* @param $answer - 答案
* @return 返回加密的字串
*/
function quescrypt($questionid, $answer) {
    ......    
}

/**
* 产生随机码
* @param $length - 要多长
* @param $numberic - 数字还是字符串
* @return 返回字符串
*/
function random($length, $numeric = 0) {
    ......    
}

/**
 * 判断一个字符串是否在另一个字符串中存在
 *
 * @param string 原始字串 $string
 * @param string 查找 $find
 * @return boolean
 */
function strexists($string, $find) {
    ......    
}

/**
 * 获取头像
 *
 * @param int $uid 需要获取的用户UID值
 * @param string $size 获取尺寸 'small', 'middle', 'big'
 * @param boolean $returnsrc 是否直接返回图片src
 * @param boolean $real 是否返回真实图片
 * @param boolean $static 是否返回真实路径
 * @param string $ucenterurl 强制uc路径
 */
function avatar($uid, $size = 'middle', $returnsrc = FALSE, $real = FALSE, $static = FALSE, $ucenterurl = '') {
    ......    
}

/**
* 加载语言
* 语言文件统一为 $lang = array();
* @param $file - 语言文件,可包含路径如 forum/xxx home/xxx
* @param $langvar - 语言文字索引
* @param $vars - 变量替换数组
* @param $default - 指定默认值,当找不到对应言包时生效
* @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() {
    ......    
}

/**
* 读取缓存
* @param $cachenames - 缓存名称数组或字串
*/
function loadcache($cachenames, $force = false) {
    ......    
}

/**
 * 通过memcache\mysql\file等几种手段读缓存
 * @param mixed $cachenames 缓存名的数组或字串
 */
function cachedata($cachenames) {
    ......    
}

/**
* 格式化时间
* @param $timestamp - 时间戳
* @param $format - dt=日期时间 d=日期 t=时间 u=个性化 其他=自定义
* @param $timeoffset - 时区
* @return string
*/
function dgmdate($timestamp, $format = 'dt', $timeoffset = '9999', $uformat = '') {
    ......    
}

/**
	得到时间戳
*/
function dmktime($date) {
    ......    
}

/**
* 更新缓存
* @param $cachename - 缓存名称
* @param $data - 缓存数据
*/
function save_syscache($cachename, $data) {
    ......    
}

/**
* Portal模块
* @param $parameter - 参数集合
*/
function block_get($parameter) {
    ......    
}

/**
* Portal 模块显示
*
* @param $parameter - 参数集合
*/
function block_display($bid) {
    ......    
}

/**
* 返回库文件的全路径
*
* @param string $libname 库文件分类及名称
* @param string $folder 模块目录'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 - 字符串
* @param $length - 长度
* @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 boolean $returntype true:直接返回href, false:返回a标签
 * @param string $host 可选网站域名
 * @return string
 */
function rewriteoutput($type, $returntype, $host) {
    ......    
}

/**
* 手机模式下替换所有链接为mobile=yes形式
* @param $file - 正则匹配到的文件字符串
* @param $file - 要被替换的字符串
* @$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 Integer $uid: 操作用户
 * @param array $extrasql: common_member_count的额外操作字段数组格式为 array('extcredits1' => '1')
 * @param String $needle: 防重字符串
 * @param Integer $coef: 积分放大倍数
 * @param Integer $update: 是否执行更新操作
 * @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 Integer $uid: 用户UID
* @param Integer $coef: 积分放大倍数/负数为减分操作
* @param Integer $returnonly: 只要返回结果,不用中断程序运行
*/
function checklowerlimit($action, $uid = 0, $coef = 1, $fid = 0, $returnonly = 0) {
    ......    
}

/**
 * 批量执行某一条策略规则
 * @param String $action:  规则action名称
 * @param Integer $uids: 操作用户可以为单个uid或uid数组
 * @param array $extrasql: common_member_count的额外操作字段数组格式为 array('extcredits1' => '1')
 * @param Integer $coef: 积分放大倍数,当为负数时为反转操作
 * @param Integer $fid: 版块ID
 */
function batchupdatecredit($action, $uids = 0, $extrasql = array(), $coef = 1, $fid = 0) {
    ......    
}

/**
 * 添加积分
 * @param Integer $uids: 用户uid或者uid数组
 * @param String $dataarr: member count相关操作数组,例: array('threads' => 1, 'doings' => -1)
 * @param Boolean $checkgroup: 是否检查用户组 true or false
 * @param String $operation: 操作类型
 * @param Integer $relatedid:
 * @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) {
    ......    
}

/**
 * 检查验证问答正确性
 * @param $value 验证问答变量值
 */
function check_secqaa($value, $idhash) {
    ......    
}

/**
 * 获取广告
 */
function adshow($parameter) {
    ......    
}

/**
 * 显示提示信息
 * @param $message - 提示信息,可中文也可以是 lang_message.php 中的数组 key 值
 * @param $url_forward - 提示后跳转的 url
 * @param $values - 提示信息中可替换的变量值 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 需要检查的变量
* @param $allowget 是否允许GET方式
* @param $seccodecheck 验证码检测是否开启
* @return 返回是否正确提交了表单
*/
function submitcheck($var, $allowget = 0, $seccodecheck = 0, $secqaacheck = 0) {
    ......    
}

/**
* 分页
* @param $num - 总数
* @param $perpage - 每页数
* @param $curpage - 当前页
* @param $mpurl - 跳转的路径
* @param $maxpages - 允许显示的最大页数
* @param $page - 最多显示多少页码
* @param $autogoto - 最后一页,自动跳转
* @param $simple - 是否简洁模式(简洁模式不显示上一页、下一页和页码跳转)
* @return 返回分页代码
*/
function multi($num, $perpage, $curpage, $mpurl, $maxpages = 0, $page = 10, $autogoto = FALSE, $simple = FALSE) {
    ......    
}

/**
* 只有上一页下一页的分页(无需知道数据总数)
* @param $num - 本次所取数据条数
* @param $perpage - 每页数
* @param $curpage - 当前页
* @param $mpurl - 跳转的路径
* @return 返回分页代码
*/
function simplepage($num, $perpage, $curpage, $mpurl) {
    ......    
}

/**
 * 词语过滤
 * @param $message - 词语过滤文本
 * @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) {
    ......    
}

/**
* 字节格式化单位
* @param $filesize - 大小(字节)
* @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 int $value  0|1
 * @param 原始数值 $baseon  0x0000-0xffff
 * @return int
 */
function setstatus($position, $value, $baseon = null) {
    ......    
}

/**
 * 通知
 * @param Integer $touid: 通知给谁
 * @param String $type: 通知类型
 * @param String $note: 语言key
 * @param Array $notevars: 语言变量对应的值
 * @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
* @param $subject - 标题
* @param $message - 内容
* @param $fromid - 发送方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允许访问
* @param $ip 要检查的ip地址
* @param - $accesslist 允许访问的ip地址
* @param 返回结果
*/
function ipaccess($ip, $accesslist) {
    ......    
}

/**
* ip限制访问
* @param $ip 要检查的ip地址
* @param 返回结果
*/
function ipbanned($onlineip) {
    ......    
}

/**
 * 系统级消息
 */
function sysmessage($message) {
    ......    
}

/**
* 论坛权限
* @param $permstr - 权限信息
* @param $groupid - 只判断用户组
* @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);
		}
		return $return;
	}
}

//检查权限
function checkperm($perm) {
	global $_G;
	return (empty($_G['group'][$perm])?'':$_G['group'][$perm]);
}

/**
* 时间段设置检测
* @param $periods - 那种时间段 $settings[$periods]  $settings['postbanperiods'] $settings['postmodperiods']
* @param $showmessage - 是否提示信息
* @return 返回检查结果
*/
function periodscheck($periods, $showmessage = 1) {
    ......    
}

/**
 * 用户操作日志
 * @param int $uid 用户ID
 * @param string $action 操作类型 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=允许但不解析
 * @param $message 待处理的文字内容
 * @return 0=禁止 1=允许但审核 2=允许但不解析
 */
function checkurl($allowposturl, &$message) {
    ......    
}

/**
 * 更新页面和模块的关系
 * @param string $targettplname 页面名称
 * @param array $blocks 模块IDS
 */
function update_template_block($targettplname, $blocks) {
    ......    
}

/**
 * 获取批定类型的关联连接
 *
 * @param string $extent 内容所需关联链接范围 article, forum, group, blog
 * @return string 有效的关联链接
 */
function getrelatedlink($extent) {
    ......    
}

/**
 * 判断 Connect 链接参数有效性
 * @global  $_G
 * @param array $params 参数数组
 * @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 string $access_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 array $data 可替换数据
 * @return array('seotitle', 'seodescription', 'seokeywords')
 */
function get_seosetting($page, $data = array(), $defset = array()) {
    ......    
}

/**
 * 需处理连续分隔符的str_replace()
 * @param array $searchs 被替换的数组
 * @param array $replaces 用于替换的数组
 * @param string $str 目标字符串
 */
function strreplace_strip_split($searchs, $replaces, $str) {
    ......    
}

/**
 * 返回带第几页的title
 * @global  $_G
 * @param string $navtitle 源标题
 * @param int $page 页码
 * @return string
 */
function get_title_page($navtitle, $page){
	if($page > 1) {
    ......    
}

/**
 *
 * 生成缩略图文件名
 * @param String $fileStr: 原文件名,允许附带路径
 * @param String $extend: 新文件名后缀
 * @param Boolean $holdOldExt: 是否保留原扩展名
 * @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 使用,可以写个简单程序去看效果,比如:

运行后,可以看到是象JAVA一样,用堆栈的方式去输出错误的相关部分的。

4 分析xdbebug下面的输出文件
因为这个目录下的文件比较难理解,因此可以下载工具来分析之,比如:
KCacheGrind(适用于Linux)、WinCacheGrind(适用于Windows)和Webgrind(Web页面方式)。
我用的是WinCacheGrind(http://sourceforge.net/projects/wincachegrind)
之后就可以打开输出文件来去看了。

5 xdebug的一些配置
xdebug.default_enable
类型:布尔型 默认值:On
如果这项设置为On,堆栈跟踪将被默认的显示在错误事件中。你可以通过在代码中使用xdebug_disable()来禁止堆叠跟踪的显示。因为这是xdebug基本功能之一,将这项参数设置为On是比较明智的。

xdebug.max_nesting_level
类型:整型 默认值:100
The value of this setting is the maximum level of nested functions that are allowed before the script will be aborted.
限制无限递归的访问深度。这项参数设置的值是脚本失败前所允许的嵌套程序的最大访问深度。

xdebug.dump_globals
类型:布尔型 默认值:1
限制是否显示被xdebug.dump.*设置定义的超全局变量的值
例如,xdebug.dump.SERVER = REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT 将打印 PHP 超全局变量 $_SERVER[‘REQUEST_METHOD’]、$_SERVER[‘REQUEST_URI’] 和 $_SERVER[‘HTTP_USER_AGENT’]。

xdebug.dump_once
类型:布尔型 默认值:1
限制是否超全局变量的值应该转储在所有出错环境(设置为Off时)或仅仅在开始的地方(设置为On时)

xdebug.dump_undefined
类型:布尔型 默认值:0
如果你想从超全局变量中转储未定义的值,你应该把这个参数设置成On,否则就设置成Off

xdebug.show_exception_trace
类型:整型 默认值:0
当这个参数被设置为1时,即使捕捉到异常,xdebug仍将强制执行异常跟踪当一个异常出现时。

xdebug.show_local_vars
类型:整型 默认值:0
当这个参数被设置为不等于0时,xdebug在错环境中所产生的堆栈转储还将显示所有局部变量,包括尚未初始化的变量在最上面。要注意的是这将产生大量的信息,也因此默认情况下是关闭的。

xdebug.profiler_append
类型:整型 默认值:0
当这个参数被设置为1时,文件将不会被追加当一个新的需求到一个相同的文件时(依靠xdebug.profiler_output_name的设置)。相反的设置的话,文件将被附加成一个新文件。

xdebug.profiler_enable
类型:整型 默认值:0
开放xdebug文件的权限,就是在文件输出目录中创建文件。那些文件可以通过KCacheGrind来阅读来展现你的数据。这个设置不能通过在你的脚本中调用ini_set()来设置。

xdebug.profiler_output_dir
类型:字符串 默认值:/tmp
这个文件是profiler文件输出写入的,确信PHP用户对这个目录有写入的权限。这个设置不能通过在你的脚本中调用ini_set()来设置。

xdebug.profiler_output_name
类型:字符串 默认值:cachegrind.out%p
这个设置决定了转储跟踪写入的文件的名称。

远程Debug
相关参数设置
xdebug.remote_autostart
类型:布尔型 默认值:0
一般来说,你需要使用明确的HTTP GET/POST变量来开启远程debug。而当这个参数设置为On,xdebug将经常试图去开启一个远程debug session并试图去连接客户端,即使GET/POST/COOKIE变量不是当前的。

xdebug.remote_enable
类型:布尔型 默认值:0
这个开关控制xdebug是否应该试着去连接一个按照xdebug.remote_host和xdebug.remote_port来设置监听主机和端口的debug客户端。

xdebug.remote_host
类型:字符串 默认值:localhost
选择debug客户端正在运行的主机,你不仅可以使用主机名还可以使用IP地址

xdebug.remote_port
类型:整型 默认值:9000
这个端口是xdebug试着去连接远程主机的。9000是一般客户端和被绑定的debug客户端默认的端口。许多客户端都使用这个端口数字,最好不要去修改这个设置。

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”,搜索结果: 

复制代码代码如下:
# 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缓存等)

工具/原料

  • memcached.exe

  • php_memcache.dll

方法/步骤

  1. 弄清静态缓存和动态缓存的用途:

    静态缓存:生成静态页面——缓存的是整个页面;

    动态缓存:仅对数据库中的数据进行了缓存,即“通过动态缓存,不需要再读取数据库了,直接通过缓存文件来调取相应数据”;

  2. 第二步:静态缓存的实现,在config.php文件中作如下配置:

    ThinkPHP实现静态缓存和动态缓存
  3. 动态缓存的实现方式“文件缓存”(默认方式):

    ThinkPHP的S()函数将“从数据库中获得的数据”缓存到“文件”中;

    //S(‘缓存名称’,’缓存数据’,’缓存时间’)—缓存文件默认保存到“Runtime/Temp/”文件夹

    存数据:S(‘index_list’,$list,10); //$list:是从数据库中读取的数据

    读数据:S(‘index_list’); //直接从缓存文件读取,不再经过数据库

  4. 动态缓存的实现方式“memecache缓存”,需先安装Memcached

  5. 再开启memecache缓存,在config.php中作如下配置

    ThinkPHP实现静态缓存和动态缓存
  6. 6

    其次通过S()函数实现“memecache缓存”:

     

    ThinkPHP的S()函数将“从数据库中获得的数据”缓存到“内存”中;

    存数据:S(‘index_list’,$list,10);

    读数据:S(‘index_list’)

  7. 7

    至此,你可以利用ThinkPHP实现静态缓存和动态缓存了

    END

注意事项

  • 安装Memcached时,需下载正确版本的php_memcache.dll文件

    http://jingyan.baidu.com/article/93f9803fea7cf4e0e46f55ad.html

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文件上传到服务器上。