我有一个小应用程序,其中有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/