获得客户端真实ip

$ip=FALSE;

    //客户端IP 或 NONE

    if(!empty($_SERVER["HTTP_CLIENT_IP"])){

        $ip = $_SERVER["HTTP_CLIENT_IP"];

    }

    //多重代理服务器下的客户端真实IP地址(可能伪造),如果没有使用代理,此字段为空

    if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {

        $ips = explode (", ", $_SERVER['HTTP_X_FORWARDED_FOR']);

        if ($ip) { array_unshift($ips, $ip); $ip = FALSE; }

        for ($i = 0; $i < count($ips); $i++) {

            if (!eregi ("^(10│172.16│192.168).", $ips[$i])) {

                $ip = $ips[$i];

                break;

            }

        }

    }

    //客户端IP 或 (最后一个)代理服务器 IP

    return ($ip ? $ip : $_SERVER['REMOTE_ADDR']);

PHP获取客户端真实IP地址的方法 https://www.php.cn/php-weizijiaocheng-406174.html

thinkphp5随机抽取数据的方法

/**
 * 随机获取数据
 * @param string $num  抽取条数
 * @param string $table    表名
 * @param string $where    查询条件
 * @return array 
 */
function tt_random_data($num,$table,$where=[])
{
    $pk = Db::name($table)->getPK();//获取主键
    $countcus = Db::name($table)->where($where)->field($pk)->select();//查询数据
    $con = '';
    $qu = '';
    foreach($countcus as $v=>$val){
        $con.= $val[$pk].'|';
    }
    $array = explode("|",$con);
    $countnum = count($array)-1;
    for($i = 0;$i <= $num;$i++){
        $sunum = mt_rand(0,$countnum);
        $qu.= $array[$sunum].',';
    }
    $list = Db::name($table)->where($pk,'in',$qu)->limit(0,$num)->select();
    return $list;
}

亲测有效。

serialize和unserialize函数 与base64_encode和base64_decode

序列化是将变量转换为可保存或传输的字符串的过程;反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。
1. serialize和unserialize函数
这两个是序列化和反序列化PHP中数据的常用函数。

复制代码
<?php
$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut'); 
//序列化数组
$s = serialize($a);
echo $s;
//输出结果:a:3:{s:1:"a";s:5:"Apple";s:1:"b";s:6:"banana";s:1:"c";s:7:"Coconut";}
echo '<br /><br />';
//反序列化
$o = unserialize($s);
print_r($o);
//输出结果 Array ( [a] => Apple [b] => banana [c] => Coconut ) 
?>
复制代码

 

当数组值包含如双引号、单引号或冒号等字符时,它们被反序列化后,可能会出现问题。为了克服这个问题,一个巧妙的技巧是使用base64_encode和base64_decode。

$obj = array();
//序列化
$s = base64_encode(serialize($obj)); 
//反序列化
$original = unserialize(base64_decode($s));

 

但是base64编码将增加字符串的长度。为了克服这个问题,可以和gzcompress一起使用。

复制代码
//定义一个用来序列化对象的函数
function my_serialize( $obj ) 
{ 
   return base64_encode(gzcompress(serialize($obj))); 
} 
//反序列化
function my_unserialize($txt) 
{ 
   return unserialize(gzuncompress(base64_decode($txt))); 
}

php 匹配指定开头和结尾的中间内容-非常实用

正则:$pattern = ‘/开头内容([\s\S]*)结尾内容/’;

$str=”所在地区: 瓯海区 样本区域: 白象住宅区 房屋坐落: 瓯海区南白象街道天钜澜庭7幢2304室 户室号: 2304 总建筑面积: 105.61㎡ 套内面积: 82.09㎡ 分摊面积: 23.52㎡ 类别: 住宅 设计用途: 住宅 建筑结构: 钢混 一房一价: 元 所属项目: 瓯房售许字(2020)第002号 房开公司: 温州龙悦房地产开发有限公司 户室状态: 正常发售 注意事项:”;

preg_match_all(‘/房屋坐落:([\s\S]*)户室号/’, $str, $matched);

$zuoluo=trim($matched[1][0]);//瓯海区南白象街道天钜澜庭7幢2304室

 

