从html表单帖子中生成PHP中的数组和/或列表,该表单帖子包含最初由JavaScript排列的未知数量的值

从html表单帖子中生成PHP中的数组和/或列表,该表单帖子包含最初由JavaScript排列的未知数量的值,javascript,php,html,mysql,forms,Javascript,Php,Html,Mysql,Forms,首先,您好,谢谢您阅读我的问题。这似乎是一个有点奇怪的需求组合——我已经意识到问题并不是从一开始就以最有效的方式开始的,但是这是一个我无法改变的参数——至少在这个时候 我有一个包含两个html表的html表单。在这些表中的每个表上都有一系列JS计算,用于从其他(用户)输入字段计算各种只读输入字段中的值。第一个表的最终总计在计算后用作第二个表的第一个值。第二个表保持静态,因此具有定义的输入数。这不是问题的一部分,但依赖于第一个表中的数据 第一个表在一个物理表行上有6个输入字段(3个文本、一个选择和

首先,您好,谢谢您阅读我的问题。这似乎是一个有点奇怪的需求组合——我已经意识到问题并不是从一开始就以最有效的方式开始的,但是这是一个我无法改变的参数——至少在这个时候

我有一个包含两个html表的html表单。在这些表中的每个表上都有一系列JS计算,用于从其他(用户)输入字段计算各种只读输入字段中的值。第一个表的最终总计在计算后用作第二个表的第一个值。第二个表保持静态,因此具有定义的输入数。这不是问题的一部分,但依赖于第一个表中的数据

第一个表在一个物理表行上有6个输入字段(3个文本、一个选择和两个文本框)。这一行上还有一个按钮,它克隆整行,然后将其追加到下面,为新生成的6个字段中的每个字段添加一个增量值。这允许用户根据需要添加任意多的行,每个行具有相同的6个字段。第一个(默认)字段具有如下值:

“texta_1”、“textb_1”、“textc_1”、“textboxa_1”textboxb_1”、“选择_1”

任何其他JS生成的行将遵循以下命名格式:

“texta_2”、“textb_2”、“textc_2”、“textboxa_2”textboxb_2、“选择_2”
“texta_3”、“textb_3”、“textc_3”、“textboxa_3”textboxb_3、“选择_3”

对于扩展的范围/数量没有明确的限制,尽管出于目的,这意味着将使用它并有权访问它的小组一次不需要输入超过10行

到目前为止,一切都运行得很好。问题是,一旦发布了此表单,我需要收集上述表中的所有数据,并能够在将其保存到mysql数据库之前将其重新显示给用户

我需要知道如何在php5中(5.3.3用于LAMP堆栈-Debian/Apache2/MySQL 5.1.66/php5.3.3)收集6个字段中每个字段的所有输入,并将它们放入列表和数组中。我不确定需要哪个函数(我的php能力都不是顶级的,现在已经过时3年了)。DB有正确的规定,允许一个区域中的所有数据一起保存——也就是说,texta_1、texta_2、texta_3、texta_5等……都希望在DB中的一列中一起保存,比如说,命名为“DB_texta”

我还需要将这6个DB列中的每个列的数据抛出到foreach循环中,以便在提交到DB之前显示,当然,在以后从DB中再次提取数据时显示

可能需要指出的是,流程的这一部分是整个更大流程中的一个步骤。它是数据收集的第二部分,不会是最后一部分。在这之前,用户输入了他们的个人详细信息,并且在上述步骤开始之前已经提交到数据库中,因此已经有一个数据库条目在等待此信息,一旦提交给数据库,将需要第三步,允许用户上传扫描图像以与此条目关联。但是我不认为这对这个即时问题至关重要。如果我错了,请让我知道

如何将初始表单中发布的内容以正确的格式列出以供审阅,然后将6个字段中的未知数字拼凑在一起保存到数据库中,同时允许我以后提取和重用数据?

我将试着把我现在的PHP代码粘贴到那里。请注意它还没有完全完成,但是你可以看到它的意图和它的目的——或者尝试去哪里

代码:

我已经在粘贴服务中粘贴了代码,因为它似乎稍微超出了此处的最大字符空间。我觉得整个代码对于理解所需的全部功能非常有用。在我发布第一个问题之前,我正在尝试覆盖此处的所有基础。但如果这是“不可执行”的事情,我深表歉意。:)完整代码可见于:

