我在这里看到了类似的问题,但这是基于JavaScript的,而我的是纯PHP。处理具有动态生成的变量的表单,我发现必须将其提交两次才能保存值。一个名为 Start 的字段包含一个MySQL日期时间,并且该表单仅使用文本表单字段上的日期选择器来提交日期(我单击该字段,然后弹出日期选择器向上),而另一个字段(称为 Time 的选项列表)正在选择时间。提交表单后,它将日期和时间重新放回正确的格式,并按期望的完整值填充“开始”字段,但随后我需要再次提交以将值实际保存到数据库。 $ FieldNames是数据库表中列名称的数组。
这是我的原始代码,没有Start条件,可以在不需要合并两个表单字段的所有其他表单上很好地工作:
foreach ($FieldNames as $val) :
$$val = (isset($_POST[$val])) ? safeData($_POST[$val]) : addslashes($row[$val]);
// Set date and time as separate elements concatenated together
if ($val === "Start") :
$rawStart = ($Start) ? $Start : date('Y-m-d H:i:00');
$Time = (isset($_POST['Time'])) ? $_POST['Time'] : roundTime($rawStart, 15, 'auto');
$Start = (isset($_POST['Start']) && isset($_POST['Time'])) ? date('Y-m-d', strtotime($_POST['Start'])) . " $Time" : $rawStart;
endif;
echo $row[$val];
endforeach;
为了使它能够在提交时获取表单字段,我添加了一个条件,但它也需要提交两次,因此在功能上与我上面的其他代码相同,但有更多行代码:
if (!isset($_POST) || isset($_POST['SearchID'])) :
// Dynamically declare variables for empty form
foreach ($FieldNames as $val) :
$$val = (isset($_POST[$val])) ? safeData($_POST[$val]) : addslashes($row[$val]);
endforeach;
else :
// Dynamically declare values from post to populate form
foreach ($_POST as $row => $values) :
if (trim($row) && is_string($row)) :
if ($row === "Start") :
$rawStart = ($_POST['Start']) ? $_POST['Start'] : date('Y-m-d H:i:00');
$Time = (isset($_POST['Time'])) ? $_POST['Time'] : roundTime($rawStart, 15, 'auto');
$values = (isset($_POST['Start']) && isset($_POST['Time'])) ? date('Y-m-d', strtotime($_POST['Start'])) . " $Time" : $rawStart;
endif;
$$row = $values;
endif;
endforeach;
endif;
作为临时的解决方法,我向时间选择器添加了一个onchange,它可以工作,但并不是理想的解决方法,特别是因为它假定必须按时间选择器的最后一个顺序输入字段。任何关于更直接事物的想法将不胜感激。