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数组最大值,最小值的代码
Oct 31 PHP
关于shopex同步ucenter的redirect问题,导致script不运行
Apr 10 PHP
几个实用的PHP内置函数使用指南
Nov 27 PHP
PHP判断一个字符串是否是回文字符串的方法
Mar 23 PHP
PHP实现操作redis的封装类完整实例
Nov 14 PHP
PHP多维数组转一维数组的简单实现方法
Dec 23 PHP
Zend Framework教程之路由功能Zend_Controller_Router详解
Mar 07 PHP
PHP中快速生成随机密码的几种方式
Apr 17 PHP
Laravel如何使用Redis共享Session
Feb 23 PHP
laravel 实现划分admin和home 模块分组
Oct 15 PHP
PHP框架实现WebSocket在线聊天通讯系统
Nov 21 PHP
PHP设计模式(六)桥连模式Bridge实例详解【结构型】
May 02 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
解析posix与perl标准的正则表达式区别
2013/06/17 PHP
解决file_get_contents无法请求https连接的方法
2013/12/17 PHP
php编程每天必学之表单验证
2016/03/01 PHP
深入理解PHP之源码目录结构与功能说明
2016/06/01 PHP
thinkphp验证码的实现(form、ajax实现验证)
2016/07/28 PHP
JQuery的ajax基础上的超强GridView展示
2009/09/18 Javascript
JavaScript Perfection kill 测试及答案
2010/03/23 Javascript
关于js数组去重的问题小结
2014/01/24 Javascript
jQuery Trim去除字符串首尾空字符的实现方法说明
2014/02/11 Javascript
JS实现带圆弧背景渐变效果的导航菜单代码
2015/10/13 Javascript
Google 地图API Map()构造器详解
2016/08/06 Javascript
全面了解函数声明与函数表达式、变量提升
2016/08/09 Javascript
vue下history模式刷新后404错误解决方法
2018/08/18 Javascript
vue 之 css module的使用方法
2018/12/04 Javascript
WebSocket的简单介绍及应用
2019/05/23 Javascript
layui清空,重置表单数据的实例
2019/09/12 Javascript
layui 实现加载动画以及非真实加载进度的方法
2019/09/23 Javascript
js实现图片实时时钟
2020/01/15 Javascript
Vue组件模板及组件互相引用代码实例
2020/03/11 Javascript
[01:56]生活中的妖精之七夕特别档
2016/08/09 DOTA
python操作MySQL数据库的方法分享
2012/05/29 Python
详解Python的Django框架中的中间件
2015/07/24 Python
Python使用中文正则表达式匹配指定中文字符串的方法示例
2017/01/20 Python
详解python的webrtc库实现语音端点检测
2017/05/31 Python
Django contenttypes 框架详解(小结)
2018/08/13 Python
python从子线程中获得返回值的方法
2019/01/30 Python
python随机数分布random均匀分布实例
2019/11/27 Python
python操作gitlab API过程解析
2019/12/27 Python
python实现图片,视频人脸识别(dlib版)
2020/11/18 Python
C语言面试题
2013/05/19 面试题
房屋维修协议书范本
2014/09/25 职场文书
2015年党建工作汇报材料
2015/06/25 职场文书
文化苦旅读书笔记
2015/06/29 职场文书
Pytorch反向传播中的细节-计算梯度时的默认累加操作
2021/06/05 Python
浅析MySQL如何实现事务隔离
2021/06/26 MySQL
详细聊聊关于Mysql联合查询的那些事儿
2021/10/24 MySQL