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_Flame(Version:Progress)的原代码
Oct 09 PHP
多文件上传的例子
Oct 09 PHP
php下实现一个阿拉伯数字转中文数字的函数
Jul 10 PHP
php的大小写敏感问题整理
Dec 29 PHP
php获取YouTube视频信息的方法
Feb 11 PHP
PHP 实现类似js中alert() 提示框
Mar 18 PHP
PHP中实现Bloom Filter算法
Mar 30 PHP
PHP常用处理静态操作类
Apr 03 PHP
lnmp安装多版本PHP共存的方法详解
Aug 02 PHP
PHP PDOStatement::errorInfo讲解
Jan 31 PHP
php创建多级目录与级联删除文件的方法示例
Sep 12 PHP
PHP实现长轮询消息实时推送功能代码实例讲解
Feb 26 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
Android ProgressBar进度条和ProgressDialog进度框的展示DEMO
2013/06/19 PHP
基于PHP实现短信验证码接口(容联运通讯)
2016/09/06 PHP
PHP常用函数总结(180多个)
2016/12/25 PHP
PHP中时间加减函数strtotime用法分析
2017/04/26 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
2017/08/30 PHP
php ajax confirm 删除实例详解
2019/03/06 PHP
JQuery Tab选项卡效果代码改进版
2010/04/01 Javascript
JS无法捕获滚动条上的mouse up事件的原因猜想
2012/03/21 Javascript
文本框中禁止非数字字符输入比如手机号码、邮编
2013/08/19 Javascript
Js判断参数(String,Array,Object)是否为undefined或者值为空
2013/11/04 Javascript
鼠标拖拽移动子窗体的JS实现
2014/02/25 Javascript
jquery禁用右键单击功能屏蔽F5刷新
2014/03/17 Javascript
jQuery功能函数详解
2015/02/01 Javascript
JS选项卡动态替换banner图片路径的方法
2015/05/11 Javascript
javascript中DOM复选框选择用法实例
2015/05/14 Javascript
js性能优化技巧
2015/11/29 Javascript
详解JS中的立即执行函数
2017/02/24 Javascript
源码分析Vue.js的监听实现教程
2017/04/23 Javascript
Vue学习笔记进阶篇之函数化组件解析
2017/07/21 Javascript
webpack项目轻松混用css module的方法
2018/06/12 Javascript
使用express获取微信小程序二维码小记
2019/05/21 Javascript
微信小程序sessionid不一致问题解决
2019/08/30 Javascript
python中numpy的矩阵、多维数组的用法
2018/02/05 Python
pandas数据框,统计某列数据对应的个数方法
2018/04/11 Python
Python文件常见操作实例分析【读写、遍历】
2018/12/10 Python
Python3标准库总结
2019/02/19 Python
selenium切换标签页解决get超时问题的完整代码
2020/08/30 Python
css3实现顶部社会化分享按钮示例
2014/05/06 HTML / CSS
Html5游戏开发之乒乓Ping Pong游戏示例(二)
2013/01/21 HTML / CSS
宪法宣传周工作方案
2014/05/26 职场文书
优秀班主任主要事迹材料
2014/12/16 职场文书
幼儿教师小班个人总结
2015/02/05 职场文书
个人先进事迹总结
2015/02/26 职场文书
电影圆明园观后感
2015/06/03 职场文书
Django 实现jwt认证的示例
2021/04/30 Python
Python 类,对象,数据分类,函数参数传递详解
2021/09/25 Python