【问题标题】:General php function for multiple forms多种形式的通用php函数
【发布时间】:2010-10-28 13:05:10
【问题描述】:

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

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

我的问题是:

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

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

【问题讨论】:

  • “我不想为每个表单写9个不同的函数”,你用这些函数做什么?
  • “添加数据”到数据库,因为每个表单都有不同的字段,所以我想制作一个通用的字段来处理输入

标签: php mysql database forms


【解决方案1】:

您可能对Zend_Form 之类的内容感兴趣。

【讨论】:

  • thanx for 还有其他方法吗?我对 ZF 不是很熟悉,几天前我才开始阅读它。
【解决方案2】:

只是两个小想法..

1) 您是否在一页中显示所有 9 个表单?如果是 - 我真的认为这不是一个好主意。
2) 为什么不将表单分成不同的页面,并在可能的情况下为表单上的字段赋予相同的名称?

【讨论】:

  • 不,每个表格都显示在单独的页面上,我只想做一个添加数据的通用功能,而不必重复代码
【解决方案3】:

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

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

【讨论】:

  • 虽然你可以这样做,但它是编写 SQL 查询的一种非常危险的方式。
  • @acrosman 您可以将可能有害的数据存储在您的数据库中,但是当您将其显示在您的网站上时必须小心。
【解决方案4】:

我在我的一个项目中使用了类似的东西。基本上,我定义了所有字段,包括如何显示它们、它们具有什么数据类型(数字、日期等),以及在回发后如何处理它们。然后将该信息传递给一个生成 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...

【讨论】:

    【解决方案5】:

    试试这个方法:

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

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

    【讨论】:

      【解决方案6】:

      正如 SleepyCod 所说,您的赌注是foreach,但需要扩展答案:

      • 表单域是否等同于表格?
      • 每个表格是否用于UPDATEINSERT 到多个表格中?

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

      但这不是你要问的。

      所以,我给你:

      // 假设一个表:一个表格,并且每个输入名称 = 列名称。 //将数组 $_POST 剥离为它的键和值。 foreach($_POST as $key => $val) { $vals .= "'$val', "; $keys .= "`$key`, "; } // 为了避免产生错误,去掉结尾的逗号和空格。 $keys_strip = substr($keys, 0, -2); $vals_strip = substr($vals, 0, -2); $sql = mysql_query("插入到 t1 ($keys_strip) 值 ($vals_strip)");

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

      // 假设两个+ table:一个表格,对于每个输入,name='t1:column_name';假设表格在每个表格中定义为一个数组,以便于参考。 // 将数组 $_POST 剥离为 key 和 value,然后将 key 分成两个单独的字段。这仅适用于 t1:column-name 设置;可以放入 if 语句来处理剩余的信息。 foreach ($_POST as $key as val) { // 这将导致 keys_t1 = key 和 vals_t1 = val。 if (preg_match('/^(\w.+):(\w.+)$/', $key, $t_key)) { ${"keys_".$t_key[1]} = "$t_key[2], "; ${"vals_".$t_key[1]} = "$var, "; } } // 假设 $tables 数组,包含此插入的表。 foreach ($tables AS $table) { $keys_strip = substr(${"keys_".$table}, 0, -2); $vals_strip = substr(${"vals_".$table}, 0, -2); $sql = mysql_query("插入表 ($keys_strip) 值 ($vals_strip)"); }

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

      【讨论】:

        猜你喜欢
        • 2017-10-12
        • 1970-01-01
        • 1970-01-01
        • 2018-08-15
        • 1970-01-01
        • 1970-01-01
        • 2017-07-26
        • 1970-01-01
        • 2010-10-01
        相关资源
        最近更新 更多