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