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 相关文章推荐
php smarty模版引擎中变量操作符及使用方法
Dec 11 PHP
利用PHP实现智能文件类型检测的实现代码
Aug 02 PHP
php 操作符与控制结构
Mar 07 PHP
PHP文件大小格式化函数合集
Mar 10 PHP
PHP实现的下载远程图片自定义函数分享
Jan 28 PHP
Mac环境下php操作mysql数据库的方法分享
May 11 PHP
PHP ajax 异步执行不等待执行结果的处理方法
May 27 PHP
PHP微信开发之微信录音临时转永久存储
Jan 26 PHP
PHP实现动态获取函数参数的方法示例
Apr 02 PHP
PHP获取当前系统时间的方法小结
Oct 03 PHP
PHP实现的敏感词过滤方法示例
Mar 06 PHP
浅谈Laravel中的三种中间件的作用
Oct 13 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
PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
2019/05/21 PHP
laravel5.2表单验证,并显示错误信息的实例
2019/09/29 PHP
JQUERY THICKBOX弹出层插件
2008/08/30 Javascript
3种不同方式的焦点图轮播特效分享
2013/10/30 Javascript
js数组去重的方法汇总
2015/07/29 Javascript
Javascript实现快速排序(Quicksort)的算法详解
2015/09/06 Javascript
JavaScript 封装一个tab效果源码分享
2015/09/15 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单的实现代码
2016/06/23 Javascript
第一次接触神奇的Bootstrap表单
2016/07/27 Javascript
jQuery使用serialize()表单序列化时出现中文乱码问题的解决办法
2016/07/27 Javascript
使用bootstrap validator的remote验证代码经验分享(推荐)
2016/09/21 Javascript
js仿网易表单及时验证功能
2017/03/07 Javascript
vue 纯js监听滚动条到底部的实例讲解
2018/09/03 Javascript
vuex页面刷新后数据丢失的方法
2019/01/17 Javascript
微信小程序实现图片翻转效果的实例代码
2019/09/20 Javascript
vue-cli3 取消eslint校验代码的解决办法
2020/01/16 Javascript
vue实现页面切换滑动效果
2020/06/29 Javascript
JavaScript实现点击图片换背景
2020/11/20 Javascript
在vue中使用inheritAttrs实现组件的扩展性介绍
2020/12/07 Vue.js
[02:41]DOTA2英雄基础教程 亚巴顿
2014/01/02 DOTA
[01:25]2014DOTA2国际邀请赛 zhou分析LGD比赛情况
2014/07/14 DOTA
[03:11]不朽宝藏三外观展示
2020/09/18 DOTA
在Python中使用CasperJS获取JS渲染生成的HTML内容的教程
2015/04/09 Python
Python实现针对给定字符串寻找最长非重复子串的方法
2018/04/21 Python
Python操作Sonqube API获取检测结果并打印过程解析
2019/11/27 Python
pytorch nn.Conv2d()中的padding以及输出大小方式
2020/01/10 Python
python脚本监控logstash进程并邮件告警实例
2020/04/28 Python
python实现发送带附件的邮件代码分享
2020/09/22 Python
快时尚眼镜品牌,全国连锁眼镜店:LOHO眼镜生活
2018/10/08 全球购物
解释下面关于J2EE的名词
2013/11/15 面试题
学生手册评语
2014/05/05 职场文书
党员反对四风问题思想汇报
2014/09/12 职场文书
会议接待欢迎标语
2014/10/08 职场文书
文明单位创建材料
2014/12/24 职场文书
2015年母亲节活动策划方案
2015/05/04 职场文书
python设置 matplotlib 正确显示中文的四种方式
2021/05/10 Python