重申一下-使用texta_uu[]样式命名会破坏JS表单功能,因此这个问题正在寻找一种替代方法来满足要求。


感谢您的回复和时间!

只需使用
name=“texta[]”
-这将自动为您创建一个数组
$\u POST['texta'][0..n]
,包含所有元素。

如果您已经知道每个字段(texta、textb、textc等)的前缀,则可以使用此命令开始。这将循环,直到找不到更多字段。请注意,如果您有
texta_12
texta_14
,但没有
texta13
,那么它将在12处中断并停止

#   This array will contain the data.
$Res = array();

#   This variable will contain our current count. Start at 0.
$i=0;

#   We loop to the infinite !
while(TRUE){
    #   +1
    $i++;

    #   Are we done ?
    if(isset($_POST['texta_'.$i]) === FALSE){
        break;
    }

    #   We create our sub-array
    $Res[$i] = array(
        'text_a'     => $_POST['texta_'.$i], // Already tested...
        'text_b'     => (isset($_POST['textb_'.$i]) === TRUE ? $_POST['textb_'.$i] : ''),
        'text_c'     => (isset($_POST['textc_'.$i]) === TRUE ? $_POST['textc_'.$i] : ''),
        'text_box_a' => (isset($_POST['textboxa_'.$i]) === TRUE ? $_POST['textboxa_'.$i] : ''),
        'text_box_b' => (isset($_POST['textboxb_'.$i]) === TRUE ? $_POST['textboxb_'.$i] : ''),
        'select'     => (isset($_POST['select_'.$i]) === TRUE ? $_POST['select_'.$i] : '')
    );
}

#   We print our results
print_r($Res);
这没有经过测试,但这个概念会起作用

编辑:

好的-我认为这将满足您的需要:

#   This array will contain the data.
$Res = array(
    'text_a'     => array(),
    'text_b'     => array(),
    'text_c'     => array(),
    'text_box_a' => array(),
    'text_box_b' => array(),
    'select'     => array()
);

#   This variable will contain our current count. Start at 0.
$i=0;

#   We loop to the infinite !
while(TRUE){
    #   +1
    $i++;

    #   Are we done ?
    if(isset($_POST['texta_'.$i]) === FALSE){
        break;
    }

    #   We create our sub-array
    $Res['text_a'][$i] = $_POST['texta_'.$i];
    $Res['text_b'][$i] = (isset($_POST['textb_'.$i]) === TRUE ? $_POST['textb_'.$i] : '');
    $Res['text_c'][$i] = (isset($_POST['textc_'.$i]) === TRUE ? $_POST['textc_'.$i] : '');
    $Res['text_box_a'][$i] = (isset($_POST['textboxa_'.$i]) === TRUE ? $_POST['textboxa_'.$i] : '');
    $Res['text_box_b'][$i] = (isset($_POST['textboxb_'.$i]) === TRUE ? $_POST['textboxb_'.$i] : '');
    $Res['select'][$i] = (isset($_POST['select_'.$i]) === TRUE ? $_POST['select_'.$i] : '');
}

#   Here you can use a delimiter to merge them into one string
$TextA = implode('^', $Res['text_a']);

#   However, if you just want to store the data into one field in a more complex but more stable way, I suggest:
#   JSON
$TextA = json_encode($Res['text_a']);

#   Serialization
$TextA = serialize($Res['text_a']);

#   Now, $TextA is one big string that you can save into one MySQL field (make sure the field type is big enough for the length of the string).
#   You can read back the json using json_decode or unserialize

#   We print our results
print_r($Res);
MySQL存储字段长度限制:

TINYTEXT    256 bytes    
TEXT        65,535 bytes        ~64kb
MEDIUMTEXT  16,777,215 bytes    ~16MB
LONGTEXT    4,294,967,295 bytes ~4GB
在您的情况下,1个字符将占用1个字节

文件:


可怜的你……一个小小的答案有超长的解释……我更喜欢这样,而不是一个太短的毫无意义的问题。谢谢大卫。然而,试图清晰和简洁确实意味着要投入一点时间,我已经读了足够多的论坛帖子,知道他们到底想做什么/问什么的感觉!似乎我是我也错过了一个关键点-表单字段名值结构不能更改为支持[],因为这完全是错误的