php开发时容易忘记的一些技术细节


Posted in PHP onFebruary 03, 2016

在做开发的时候,有可能会忘记掉一些技术细节。这些细节有可能会造成很严重的后果,比如网站被注入、网站崩溃等等。现在我们总结一下,有可能会遇到的一些 PHP 中的一些 “陷阱”。

陷阱一:empty()

<?php
//以下代码会直接导致PHP解析错误
$arr1 = [1, 2, 3];
$arr2 = [3, 4];
if(empty(array_diff($arr1, $arr2))) { //解析错误
  echo 'empty';
} else {
  echo 'not empty';
}

最新的官网手册对此有特别说明:

Note:

在 PHP 5.5 之前,empty() 仅支持变量;任何其他东西将会导致一个解析错误。

换言之,下列代码不会生效: empty(trim($name))。 作为替代,应该使用trim($name) == false.
我最近一次遇到该错误,是使用 Phalcon 开发的时候,服务器一直报 503 错误,刚开始会觉得莫名其妙,通过逐行排除,才发生由于 empty 的错误用法导致的。当然,自从 PHP 5.5 开始,empty 已经支持这种写法了。

陷阱二:in_array()

<?php
//判断数组里是否存在用户所提交的用户 ID
//$post_dirty_id = '1092';
$post_dirty_id = '1092 ORDER BY #1';
$safe_arr = [
  987 => '小明',
  1092 => '汤姆',
  1256 => '奥立升'
];
if(in_array($post_dirty_id, array_keys($safe_arr))) {
  echo 'find me';
} else {
  echo 'do not find me';
}
//输出结果:find me,此结果明显错误

我发现这个问题,是因为网站被 SQL 注入了,还好,那么时候在测试的时候发现的,没有造成严重的后果。

关于 in_array() 函数使用,还有其他值得我们注意的地方,PHP 手册中,有大量的网友提供的示例,来说明该函数的“怪异”行为,比如:

<?php
 $a = ['a', 32, true, 'x' => 'y'];
 var_dump(in_array(25, $a)); // true, one would expect false
 var_dump(in_array('ggg', $a)); // true, one would expect false
 var_dump(in_array(0, $a)); // true
 var_dump(in_array(null, $a)); // false

为了安全起见,建议可以采用下面这种方式进行判断:

<?php
//判断数组里是否存在用户提交的 ID
//$post_dirty_id = '1092';
$post_dirty_id = '1092 ORDER BY #1';
$safe_arr = [
  987 => '小明',
  1092 => '汤姆',
  1256 => '奥立升'
];
if(isset($safe_arr[$post_dirty_id])) {
  echo 'find me';
} else {
  echo 'do not find me';
}
//输出结果:do not find me,这是正确的结果
PHP 相关文章推荐
用PHPdig打造属于你自己的Google[图文教程]
Feb 14 PHP
在mysql数据库原有字段后增加新内容
Nov 26 PHP
PHP 删除一个目录及目录下的所有文件的函数代码
May 26 PHP
深入phpMyAdmin的安装与配置的详细步骤
May 07 PHP
json的键名为数字时的调用方式(示例代码)
Nov 15 PHP
php判断页面是否是微信打开的示例(微信打开网页)
Apr 25 PHP
php实现数组按指定KEY排序的方法
Mar 30 PHP
使用XHGui来测试PHP性能的教程
Jul 03 PHP
Laravel 5.3 学习笔记之 配置
Aug 28 PHP
php7 安装yar 生成docker镜像
May 09 PHP
PHP-FPM 的管理和配置详解
Feb 17 PHP
php实现获取近几日、月时间示例
Jul 06 PHP
PHP简单处理表单输入的特殊字符的方法
Feb 03 #PHP
PHP实现的构造sql语句类实例
Feb 03 #PHP
PHP快速生成各种信息提示框的方法
Feb 03 #PHP
PHP实现原比例生成缩略图的方法
Feb 03 #PHP
PHP获取昨天、今天及明天日期的方法
Feb 03 #PHP
PHP实现长文章分页实例代码(附源码)
Feb 03 #PHP
PHP开发中常用的十个代码样例
Feb 02 #PHP
You might like
MySql 按时间段查询数据方法(实例说明)
2008/11/02 PHP
PHP中几种常见的超时处理全面总结
2012/09/11 PHP
php获取图片信息的方法详解
2015/12/10 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
2017/09/22 PHP
Laravel5.1 框架响应基本用法实例分析
2020/01/04 PHP
javascript 表格排序和表头浮动效果(扩展SortTable)
2009/04/07 Javascript
基于jQuery的前端数据通用验证库
2011/08/08 Javascript
jQuery把表单元素变为json对象
2013/11/06 Javascript
js判读浏览器是否支持html5的canvas的代码
2013/11/18 Javascript
解决checkbox的attr(checked)一直为undefined问题
2014/06/16 Javascript
jquery获取当前日期的方法
2015/01/14 Javascript
基于jQuery.Hz2Py.js插件实现的汉字转拼音特效
2015/05/07 Javascript
学习javascript面向对象 实例讲解面向对象选项卡
2016/01/04 Javascript
原生javascript实现自动更新的时间日期
2016/02/12 Javascript
js实现String.Fomat的实例代码
2016/09/02 Javascript
jQuery插件zTree实现获取一级节点数据的方法
2017/03/08 Javascript
令按钮悬浮在(手机)页面底部的实现方法
2017/05/02 Javascript
vue的style绑定background-image的方式和其他变量数据的区别详解
2018/09/03 Javascript
解决iview多表头动态更改列元素发生的错误的方法
2018/11/02 Javascript
vue实现随机验证码功能的实例代码
2019/04/30 Javascript
少女风vue组件库的制作全过程
2019/05/15 Javascript
Weex开发之WEEX-EROS开发踩坑(小结)
2019/10/16 Javascript
[02:52]DOTA2新手基础教程 米波
2014/01/21 DOTA
Python入门篇之条件、循环
2014/10/17 Python
python实现画一颗树和一片森林
2018/06/25 Python
python提取具有某种特定字符串的行数据方法
2018/12/11 Python
Django异步任务之Celery的基本使用
2019/03/23 Python
Python应用自动化部署工具Fabric原理及使用解析
2020/11/30 Python
Selenium关闭INFO:CONSOLE提示的解决
2020/12/07 Python
日本快乐生活方式购物网站:Shop Japan
2018/07/17 全球购物
留学生如何写好自荐信
2013/12/27 职场文书
餐饮收银员岗位职责
2014/02/07 职场文书
《第一朵杏花》教学反思
2014/04/16 职场文书
党员干部观看《周恩来四个昼夜》思想汇报
2014/09/10 职场文书
2019年XX公司的晨会制度及流程!
2019/07/23 职场文书
实例详解Python的进程,线程和协程
2022/03/13 Python