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 相关文章推荐
一个SQL管理员的web接口
Oct 09 PHP
通过table标签,PHP输出EXCEL的实现方法
Jul 24 PHP
php中filter函数验证、过滤用户输入的数据
Jan 13 PHP
MacOS 安装 PHP的图片裁剪扩展Tclip
Mar 25 PHP
PHP判断是否为空的几个函数对比
Apr 21 PHP
Apache启动报错No space left on device: AH00023该怎么解决
Oct 16 PHP
CentOS 7.2 下编译安装PHP7.0.10+MySQL5.7.14+Nginx1.10.1的方法详解(mini版本)
Sep 01 PHP
分享PHP-pcntl 实现多进程代码
Sep 30 PHP
PHP第三方登录―QQ登录实现方法
Feb 06 PHP
PHP微信支付结果通知与回调策略分析
Jan 10 PHP
浅析PHP7的多进程及实例源码
Apr 14 PHP
PHP连续签到功能实现方法详解
Dec 04 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实现网站插件机制的方法
2009/11/10 PHP
PHP 第二节 数据类型之数值型
2012/04/28 PHP
PHP+memcache实现消息队列案例分享
2014/05/21 PHP
php使用GeoIP库实例
2014/06/27 PHP
php实现面包屑导航例子分享
2015/12/19 PHP
浅析php中array_map和array_walk的使用对比
2016/11/20 PHP
Zend Framework前端控制器用法示例
2016/12/11 PHP
精选的10款用于构建良好易用性网站的jQuery插件
2011/01/23 Javascript
基于jQuery Bar Indicator 插件实现进度条展示效果
2015/09/30 Javascript
js学习阶段总结(必看篇)
2016/06/16 Javascript
jquery实用技巧之输入框提示语句
2016/07/28 Javascript
canvas实现绘制吃豆鱼效果
2017/01/12 Javascript
微信小程序中做用户登录与登录态维护的实现详解
2017/05/17 Javascript
vue实现商城购物车功能
2017/11/27 Javascript
使用webpack搭建react开发环境的方法
2018/05/15 Javascript
详解Vue组件插槽的使用以及调用组件内的方法
2018/11/13 Javascript
深入理解Vue.js轻量高效的前端组件化方案
2018/12/10 Javascript
javascript跳转与返回和刷新页面的实例代码
2019/11/20 Javascript
vue基于v-charts封装双向条形图的实现代码
2019/12/09 Javascript
js实现超级玛丽小游戏
2020/03/18 Javascript
解决vue一个页面中复用同一个echarts组件的问题
2020/07/19 Javascript
jQuery实现简单三级联动效果
2020/09/05 jQuery
python实现分析apache和nginx日志文件并输出访客ip列表的方法
2015/04/04 Python
Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
2016/06/14 Python
Python中Iterator迭代器的使用杂谈
2016/06/20 Python
详解python中asyncio模块
2018/03/03 Python
TensorFlow实现非线性支持向量机的实现方法
2018/04/28 Python
python输出100以内的质数与合数实例代码
2018/07/08 Python
Python从单元素字典中获取key和value的实例
2018/12/31 Python
Python求解正态分布置信区间教程
2019/11/20 Python
如何打包Python Web项目实现免安装一键启动的方法
2020/05/21 Python
h5实现获取用户地理定位的实例代码
2017/07/17 HTML / CSS
连锁酒店店长职责范本
2014/02/13 职场文书
中国梦主题教育活动总结
2014/05/05 职场文书
党员群众路线教育实践活动学习笔记
2014/11/05 职场文书
2015年公路路政个人工作总结
2015/07/24 职场文书