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 字符串编码截取函数(兼容utf-8和gb2312)
May 02 PHP
PHP 数组排序方法总结 推荐收藏
Jun 30 PHP
PHP跨时区(UTC时间)应用解决方案
Jan 11 PHP
php检测iis环境是否支持htaccess的方法
Feb 18 PHP
3个PHP多维数组转为一维数组的方法实例
Mar 13 PHP
常见php数据文件缓存类汇总
Dec 05 PHP
php使用Cookie控制访问授权的方法
Jan 21 PHP
php面向对象中static静态属性和静态方法的调用
Feb 08 PHP
php生成唯一数字id的方法汇总
Nov 18 PHP
PHP 中 DOMDocument保存xml时中文出现乱码问题的解决方案
Sep 19 PHP
Laravel Eloquent分表方法并使用模型关联的实现
Nov 25 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
Apr 14 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+ACCESS 文章管理程序代码
2010/06/21 PHP
php mysql 判断update之后是否更新了的方法
2012/01/10 PHP
php查看请求头信息获取远程图片大小的方法分享
2013/12/25 PHP
php的sprintf函数的用法 控制浮点数格式
2014/02/14 PHP
php实现的日历程序
2015/06/18 PHP
重构Javascript代码示例(重构前后对比)
2013/01/23 Javascript
让图片旋转任意角度及JQuery插件使用介绍
2013/03/20 Javascript
如何实现chrome浏览器关闭页面时弹出“确定要离开此面吗?”
2015/03/05 Javascript
vue深入解析之render function code详解
2017/07/18 Javascript
JS传播事件、取消事件默认行为、阻止事件传播详解
2017/08/14 Javascript
Vue网页html转换PDF(最低兼容ie10)的思路详解
2017/08/24 Javascript
Vue中v-show添加表达式的问题(判断是否显示)
2018/03/26 Javascript
vue项目中实现图片预览的公用组件功能
2018/10/26 Javascript
JS插件amCharts实现绘制柱形图默认显示数值功能示例
2019/11/26 Javascript
Vue实现简易购物车页面
2020/12/30 Vue.js
[43:49]LGD vs CHAOS 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
python封装对象实现时间效果
2020/04/23 Python
Python通过OpenCV的findContours获取轮廓并切割实例
2018/01/05 Python
hmac模块生成加入了密钥的消息摘要详解
2018/01/11 Python
纯python实现机器学习之kNN算法示例
2018/03/01 Python
tensorflow学习笔记之mnist的卷积神经网络实例
2018/04/15 Python
pandas DataFrame 根据多列的值做判断,生成新的列值实例
2018/05/18 Python
python实现转盘效果 python实现轮盘抽奖游戏
2019/01/22 Python
Python3.5迭代器与生成器用法实例分析
2019/04/30 Python
PyQt编程之如何在屏幕中央显示窗体的实例
2019/06/18 Python
Python检查 云备份进程是否正常运行代码实例
2019/08/22 Python
没编程基础可以学python吗
2020/06/17 Python
详解HTML5 Canvas绘制不规则图形时的非零环绕原则
2016/03/21 HTML / CSS
你所知道的集合类都有哪些?主要方法?
2012/12/31 面试题
公司业务主管岗位职责
2013/12/07 职场文书
文化活动实施方案
2014/03/28 职场文书
党性心得体会
2014/09/03 职场文书
面试自我评价范文
2014/09/17 职场文书
工伤私了协议书范本
2014/11/24 职场文书
2015年父亲节活动总结
2015/02/12 职场文书
死磕 java同步系列之synchronized解析
2021/06/28 Java/Android