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

使用php进行有效的表单处理,php,ajax,oop,Php,Ajax,Oop,我正在做一些项目,我想在几个模板中处理来自表单的请求。问题是如何在处理纸条中调用适当的函数。虽然我已经编写了一段时间了,但我仍然想不出比在隐藏字段中使用变量更好的方法: if ($_POST['somehiddenfield'] == 1) { some_function_1();//doesnt matter if its a function or a method } if ($_POST['somehiddenfield'] == 2) { $mainclass->s

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

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

此外,我希望将所有内容都保存在一个处理程序文件中,在该文件中调用我的主类。那么,如果。。。否则?

我将执行以下操作:

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

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

我会保留一个包含所有可能选项的key=>value数组。传递隐藏的输入字段,检查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;

发送一个更多的读取值(仍然在一个隐藏字段中)来组成方法名,还有什么不好呢?为每个表单指定一个特定的名称。虽然您的问题与AJAX无关,但这可能与您的问题有关。或者使用
array(数组(“type”=>1,“method”=>“personalForm”),数组(…)
IMO使用隐藏输入是完全可以的。这就是他们在那里的目的。然而,我通常不使用它们来分离PHP端的函数。我通常会在javascript中设置一个全局变量,从而确定通过ajax调用哪个函数。(因此,根据我要调用的函数更改URL请求)-如果可以,另一种方法是将其作为函数参数发送。我倾向于将int作为参数(url/class/function/parameter)发送,但您需要为此设置路由。如果您打算使用OOP,我建议您开始研究微框架,例如,和其他许多微框架。IMO框架将通过拥有控制器(您正在寻找的)、视图和模型来保持您的代码干净、有序和可维护。“但一定要清理输入!!!”这部分需要更粗体和更大:)@IncredibleHat我正在使用PDO,但这条建议始终很重要该部分将变量解析为方法名<代码>$formsProcessor->$formName无法工作。正如您在字符串
中所做的那样,“footext{$bar[2]}moretext”这里是文档:请注意,这个类中不能有任何其他用户不应该调用的方法。您可以通过将方法名由两部分组成来解决这个问题:
$methodName=$formName.“Processor”->$formsProcessor->{$methodName}()`一种有趣的方法。事实上,您的示例表明,不清理数据是多么危险,谢谢!很高兴我能帮忙。永远不允许用户定义要运行的确切函数-始终映射事物。@gonzie我们通常不允许用户通过路由和
.htaccess
运行函数吗?或者你认为这有什么不同?P@Babydead用户运行您希望他们运行的功能。所有路由通常都是预定义的,在任何情况下,它们都不会操作文件中的代码。路由和允许代码注入之间有着巨大的区别。@gonzie只是想确保两者之间有区别,并且我的想法是有道理的,哈哈。谢谢
$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;