tp5中,如何实现js 等特殊字符自动html实体化。

一、application/config.php中设置如下

// 默认全局过滤方法 用逗号分隔多个
‘default_filter’ => ‘trim,htmlspecialchars’,

二、KindEditor中,不要做任何特殊处理!!切忌。

<textarea name="content" class="input" style="height:450px; border:1px solid #ddd;">{$arr.content}</textarea>

三、非textarea或者 input显示中。记得htmlspecialchars_decode哦。

<?php echo htmlspecialchars_decode($con);?>

四、非textarea涉及到去除html标签,截取的,请按如下格式(其中 deleteHtmlTags为定义的去html标签函数)。

<?php 
                $con=pagecontent(1)['content'];
                echo deleteHtmlTags(htmlspecialchars_decode($con));?>

 

PHP数据类型转换, 保留小数

PHP数据类型转换, 保留小数

PHP的数据类型转换属于强制转换,允许转换的PHP数据类型有:

  • (int)、(integer):转换成整形
  • (float)、(double)、(real):转换成浮点型
  • (string):转换成字符串
  • (bool)、(boolean):转换成布尔类型
  • (array):转换成数组
  • (object):转换成对象

PHP数据类型有三种转换方式:

  • 在要转换的变量之前加上用括号括起来的目标类型
  • 使用3个具体类型的转换函数,intval()、floatval()、strval()
  • 使用通用类型转换函数settype(mixed var,string type)

第一种转换方式: (int)  (bool)  (float)  (string)  (array) (object)

<?php   
$num1=3.14;   
$num2=(int)$num1;   
var_dump($num1); //输出float(3.14)   
var_dump($num2); //输出int(3)   
?>

第二种转换方式:  intval()  floatval()  strval()

<?php   
    $str="123.9abc";   
    $int=intval($str);     //转换后数值:123   
    $float=floatval($str); //转换后数值:123.9   
    $str=strval($float);   //转换后字符串:"123.9"    
?>

第三种转换方式:  settype()

<?php   
    $num4=12.8;   
    $flg=settype($num4,"int");   
    var_dump($flg);  //输出bool(true)   
    var_dump($num4); //输出int(12)   
?>

php保留两位小数并且四舍五入

$num = 123213.666666; 
echo sprintf("%.2f", $num);

php保留两位小数并且不四舍五入

$num = 123213.666666; 
echo sprintf("%.2f",substr(sprintf("%.3f", $num), 0, -2));

php进一法取整

echo ceil(4.3); // 5 
echo ceil(9.999); // 10

php舍去法,取整数

echo floor(4.3); // 4 
echo floor(9.999); // 9

微信支付,公众号商城支付的3个坑!!!!!!

坑1:返回msg显示签名错误 , 第一反应官网提供的路径去生成了一下签名做比较 , 结果发现签名算法是没错的。

解决方法:重置商户API密钥。(本人亲测是这样解决了问题,tx真是个坑,我严重鄙视。)

坑2:官方sdk(php版本) WxPay.JsApiPay.php文件中 public function GetOpenid(){ }  方法中,大约第50行左右。

//触发微信返回code码
$baseUrl = urlencode(‘http://’.$_SERVER[‘HTTP_HOST’].$_SERVER[‘REQUEST_URI’].$_SERVER[‘QUERY_STRING’]);

这句对$baseUrl 的定义是有问题的!严重鄙视!!!

解决方法是修改:

$baseUrl = urlencode(‘换成你商户号申请微信支付的安全url目录’);

坑3:参考官方demo   jsapi.php 文件 代码使用中,你会发现 订单号,金额只能写死,无法把参数传递过去[get,post都无效]。这是因为:  $tools = new \JsApiPay(); $openId =$tools->GetOpenid(); 在获取openid的时候,页面来回跳转所致。

解决方法是:用session传递 1、session记录金额,订单号等信息;2、session记录openid [切忌,否则 1 依然无效]。

tips:没有看到官方对此有说明,所以总结了如上3个问题,希望有助大家解决问题。

原创作者:徐多蔚,转发请注明来源,谢谢。