问一个 PHP 函数

2015-10-26 21:16:34 +08:00
 Exin
以前看到过一个 PHP 函数,可以把 POST 的变量全部“本地化”,
比如 post 里有一个值为 v 键为 k 的数据, {'k':'v', ...}
使用这个函数之后就可以直接通过$k 访问 post 过来的'k':'v'了。
echo $k;//输出'v'
1676 次点击
所在节点    问与答
24 条回复
Sunyanzi
2015-10-26 21:25:42 +08:00
参考 http://php.net/extract ... 但慎用这个功能因为用户的输入永远是不可信的 ...
cxbig
2015-10-26 21:31:15 +08:00
不要用 extract !不要用 extract !不要用 extract !
Exin
2015-10-26 21:31:55 +08:00
@Sunyanzi 因为按网页设计 post 的内容是一个表格,所有的 key 已经给定,所以相对还是安全的吧
不过如果不是网页提交,而是恶意 post 一堆数据那是有点囧了。
还好是内部使用的,应该没问题。
Exin
2015-10-26 21:34:32 +08:00
@cxbig why?能给个具体例子吗
Exin
2015-10-26 21:39:42 +08:00
似乎不能 append 。
换个问题吧:
最优雅的批量获取 post 里面指定 key 的 value 的方法是什么?
cxbig
2015-10-26 21:49:08 +08:00
Post 是个很讲究安全的东西,我建议你至少用一个标准的类来处理。
你要这样想,如果有人 Post 过来的东西是_GLOBAL 这样的东西你怎么办,如果他知道你这个项目大概会用到什么参数,通过 Post 加塞危险的东西覆盖了你本地的变量
Exin
2015-10-26 21:52:47 +08:00
@cxbig 原来如此。还好这个页面不会被恶意使用,是不公开的。
qiayue
2015-10-26 21:53:47 +08:00
要什么取什么,取出来之后再变成本地变量
Exin
2015-10-26 21:57:36 +08:00
@qiayue 一个变量一个赋值语句的话感觉非常繁琐不优雅……有没有好的方法?
cxbig
2015-10-26 21:57:39 +08:00
@Exin 是不是公开的接口都不要用,我建议你参考一下 Ruby on Rails 4.x 和 Laravel 的安全解决方案。
顶层类准备反射 getter 和 value 的安全性过滤,实际的 controller 继承了以后,定义个需要获取的 key 的 Array ,然后当 Post 进来以后__constract 之类的函数就会自动根据你的 Array 处理好所有的 parameter ,你可以直接用:
$this->getRequest()->getParam('key1');
$this->getRequest()->getParam('key2');
...
qiayue
2015-10-26 22:05:58 +08:00
封装一个方法,传一个数组进去,方法内循环数组取数据,返回数据数组。
Exin
2015-10-26 22:08:27 +08:00
@qiayue 能想到该怎么做了。可惜 PHP 竟然没有自带这样的方法

@cxbig 好我看看
zakokun
2015-10-26 22:41:01 +08:00
你自己封装一个函数就是了,传进来 post,你将其转换成对应的格式.这已经很优雅了
你想直接把用户 post 过来的东西 extract,这当然是不可以的了,一切外部输入的东西都不可信是常识
jarlyyn
2015-10-26 22:43:57 +08:00
@Exin

个人觉得,你的思路太奇葩了…………



$_get,$_post 必然不能这样用

用个 form 模型处理过都未必靠谱。
Exin
2015-10-26 22:46:38 +08:00
@jarlyyn 也许吧,就是这样一个思维跑马的人。
@zakokun 好的。
jarlyyn
2015-10-26 22:46:52 +08:00
另外,觉得你的问题有两个地方。

1.没有把所有网页的操作看成一个个的 Request 和 response 。不论是前端还是后台,说明你都没进入正确的思考模式。

2.没有使用 form 类 /处理函数。先不说安全性的问题。只要网站规模稍微大点,调整各种 from 就要去各个入口找,太痛苦了。
Exin
2015-10-26 22:52:42 +08:00
@jarlyyn
因为只是很简单的需求,限于小部分人使用的单页面而已。
做大规模的网站当然不会这样瞎弄。
谢谢意见
jarlyyn
2015-10-26 22:56:56 +08:00
@Exin

我个人比较喜欢 yii 的 FormModel 的处理方式

http://www.yiiframework.com/doc/guide/1.1/en/form.model
Exin
2015-10-26 23:06:52 +08:00
@jarlyyn 谢谢,学习了
txlty
2015-10-26 23:15:06 +08:00
我曾经这么用过。应该就是你想要的。
function all_post(){
foreach($_POST as $key => $val){
global $$key;
$$key = $val;
}
}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/231274

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX