V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Exin
V2EX  ›  问与答

问一个 PHP 函数

  •  
  •   Exin · 2015-10-26 21:16:34 +08:00 · 1671 次点击
    这是一个创建于 3310 天前的主题,其中的信息可能已经有所发展或是发生改变。
    以前看到过一个 PHP 函数,可以把 POST 的变量全部“本地化”,
    比如 post 里有一个值为 v 键为 k 的数据, {'k':'v', ...}
    使用这个函数之后就可以直接通过$k 访问 post 过来的'k':'v'了。
    echo $k;//输出'v'
    24 条回复    2015-10-26 23:45:58 +08:00
    Sunyanzi
        1
    Sunyanzi  
       2015-10-26 21:25:42 +08:00   ❤️ 1
    参考 http://php.net/extract ... 但慎用这个功能因为用户的输入永远是不可信的 ...
    cxbig
        2
    cxbig  
       2015-10-26 21:31:15 +08:00
    不要用 extract !不要用 extract !不要用 extract !
    Exin
        3
    Exin  
    OP
       2015-10-26 21:31:55 +08:00
    @Sunyanzi 因为按网页设计 post 的内容是一个表格,所有的 key 已经给定,所以相对还是安全的吧
    不过如果不是网页提交,而是恶意 post 一堆数据那是有点囧了。
    还好是内部使用的,应该没问题。
    Exin
        4
    Exin  
    OP
       2015-10-26 21:34:32 +08:00
    @cxbig why?能给个具体例子吗
    Exin
        5
    Exin  
    OP
       2015-10-26 21:39:42 +08:00
    似乎不能 append 。
    换个问题吧:
    最优雅的批量获取 post 里面指定 key 的 value 的方法是什么?
    cxbig
        6
    cxbig  
       2015-10-26 21:49:08 +08:00
    Post 是个很讲究安全的东西,我建议你至少用一个标准的类来处理。
    你要这样想,如果有人 Post 过来的东西是_GLOBAL 这样的东西你怎么办,如果他知道你这个项目大概会用到什么参数,通过 Post 加塞危险的东西覆盖了你本地的变量
    Exin
        7
    Exin  
    OP
       2015-10-26 21:52:47 +08:00
    @cxbig 原来如此。还好这个页面不会被恶意使用,是不公开的。
    qiayue
        8
    qiayue  
       2015-10-26 21:53:47 +08:00
    要什么取什么,取出来之后再变成本地变量
    Exin
        9
    Exin  
    OP
       2015-10-26 21:57:36 +08:00
    @qiayue 一个变量一个赋值语句的话感觉非常繁琐不优雅……有没有好的方法?
    cxbig
        10
    cxbig  
       2015-10-26 21:57:39 +08:00   ❤️ 1
    @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
        11
    qiayue  
       2015-10-26 22:05:58 +08:00
    封装一个方法,传一个数组进去,方法内循环数组取数据,返回数据数组。
    Exin
        12
    Exin  
    OP
       2015-10-26 22:08:27 +08:00
    @qiayue 能想到该怎么做了。可惜 PHP 竟然没有自带这样的方法

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

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



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

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

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

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

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

    http://www.yiiframework.com/doc/guide/1.1/en/form.model
    Exin
        19
    Exin  
    OP
       2015-10-26 23:06:52 +08:00
    @jarlyyn 谢谢,学习了
    txlty
        20
    txlty  
       2015-10-26 23:15:06 +08:00
    我曾经这么用过。应该就是你想要的。
    function all_post(){
    foreach($_POST as $key => $val){
    global $$key;
    $$key = $val;
    }
    }
    Exin
        21
    Exin  
    OP
       2015-10-26 23:17:56 +08:00
    @txlty 这似乎和 extract()没有什么区别……我觉得需要给出一组想要的 key 的 array 吧
    txlty
        22
    txlty  
       2015-10-26 23:20:56 +08:00
    你指的是这样?这俩也是我曾经用过的。
    function getget($str){
    $array=explode(',',$str);
    foreach($array as $val){
    global $$val;
    $$val=trim($_GET[$val]);
    }
    }
    function getpost($str){
    $array=explode(',',$str);
    foreach($array as $val){
    global $$val;
    $$val=trim($_POST[$val]);
    }
    }
    使用方式,逗号分隔。 getget('k1,k2,k3'); echo $k1.$k2.$k3;
    quericy
        23
    quericy  
       2015-10-26 23:40:41 +08:00
    @Exin "做大规模的网站当然不会这样瞎弄",不是大项目也不能随意啊
    想当初我们那个项目也是小项目来着,后来谁也没想到,渐渐做大了...
    然后....哎,不说了
    Exin
        24
    Exin  
    OP
       2015-10-26 23:45:58 +08:00
    @quericy 谢谢。都是计划好的东西,不会变大的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5377 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 09:25 · PVG 17:25 · LAX 01:25 · JFK 04:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.