代码之家  ›  专栏  ›  技术社区  ›  RWS

使用php进行有效的表单处理

  •  3
  • RWS  · 技术社区  · 7 年前

    我正在处理一些项目,我想在几个模板中处理来自表单的请求。问题是如何在处理脚本中调用适当的函数。虽然我已经编写了一段时间了,但我仍然想不出比在隐藏字段中使用变量更好的方法:

    if ($_POST['somehiddenfield'] == 1) {
       some_function_1();//doesnt matter if its a function or a method
    }
    
    if ($_POST['somehiddenfield'] == 2) {
       $mainclass->somemethod();
    }
    //goes on indefinitely
    

    此外,我希望将所有内容都保存在一个处理程序文件中,在该文件中调用我的主类。那么有没有比使用 if ... else ?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Jeff    7 年前

    我会这样做:

    仍然有一个隐藏字段,但让它包含类似表单名称的内容

    <input type="hidden" name="formName" value="post">
    

    然后,您可以在消费php脚本中执行类似操作:

    <?php
    // whatever class you use... this is just a simple dummy
    class FormsProcessor {
          public function post($params) {
              echo "processing post form";
          }
    }
    
    $formName = "post";  // would be $formName = filter_input(INPUT_POST, $_POST['formName'],FILTER_SANITIZE_STRING,FILTER_FLAG_STRIP_HIGH);
    // BUT BE SURE TO SANITIZE THE INPUT!!!
    
    $params = [];  // dummy
    $formsProcessor = new FormsProcessor();
                     // here's the trick.
    $formsProcessor->{$formName}($params);
    // to be even safer you could check first if this method_exists() 
    // and/or if it's in a list of allowed methods.
    

    请注意,此类中不得有任何其他用户不应调用的方法。您可以通过将方法名称真正组合为两部分来解决这一问题:

    $methodName = $formName."Processor";
    //....
    $formsProcessor->{$methodName}();`
    
        2
  •  1
  •   gonzie    7 年前

    我会保留一把钥匙=>使用所有可能的选项对值数组进行硬编码。传递隐藏的输入字段,检查post值和硬编码选项的键之间是否有任何交点,并调用任何匹配值作为函数。

    $map = [
        'yourHiddenField' => 'myFunctionName',
        'anotherHiddenField' => 'myOtherFunctionName',
        'yourOtherHiddenField' => 'yetAnotherfunctionName',
    ];
    
    $intersection = array_intersect(array_keys($map), array_keys($_POST));
    
    foreach ($intersection as $key) {
        $this->{$map[$key])();
    }
    

    此代码尚未测试。

    编辑: 在不预先定义应该允许运行哪些函数的情况下,请小心允许运行任何输入。

    即使进行消毒,其危险程度的示例:

    class Test {
        public $i = 1;
    
        function __construct(){
            $this->i++;
        }
    }
    
    $formVariable = '__construct';
    
    $t = new Test();
    
    $t->{$formVariable}();
    
    echo $t->i;