ModernPHP读书笔记(三)——PHP的良好实践

ModernPHP读书笔记(三)——PHP的良好实践

(原创内容,转载请注明来源,谢谢)

一、密码

1、密码不宜用明文存储,也不能用可以解密的方式进行存储;找回密码功能,给用户发送的邮件也应是发送令牌至邮箱,不应直接把原密码发送过去。

2、PHP5.5.0有原生的密码哈希API,可以对密码加密、解密、重加密。

加密方式:password_hash($password,PASSWORD_DEFAULT, $cost),第一个参数是原密码,第二个参数是加密方式,默认使用bcrypt,第三个参数是bcrypt的加密长度。

注:根据密码学的专家研究,发现bcrypt加密较为安全,当计算机硬件处理速度加快时,只需要提高cost的值即可保证安全。但是该加密方式加密速度较慢,其他加密方式还有md5、SHA1等。

验证密码方式:password_verify($password,$passwordHash),第一个参数为输入的密码,第二个参数为password_hash的加密结果。

重新加密方式:password_needs_refresh()

3、在PHP5.5.0版本之前,可以用ircmaxell/password_compat组件,该组件实现了上述三个函数,功能完全一样。

二、日期与时间

1、php.ini文件内可以设置默认时区,字段date.timezone = ‘Asia/Shanghai’

2、DateTime类

该类可以生成时间的实例,如$datetime= new DateTime()

3、DateInterval类

该类用于生成一段的时间示例,用于配合DateTime类的add、sub方法。

例:$datetime =new DateTime(‘2017-07-12 08:00:00’);

$interval= new DateInterval(‘P1Y’);

$datetime->add($interval);//实现加一年的功能

用法总结:构造DateInterval实例时,传入一个字符串参数,P开头,加上数组,再加上特殊字符。特殊字符包括YMDWHIS,分别表示年月日周时分秒。

4、DateTimeZone类

用于设置DateTime实例的时区。

例:$datetime =new DateTime(‘2017-07-12 08:00:00’);

$datetime->setTimeZone(newDateTimeZone(‘Asia/Shanghai’));

5、DatePeriod类

配合DateTime以及DateInterval类的实例,生成从DateTime开始时间,经过若干DateInterval,到一个指定的结束时间的实例。

三、数据库

1、数据库的配置文件不宜放置在项目中,如host、用户名、密码之类,如果放在项目中不慎被用户看到,可能造成严重后果。最好在项目根目录之外,写好一个配置文件,再用项目去include。

2、采用PDO的方式使用数据库,可以比较用到其占位符功能,比较安全。

例:

include(‘../sql_setting.php’);//根目录之外的配置文件,配置用户名密码等值
//第一步,用PDO连接数据库,其中的各关键信息,都存于sql_setting.php文件中,文件定义$sets = array(‘host’=>xxx,’dbname’=>xxx……)
         $pdo= new PDO(
sprint(‘mysql:host=%s;dbname=%s;port=%s;charset=%s;’,
 $sets[‘host’],$sets[‘dbname’],$sets[‘port’],$sets[‘charset’]),
$sets[‘user’],$sets[‘pwd’]
);
//第二步,构造查询,需要查询的关键内容用冒号加一个词语引入
$sql = ‘ selectname from db_users where email = :email ’;
$result =$pdo->prepare($sql);
//第三步,词语过滤与绑定
$email =filter_input($_POST[‘email’], ‘email’);
$result->bindValue(‘:email’,$email);
//第四步,执行查询
$result->execute();

3、获取查询结果共有4种方式。

1)fetch:获取下一行的内容,结果以“列名-列值”的数组键值对形式存储。该方式逐行获取查询结果,可以节约内存。

例:接上述代码

whild($sqlResult= $result->fetch())

2)fetch_all:该方式一次性获取全部结果,存储方式fetch,在结果集比较小的时候可以用,但是结果较多不建议使用。

3)fetch_column:获取指定列的结果,0为第一列。

4)fetch_object:把结果获取成类的形式。

四、多字节字符串

1、如中文等文字,都是多字节字符串,与默认的英文用8位字符存储方式不等。因此,用常用的字符串处理函数(如strlen()等函数)进行处理时,会得到错误的结果。

