从JavaScript函数重新定义PHP中的字段名


Redefining field names in PHP from a JavaScript Function

在问了一个关于设置动态字段的问题(请参阅Javascript函数来添加/删除字段)后,我想出了一个我认为很好的Javascript解决方案,即使用一个允许用户添加和删除一组字段的表单。这是javascript函数:

var fieldcount = 2;
var count = 2;
window.createinput = function (field1, field2, field3, area, limit) {
    if (count > limit) return;
    field_area = document.getElementById(area);
    var qty = document.createTextNode("Quantity");
    var msr = document.createTextNode("  Measure");
    var ing = document.createTextNode("  Ingredient Name");
    var li = document.createElement("li");
    var input = document.createElement("input");
    input.id = field1 + fieldcount;
    input.name = field1 + fieldcount;
    input.size = "10";
    input.type = "text"; //Type of field - can be any valid input type like text,file,checkbox etc.
    li.appendChild(qty);
    li.appendChild(input);
    var input2 = document.createElement("input");
    input2.id = field2 + fieldcount;
    input2.name = field2 + fieldcount;
    input2.size = "20";
    input2.type = "text"; //Type of field - can be any valid input type like text,file,checkbox etc.
    li.appendChild(msr);
    li.appendChild(input2);
    var input3 = document.createElement("input");
    input3.id = field3 + fieldcount;
    input3.name = field3 + fieldcount;
    input3.size = "30";
    input3.type = "text"; //Type of field - can be any valid input type like text,file,checkbox etc.
    li.appendChild(ing);
    li.appendChild(input3);
    field_area.appendChild(li);
    //create the removal link
    var removalLink = document.createElement('a');
    removalLink.className = "remove";
    removalLink.onclick = function () {
        this.parentNode.parentNode.removeChild(this.parentNode);
        count = count - 1;
    }
    var removalText = document.createTextNode('Remove Field Group');
    removalLink.appendChild(removalText);
    li.appendChild(removalLink);
    fieldcount++ //loop in php to handle renaming variables for database entry based on total number of field groups
    count++
}

引用此函数的HTML代码如下:

<ul id="ingredients">
    <li>Quantity<input type="text" name="ingredient_quantity_1" id="ingredient_quantity_1" size="10" />  Measure<input type="text" name="ingredient_measure_1" id="ingredient_measure_1" size="20" />  Ingredient Name<input type="text" name="ingredient_name_1" id="ingredient_name_1" size="30" /></li>
</ul>
<input type="button" value="Add Ingredient" onclick="createinput('ingredient_quantity_','ingredient_measure_','ingredient_name_','ingredients', 5)" />

您也可以在http://jsfiddle.net/wtX7Y/82/

问题是,当我想在PHP中获得这些表单值时,字段名只能达到函数调用中定义的限制,但这些值在序列中可能有间隙(例如,ingredient_name_1、ingredient_name _3、ingredient _name_4),因为可以通过removalLink.onclick函数删除表单中的字段。

我要么需要在PHP中编写一些机制,可以在某种类型的序列中检索/重新定义这些字段名值以发送到数据库,要么重新起草JavaScript函数以完全消除这种需要,并为PHP编写一个正常的序列,用一个简单的迭代循环来检索值。在我的搜索中,我没有遇到过这个特定的问题,但我看到人们建议使用数组来处理变量的命名,我想知道这是否是正确的方法。

使用我现有的代码-我一直试图用PHP for循环解决我的问题,如下所示,但我不知道如何在循环中进行两个单独的计数(一个用于定义新变量名,另一个用于检索要重新定义的字段名值):

$field_count = 1; 
for($i = 1; $i <= 25; $i++) 
{   
    if(isset($_REQUEST['ingredient_quantity_' . $field_count]))
    {
        ${'ingredient_quantity_' . $i} = $_REQUEST['ingredient_quantity_' . $field_count];
        ${'ingredient_measure_' . $i} = $_REQUEST['ingredient_measure_' . $field_count];
        ${'ingredient_name_' . $i} = $_REQUEST['ingredient_name_' . $field_count];
        echo $i . ". Field Count:" . $field_count . " - " . ${'ingredient_quantity_' . $i} . " " . ${'ingredient_measure_' . $i} . " " . ${'ingredient_name_' . $i} . "<br />";
    } 
    $field_count++;
}

最重要的是,我只需要一种方法来计算具有特定字段名称前缀的集合字段的数量(例如,"ingredient_quantity_")及其特定数量,这样我就可以执行数据库查询来插入数据。我是否根据字段输入创建数组?还有别的吗?

您可以将[]添加到输入元素的名称(而不是ID)中,无论您有多少输入元素,PHP都会将其转换为一个整洁的数组。

但这种方法存在问题。您需要跟踪哪个ingredient_name对应于哪个ingreditem_quantity和ingredient_measure。把所有东西都倒在一个数组中可能会导致你把一种成分的名称和另一种成分数量混淆。这不好,是吗?

所以你最好的选择是这样的:

$ingredients = array();  // Initialize array
foreach ($_POST as $key => $value) {
    if (!strncmp($key, 'ingredient_name_', 16)) {  // If field name begins with "ingredient_name_"
        $ingredients[] = array(
            'name' => $_POST[$key],
            'quantity' => $_POST[('ingredient_quantity_'.substr($key, 16))],
            'measure' => $_POST[('ingredient_measure_'.substr($key, 16))],
        );
    }
}

简而言之,答案是通过对提交的数据进行循环来构建自己的$ingredients数组。任何其他具有固定名称的字段都可以正常处理。如果你想知道有多少成分,你只需要做count($ingredients)。即使有数百种成分,这也会起作用,不像你目前的代码有25种人为限制。

该解决方案假设,无论何时,只要有一个名为ingredient_name_(数字)的字段,也会有名为ingredient_quantity_(相同的数字)和ingredient_measure_(相同的编号)的字段存储相应的数据。如果不是这样(例如,如果某些字段是可选的),只需选择一个必需的字段,在$_POST数组中查找该字段,并添加一些处理缺失字段的条件。