我有一个小应用程序,其中有9个不同的表单,每个表单至少有40多个字段,用户必须在其中输入一些数据。
我把每个表单都写在一个php文件中,并制作了一个主php文件,只在页面中间添加表单。
我的问题是:
我不想为每个表单编写9个不同的函数,因为它太长了,而且我认为这不是最佳实践,所以有什么方法或想法可以帮助我创建一个通用函数,在这个函数中,我可以向数据库传递一些变量并将数据添加到数据库中。
我是否可以遍历$_post数组并提取数据并以某种方式重新格式化?
但是每个领域都有不同的名字,我觉得这是不可能做到的。

最佳答案

试试看:

<?php

abstract class FormData
{
    const BOOLEAN = 'bool';
    const INTEGER = 'int';
    const FLOAT = 'float';
    const STRING = 'string';
    protected $_types = array();

    public static function create($data)
    {
        $action = isset($data['action']) ? $data['action'] : '';
        switch ($action)
        {
            case 'form1': return new MyForm1($data);
            default: return null;
        }
        return null;
    }

    protected function loadPostVars($data)
    {
        foreach ($data AS $var=>$value)
        {
            $value = $this->convertVar($var, $value);
            if (!is_null($value) && property_exists($this, $var))
            {
                $this->$var = $value;
            }
        }
    }
    protected function convertVar($var, $value)
    {
        if (array_key_exists($var, $this->_types))
        {
            $type = $this->_types[$var];
            switch ($type)
            {
                case FormData::BOOLEAN: return (bool)(int)$value;
                case FormData::INTEGER: return (int)$value;
                case FormData::FLOAT: return (float)$value;
                case FormData::STRING: // drop down
                default:
                    return myEscapeString($value);
            }
        }
        return null;
    }
}

class MyForm1 extends FormData
{
    public $fld1;
    public $fld2;
    public $fld3;
    // etc...

    public function __construct($data)
    {
        $this->_types = array(
            'fld1' => FormData::INTEGER,
            'fld2' => FormData::STRING,
            'fld3' => FormData::BOOLEAN,
        );
        $this->loadPostVars($data);
    }
}

// And finally process your form data
// You should add hidden input 'action' to each form to identify the form
if ($form = FormData::create($_POST))
{
    echo $form->fld1, $form->fld2, $form->fld3;
}
else
{
    exit('error: unknown action provided');
}

?>

这个解决方案必须改进-我写得很快。但我希望你能明白我的主旨。希望这会有帮助。当然,在每个表单类中,您可以添加特定的方法来处理请求等。

关于php - 一般php函数为多个表单,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/903275/

10-09 20:16
查看更多