用于多种表单的通用php函数

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

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

我用一个PHP文件编写了每个表单,并制作了一个主PHP文件,其中只在页面中间添加表单。

我的问题是:


我不想为每个表单编写9个不同的函数,因为它太长,而且我认为这不是最佳实践,所以有没有一种方法或想法可以帮助我创建一个通用函数,在这个函数中我可以传递一些变量并将数据添加到数据库中

我是否可以遍历$\u POST数组,将数据提取出来并以某种方式重新格式化?
但是,每个领域都有不同的名称,我觉得这是不可能做到的。

你可能对这样的东西感兴趣。

只有两个小想法

1) 您是否在一页中显示所有9张表格?如果是,我真的不认为这是个好主意。

2) 为什么不将表单分为不同的页面,并在可能的情况下为表单上的字段指定相同的名称?

您可以使用foreach在$\u POST数组上进行迭代

   foreach($_POST as $name => $value) {
      echo $name, ' ', $value, '<br />';
   }
foreach($\u发布为$name=>$value){
回显$name,,$value,
; }
我在我的一个项目中使用了类似的东西。基本上,我定义了所有字段,包括如何显示它们,它们有什么数据类型(数字、日期等),以及在发回后如何处理它们。然后将该信息传递给一个生成HTML表单的函数。提交该表单时,您将相同的信息传递给执行必要任务的不同功能

在我的具体案例中,它只是用来创建搜索表单,因此处理过程涉及到创建SELECTSQL语句。以下是其中一个字段定义的示例:

$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...
试着这样做:

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

?>


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

正如SleepyCod所说,您的乳房赌注正在操作一个
foreach
,但答案需要扩展到:

  • 表单字段是否与表等效
  • 是否每个表单都用于
    更新
    插入
    到多个表中?
我问的原因是因为这是我为我的网页所做的事情。我创建了一个动态表单结构,在这里查询有问题的表,检索模式,并使用
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)"); //假设一个表:一个表单,每个输入名称=列名。 //将数组$\u POST剥离到其键和值中。 foreach($\发布为$key=>$val){ $val.=“$val”,”; $keys.=“`$keys`,”; } //为了避免产生错误,请去掉后面的逗号和空格。 $keys_strip=substr($keys,0,-2); $VAL_strip=substr($VAL,0,-2); $sql=mysql\u query(“插入t1($keys\u strip)值($vals\u 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)"); } //假设两个+表:一个表单,对于每个输入,name='t1:column_name';假设表是在每个表单的数组中定义的,以便于参考。 //将数组$\u POST剥离为键和值,然后将键分隔为两个单独的字段。这将只适用于t1:列名设置;可以放入if语句来处理剩余的信息。 foreach($\以$key作为val发布){ //这将导致key_t1=key和vals_t1=val。 if(preg_match('/^(\w.+):(\w.+)$/',$key,$t_key)){ ${“密钥”..$t密钥[1]}=“$t密钥[2],”; ${“VAL”..$t_键[1]}=“$var,”; } } //假设$tables数组包含此插入的表。 foreach($tables作为$table){ $keys_strip=substr(${“keys_u”。$table},0,-2); $vals_strip=substr(${“vals_”。$table},0,-2); $sql=mysql\u query(“插入表($keys\u strip)值($vals\u strip)”); }
可能需要一些工具才能让它正常工作,但它应该能让您到达需要的地方。请注意,这只会插入基于表单的信息。如果你需要什么。。。好。。。我强烈建议使用隐藏输入类型。

“我不想为每个表单编写9个不同的函数”,你在用这些函数做什么?“向数据库添加数据”,因为每个表单都有不同的字段,我想创建一个通用的字段来处理inputHanx,是否还有其他方法?我对ZF不太熟悉,几天前才开始阅读。不,每个表单都显示在单独的页面上,我只想创建一个添加数据的通用函数,而不必重复代码,而您可以这样做,编写SQL查询是一种非常危险的方法。@acrosman您可以在数据库中存储可能有害的数据,但在网站上显示这些数据时必须小心。