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 条评论
登录 后参与评论

相关文章

来自专栏Linux驱动

Linux-man命令(17)

man命令是Linux下的帮助指令,通过man指令可以查看Linux中的指令帮助、配置文件帮助和编程帮助等信息 可以按章节来搜索内容: man 1: 用户命令(...

1887
来自专栏IT可乐

Linux系列教程(六)——Linux常用命令之文件搜索命令

  前一篇博客我们讲解了Linux链接命令和权限管理命令, 通过 ln -s  链接名 表示创建软链接,不加-s表示创建硬链接;还有三个更改权限的命令,chmo...

1785
来自专栏Java开发者杂谈

Eclipse中Program arguments和VM arguments的说明

在运行程序的时候,我们一般可以进行run configuration的配置,就比如tomcat源码导入eclipse之后,我们可以发现其运行配置如下: ? 其中...

2626
来自专栏散尽浮华

nginx域名访问的白名单配置梳理

在日常运维工作中,会碰到这样的需求:设置网站访问只对某些ip开放,其他ip的客户端都不能访问。可以通过下面四种方法来达到这种效果: 1)针对nginx域名配置所...

53510
来自专栏有趣的Python

最新Django2.0.1在线教育零基础到上线教程(六)-11-12

演示地址: http://mxonline.mtianyan.cn 教程仓库地址1: https://github.com/mtianyan/DjangoGe...

26711
来自专栏菩提树下的杨过

bash/shell编程学习(3)

接上节继续, 1. 从键盘读取输入内容 #!/bin/bash read -p 'please input something:' input echo 'yo...

17510
来自专栏Laoqi's Linux运维专列

shell命令基本知识点

命令历史 # cat /root/.bash_history       //存放历史命令的地方 # history      //查看命令历史的条数 # ec...

3438
来自专栏landv

CMD批处理——forfiles命令使用,自动删除过期备份文件

1261
来自专栏有趣的Python和你

用python偷懒Arcgis(地类编码转地类名称)excel数据python代码arcgis操作

703
来自专栏C/C++基础

Linux文件的软链接和硬链接

Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln命令产生硬链接。

510

扫描关注云+社区