2、为了解决上述问题,PHP的mbstring扩展支持多字符处理,mb_strxxx可以代替原来的str开头的函数,如mb_strlen用于计算字符串长度等。

3、字符串转码函数

mb_convert_encoding(),在出现乱码时使用此将UTF-8和gbk互相进行转换可以解决问题。

五、流

1、流封装协议

流相当于一个管道,实现两头的通讯,如服务器之间、文件之间等。使用的函数包括fopen、fwrite、fgets、file_get_contents等。

协议采用“协议名://协议内容与路径”的方式。PHP默认的协议是file://,因此通常用fopen打开文件时,只需要写fopen(‘路径’),不用加上file://。但是如果用到http、php等其他协议,就需要加。

2、流上下文

file_get_contents函数是用于获取网页的内容,但是可以通过使用函数stream_context

_create,实现file_get_contents发送post请求。

例:

         //第一步:构造json
         $request= ‘{“username”:”lin”}’;
         //第二步:拼接请求字段
         $context= stream_context_create(
                   array(
         ‘http’ => array(
         ‘method’ => ‘POST’,
                                     ‘header’=> ‘context-Type:application/json;charset=utf-8;\r\n0\’.
                                                          ‘context-length’.mb_strlen($request),
                                     ‘content’=> $request
)
)
);
//第三步:发送POST请求
$response =file_get_contents($url, false, $context);//url为自定义要发送请求的路径

3、流过滤器

使用stream_filter_append()函数,可以在文件打开后加以过滤。

4、自定义过滤器

需要扩展PHP的php_user_filter类,并且要实现filter、onCreate、onCLose方法,在通过stream_filter_register函数进行注册。

——written by linhxx 2017.07.12

相关阅读:

PHP实用功能——modern PHP读书笔记(一)

ModernPHP读书笔记(二) ——PHP开发标准

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-07-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏有趣的Python

Python文件处理 - 专题笔记文件简介文件基础操作文件属性及OS模块使用文件练习

任何语言都离不开对文件的操作,Python语言是如何来操作和管理文件的。掌握文件的基本概念、基本操作,了解文件属性、 linux 系统的文件管理机制及os模块对...

3706
来自专栏专注 Java 基础分享

Struts2框架的基本使用

     前面已经介绍过了MVC思想,Struts2是一个优秀的MVC框架,大大降低了各个层之间的耦合度,具有很好的扩展性。从本篇开始我们学习Struts2的基...

2067
来自专栏FreeBuf

如何进行Linux平台共享库替换

*本文原创作者:gaearrow,本文属FreeBuf原创奖励计划,未经许可禁止转载 。 共享库基础知识 程序由源代码变成可执行文件,一般可以分解为四个步骤...

2668
来自专栏FreeBuf

一次安全测试引发的对Django框架文件上传安全机制的初步分析

我司的堡垒机是基于jumpserver 0.3版本进行二次开发,进行了大量的重构和新功能的添加,基本满足了公司安全运维的需求。在对文件上传接口进行安全审计的时候...

1062
来自专栏大内老A

ASP.NET Core真实管道详解[2]:Server是如何完成针对请求的监听、接收与响应的【上】

Server是ASP .NET Core管道的第一个节点,负责完整请求的监听和接收,最终对请求的响应同样也由它完成。Server是我们对所有实现了IServer...

3405
来自专栏Golang语言社区

package exec

exec包执行外部命令。它包装了os.StartProcess函数以便更容易的修正输入和输出,使用管道连接I/O,以及作其它的一些调整。

894
来自专栏沈唁志

在Linux中vim的用法

2012
来自专栏黑泽君的专栏

day25_Struts2学习笔记_01

  把重复性的繁琐的代码封装起来。使程序员在编码中把更多的精力放业务需求的分析和理解上面。 特点:封装了很多细节,程序员在使用的时候会非常简单。

1151
来自专栏Java帮帮-微信公众号-技术文章全总结

Java开发必会框架Struts2第一天

一、框架概述 1、框架的意义与作用: 所谓框架,就是把一些繁琐的重复性代码封装起来,使程序员在编码中把更多的经历放到业务需求的分析和理解上面。 特点:封装了很多...

3608
来自专栏Danny的专栏

ASP.NET中利用Application和Session统计在线人数、历史访问量

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

2213

扫码关注云+社区