0

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

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

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

“texta_1”、“textb_1”、“textc_1”、“textboxa_1”、“textboxb_1”、“select_1”

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

“texta_2”、“textb_2”、“textc_2”、“textboxa_2”、“textboxb_2”、“select_2”、“texta_3”、
“textb_3”、“textc_3”、“textboxa_3”、“textboxb_3”、“select_3”

对于可以扩展到多远/多少没有定义的限制,尽管出于此目的,这旨在用于意味着将使用它并有权访问它的小组将不需要输入超过一次 10 行。

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

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

我还需要将用于/在这 6 个 DB 列中的每一个列中的数据放入一个 foreach 循环中,以便在提交到 DB 之前显示,当然还有稍后从 DB 中再次提取它时显示。

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

我如何获取初始表单中发布的内容并以正确的格式很好地列出以供审查,然后将 6 个字段中每个字段的未知数量聚集在一起以保存到数据库中,同时还允许我提取和重用数据稍后的?

我将尝试在其中粘贴我目前拥有的 PHP 代码。请注意,它还没有完全完成,但您可以看到意图和它的去向——或尝试去哪里!

代码:

我已将代码粘贴到粘贴服务中,因为它看起来略微超过了此处的最大字符空间。我觉得整体代码对于理解所需的全部功能很有用。在我发布第一个问题之前,我试图在这里涵盖所有基础。不过,如果这是“不该做”的事情,我深表歉意。:) 完整代码可见于: http: //pastie.org/8391018#

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

感谢回复和时间,谢谢!

4

2 回答 2

1

只需使用name="texta[]"- 这将自动为您创建一个数组$_POST['texta'][0..n],其中包含所有元素。

于 2013-10-09T23:40:53.487 回答
1

如果您已经知道每个字段的前缀(texta、textb、textc 等),则可以使用它来开始。这将循环直到找不到更多字段。请注意,如果您有 let's say texta_12andtexta_14但 no 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 个字节。

文件:

于 2013-10-10T02:22:14.287 回答