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

关注公众号,了解更多it技术(it问答网

微信支付,公众号商城支付的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个问题,希望有助大家解决问题。

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

 

 


关注公众号,了解更多it技术(it问答网

详谈php分布式部署

本文我们接着和大家分享php分布式部署,希望大家对php分布式部署有一个更清晰的思路。

普通的Web开发,常用的模式就是用户登录之后,登录状态信息保存在Session中,用户一些常用的热数据保存在文件缓存中,用户上传的附件信息保存在Web服务器的某个目录上。这种方式对于一般的Web应用,使用很方便,完全能够胜任。但是对于高并发的企业级网站,就应付不了了。需要采用Web集群实现负载均衡。

使用Web集群方式部署之后,首要调整的就是用户状态信息与附件信息。用户状态不能再保存到Session中,缓存也不能用本地Web服务器的文件缓存,以及附件,也不能保存在Web服务器上了。因为要保证集群里面的各个Web服务器,状态完全一致。因此,需要将用户状态、缓存等保存到专用的缓存服务器,比如Memcache。附件需要保存到云存储中,比如七牛云存储、阿里云存储、腾讯云存储等。

本文以ThinkPHP开发框架为例,说明如何设置,能够将Session、缓存等保存到Memcache缓存服务器上。

下载缓存的Memcache处理类,放到Thinkphp\Extend\Driver\Cache目录中;下载Session的Memcache处理类,放到Thinkphp\Extend\Driver\Session目录中,如下图所示:

修改配置文件,调整Session与缓存,都记录到Memcache服务器上。打开ThinkPHP\Conf\convention.PHP,增加配置项:

[php] view plain copy


/* Memcache缓存设置 */

'MEMCACHE_HOST' => '192.168.202.20',

'MEMCACHE_PORT' => 11211,

 

修改数据缓存为Memcache:

'DATA_CACHE_TYPE' => 'Memcache',

  修改Session为Memcache:
修改Session为Memcache:
'SESSION_TYPE' => 'Memcache',

因为云存储各类比较多,附件存储到云存储上,就不再赘述,参数各云存储提供的sdk即可。经过以上修改,就可以将Web服务器进行分布式部署了。

参考来源:https://www.php.cn/php-weizijiaocheng-385659.html


关注公众号,了解更多it技术(it问答网

谈memcache和memcached的区别

立场一:

他们是两个不同版本的php的memcached的客户端
new memcache是pecl扩展库版本
new memcached是libmemcached版本

对于过时的东西,总是会被新东西替代的, 为什么不用新的东西呢?

总结:尽量使用memcached就好。

 

===========================================

立场二:

Memcache与Memcached的区别

Memcache是什么?

Memcache是一个自由和开放源代码、高性能、分配的内存对象缓存系统。用于加速动态web应用程序,减轻数据库负载。

它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached自管理这 些HashTable。

Memcached又是什么?

Memcached是Memcache系统的主程序文件,以守护程序方式运行于一个或多个服务器中,随时接受客 户端的连接操作,使用共享内存存取数据。

那PHP中的Memcache是什么?php中的所讲的memcache是用于连接Memecached的php支持扩展之一(可用phpinfo查看),类似mbstring,eAccelerator。

简单的说

Memcache是总的缓存系统项目名称,容易和PHP中的Memcache混淆。

我们常提到Memcache其实是PHP中的Memcache,即PHP的Memcached扩展支持。

我们常提到Memcached是服务端主程序文件,服务端安装程序。

为了让你的程序飞起来,必须安装memcached服务端程序和PHP的Memcached扩展,所以如果您要使用Memcache来缓存系统,memcache和memcached两样我们都需要安装。


关注公众号,了解更多it技术(it问答网

session跨域,相同服务器,不同域名。session互通调用方案。

同一服务器上有2域名:A、B

A下有c1.php页面。

<?php
	session_start();
	echo session_id();//ei3ddccd7gdjaj5ohq5g7rmvi6
	$_SESSION['cs']=1;
?>

B下有c2.php页面

<?php
	session_id("ei3ddccd7gdjaj5ohq5g7rmvi6");
	session_start();  	
	echo $_SESSION['cs'];
?>

 

提示:ei3ddccd7gdjaj5ohq5g7rmvi6 为A下c1.php的session_id的值。实际应用中可有多种传值方式。

 

tips:

tp5中:跨域,同服务器下,session互通写法,参考如下:

session_id(“ei3ddccd7gdjaj5ohq5g7rmvi6”);
session(“ss”,””);
//echo Session::get(‘username’)

徐多蔚亲测无误!


关注公众号,了解更多it技术(it问答网

tp5获取session id的方式

方法一

先任一设置一个session值,然后获取session id

session(‘g’,”);//执行一次助手函数,session啥都可以,只要执行这个函数即可。
$session_id = session_id();
方法二

在文件\think\Session 中加一个函数

public static function sid(){
if (PHP_SESSION_ACTIVE != session_status()) {
session_start();
}
return session_id();
}

 


关注公众号,了解更多it技术(it问答网

tp5如何调用多个数据库连接?

database.php数据内容里面 最下面追加如下:

//推广产品站数据库设置
	'sqla'=>[
			// 数据库类型
			'type'            => 'mysql',
			// 服务器地址
			'hostname'        => '127.0.0.1',
			// 数据库名
			'database'        => 'cbd2',
			// 用户名
			'username'        => 'root',
			// 密码
			'password'        => 'root',
			// 端口
			'hostport'        => '',
			// 连接dsn
			'dsn'             => '',
			// 数据库连接参数
			'params'          => [],
			// 数据库编码默认采用utf8
			'charset'         => 'utf8',
			// 数据库表前缀
			'prefix'          => 'cbd_',
			// 数据库调试模式
			'debug'           => true,
			// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
			'deploy'          => 0,
			// 数据库读写是否分离 主从式有效
			'rw_separate'     => false,
			// 读写分离后 主服务器数量
			'master_num'      => 1,
			// 指定从服务器序号
			'slave_no'        => '',
			// 是否严格检查字段是否存在
			'fields_strict'   => true,
			// 数据集返回类型
			'resultset_type'  => 'array',
			// 自动写入时间戳字段
			'auto_timestamp'  => false,
			// 时间字段取出后的默认时间格式
			'datetime_format' => 'Y-m-d H:i:s',
			// 是否需要进行SQL性能分析
			'sql_explain'     => false,
	
	]

 

调用方式【实例化链接】:

Db::connect(config(‘database.sqla’))->query();

//跨db的表实例化代替DB::name(‘pages’);
Db::connect(config(‘database.sqla’))->name(“pages”);


关注公众号,了解更多it技术(it问答网

PHP中 final关键字,static关键字,const关键字

PHP中!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

final关键字:
1.final不能用来修饰成员属性
2.final只能修饰类和方法
作用:被修饰的类不能被子类所继承;被修饰的方法不能被子类的方法覆盖。

==================
static关键字:
1.static用来修饰成员属性和成员方法,但不能用来修饰类
2.用static修饰的成员属性可以被同一个类的所有对象共享
3.静态的数据是存在 内存中的 数据段中(初始化静态段)
4.静态的数据是在类在第一次加载时,分配到内存中的
5.什么是类被加载?只要在程序中使用到这个类(有这个类名出现)
6.静态的成员属性都要用类名去访问,不用创建对象,不用对象去访问;在类里边可以用self代表本类。
7.静态方法,不能访问非静态的成员属性
8.如果你确定一个方法中不需使用到非静态的成员属性,则可以将这个方法声明为静态方法,不需实例化
对象,就可以访问。

===========================
const关键字:
1.它只能用来修饰成员属性
2.在类中声明常量必须使用const
3.访问方式和访问静态成员属性一样(类外使用 类名::成员属性,类里边则使用self::成员属性)
4.常量一定要在声明的时候就给初始值


关注公众号,了解更多it技术(it问答网

php rmdir()删除目录的需要注意的几点

php rmdir()函数用于删除目录,但是在使用这个函数删除目录之前,我们必须要做一些判断,首先要判断目录是否为空,其次要判断目录是否存在,具体请看下面描述。

php rmdir()函数用于删除目录,但在使用这个函数时,我们需要注意两点:

  1. 删除的目录必须为空
  2. 目录必须存在

因此,正确使用rmdir()函数删除目录的源代码如下:

检查目录是否为空,如果不为空,删除目录中的文件,如果目录中有子目录,还需要删除子目录。

<?php 
// 说明: 删除非空目录的解决方案

function removeDir($dirName) 
{ 
    if(! is_dir($dirName)) 
    { 
        return false; 
    } 
    $handle = @opendir($dirName); 
    while(($file = @readdir($handle)) !== false) 
    { 
        if($file != '.' && $file != '..') 
        { 
            $dir = $dirName . '/' . $file; 
            is_dir($dir) ? removeDir($dir) : @unlink($dir); 
        } 
    } 
    closedir($handle); 
      
    return rmdir($dirName) ; 
} 
?>

 


关注公众号,了解更多it技术(it问答网

thinkphp5 中 db::query 原生查询如何实现分页?

	$sql="select a.*,b.name from obj_users_admin a left join obj_users_admin_groups b on a.gid=b.id";		

		$b=$num=2;		//每页显示记录数		
		$page=input("get.page")?input("get.page"):1;	//当前页
		$count = Db::execute($sql); //总条数		
		
		$a=($page-1)*$b;
		$sql2=$sql." limit $a,$b";
		$list = Db::query($sql2); //当前页数据
		$arr=Bootstrap::make($list,$num,$page,$count,false,['path'=>Bootstrap::getCurrentPath(),'query'=>request()->param()]);
		
		print_r($arr);
		print_r($arr->render());

徐多蔚亲测无误!

tp5中LEFT分页格式:

	$a=config("database.prefix")."users_admin";
		$b=config("database.prefix")."users_admin_groups";

		$arr=$obj->db->table("$a a")
->join("$b b", "a.gid=b.id", 'LEFT')->where($tj)->field("a.*,b.name")->order("a.updatetime desc,a.id desc")->paginate(2,false, [
                'query' => Request::instance()->param(),//不丢失已存在的url参数
            ]);

 


关注公众号,了解更多it技术(it问答网