一般php函数为多个表单

时间:2009-05-24 07:31:41

标签: php mysql database forms

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

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

我的问题是:

我不想为每种形式写出9种不同的功能因为它太长了我不认为这是最好的做法,所以是否有一种方法或想法可以帮助我做出一般功能我可以传递一些变量并将数据添加到数据库中。

我可以遍历$ _POST数组并转发数据并以某种方式重新格式化吗? 但是然后每个领域都有不同的名字,我觉得这是不可能的。

6 个答案:

答案 0 :(得分:2)

尝试这种方式:

<?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');
}

?>

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

答案 1 :(得分:1)

您可能对Zend_Form等内容感兴趣。

答案 2 :(得分:1)

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

在我的特定情况下,它仅用于创建搜索表单,因此处理涉及创建SELECT sql语句。以下是其中一个字段定义的示例:

$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...

答案 3 :(得分:0)

只有2个小小的想法..

1)您是否在一个页面中显示所有9个表单?如果是的话 - 我真的不认为这是个好主意 2)为什么不将表单划分到不同的页面,并在表格中的字段中给出相同的名称?

答案 4 :(得分:0)

您可以使用foreach迭代$ _POST数组。

   foreach($_POST as $name => $value) {
      echo $name, ' ', $value, '<br />';
   }

答案 5 :(得分:0)

正如SleepyCod所说,你的乳房赌注正在运行foreach,但答案需要扩大:

  • 表单字段是否等同于表格?
  • 每个表单是否用于UPDATEINSERT以上的表格?

我问的原因是因为这是我为我的网页所做的事情。我创建了一个动态表单结构,在该结构中查询表,检索模式并使用foreach + switch()来确定要使用的字段。

但那不是你要问的。

所以,相反,我给你:

// Assuming one table:one form, and each input-name = column name.

//strip array $_POST into its key and value.
foreach($_POST as $key => $val) {
 $vals .= "'$val', ";
 $keys .= "`$key`, ";
}

// Lest we want to generate errors, shave off the trailing comma and whitespace.
$keys_strip = substr($keys, 0, -2);
$vals_strip = substr($vals, 0, -2);
$sql = mysql_query("INSERT INTO t1 ($keys_strip) VALUES ($vals_strip)");

对于多个表,它有点棘手。我选择在每个表单的开头使用快速识别,因此我们可以执行以下操作:

// Assuming two+ table:one form, for each input, name='t1:column_name'; assume tables are defined in an array per form for easy reference.

//strip array $_POST into key and value, then separate the key into two separate fields. This will ONLY work for t1:column-name set up; an if statement can be put in to deal with the remaining information.
foreach ($_POST as $key as val) {
// This will result in keys_t1 = key and vals_t1 = val.
 if (preg_match('/^(\w.+):(\w.+)$/', $key, $t_key)) {
  ${"keys_".$t_key[1]} = "$t_key[2], ";
  ${"vals_".$t_key[1]} = "$var, ";
 }
}

// Assume $tables array, containing tables for THIS insert.
foreach ($tables AS $table) {
 $keys_strip = substr(${"keys_".$table}, 0, -2);
 $vals_strip = substr(${"vals_".$table}, 0, -2);
 $sql = mysql_query("INSERT INTO table ($keys_strip) VALUES ($vals_strip)");
}

可能需要一些工具才能使其正常工作,但它应该可以帮助您到达目的地。请注意,这只会INSERT基于表单的信息。如果您需要任何东西......那么......我强烈建议您使用隐藏的输入类型。