首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >多个表单的通用php函数

多个表单的通用php函数
EN

Stack Overflow用户
提问于 2009-05-24 07:31:41
回答 5查看 931关注 0票数 3

我有一个小应用程序,其中我有9个不同的表单,每个表单都有至少一个40+字段,用户必须在其中输入一些数据。

我已经在一个单独的php文件中编写了每个表单,并制作了一个主PHP文件,其中我只将表单添加到页面中间。

我的问题是:

我不想为每个表单写9个不同的函数,因为它太长了,我认为这不是最好的做法,所以有没有一种方法或想法可以帮助我制作一个通用的函数,在这个函数中,我可以将一些变量传递给数据库,并将数据添加到数据库中。

我可以像这样遍历$_POST数组,提取数据并重新格式化吗?但话又说回来,每个字段都有不同的名称,我似乎不可能做到这一点。

EN

回答 5

Stack Overflow用户

发布于 2009-05-24 12:37:10

尝试这样做:

代码语言:javascript
代码运行次数:0
运行
复制
<?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');
}

?>

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

票数 2
EN

Stack Overflow用户

发布于 2009-05-24 08:12:56

您可能会对Zend_Form之类的东西感兴趣。

票数 1
EN

Stack Overflow用户

发布于 2009-05-24 11:39:57

我在我的一个项目中使用了类似的东西。基本上,我定义了所有字段,包括如何显示它们,它们具有什么数据类型(数字、日期等),以及回发后如何处理它们。然后将该信息传递给一个生成HTML表单的函数。当该表单提交时,您将相同的信息传递给执行必要任务的不同函数。

在我的特定案例中,它只是用来创建搜索表单,所以处理过程涉及到创建一条SELECT sql语句。下面是其中一个字段定义的示例:

代码语言:javascript
代码运行次数:0
运行
复制
$criteria = array(
    array("label" => "Search clients",
          "type"  => "radio",
          "values"=> array("1" => "Just " . $client->getName(),
                           "2" => "All clients"),
          "where" => array("1" => "c.`clientId` = " . $client->getId(),
                           "2" => "1"), // always true
          "default" => "1"),
    array("label" => "Last Name",
          "type"  => "text",
          "where" => "s.`lastName` LIKE '%s'"),
    array("label" => "First Name",
          "type"  => "text",
          "where" => "s.`firstName` LIKE '%s'")
    // etc...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/903275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档