如何遍历一组动态表单输入并将它们插入到多个表中?

Posted

技术标签:

【中文标题】如何遍历一组动态表单输入并将它们插入到多个表中?【英文标题】:How to loop through an array of dynamic form inputs and insert them into more than one table? 【发布时间】:2014-11-14 06:30:22 【问题描述】:

我有一个用于将食谱插入数据库的主表单。除了能够将一种以上的成分插入数据库之外,大多数表单都可以正常工作。

我想我需要一个数组来保存成分输入(成分名称、数量、测量类型),然后以某种方式循环遍历该数组,就像它被填写的次数一样(用户可以单击“添加新成分”按钮jquery 添加了一组新的输入)。我可能会自己解决这个问题,因为之前有人问过这个问题,但是......

...我遇到的真正问题是“成分名称”输入需要插入到一个表(成分)中,而“数量”和“测量类型”输入需要插入到另一个表中表(成分列表)。我不知道该怎么做。

<input type="text" name="ingredient_name" value="" />
<input type="text" name="amount" value="" />
<select name="measurement_ID" value=""> 
   <option value="14" >n/a</option> 
   <option value="1"  >teaspoon</option> 
   <option value="2"  >tablespoon</option> 
   <option value="3"  >fluid ounce</option> 
   <option value="4"  >cup</option> 
   <option value="5"  >pint</option> 
   <option value="6"  >quart</option> 
   <option value="7"  >pound</option> 
   <option value="8"  >ounce</option> 
   <option value="9"  >milligram</option> 
   <option value="10" >gram</option> 
   <option value="11" >millimeter</option> 
   <option value="12" >centimeter</option> 
   <option value="13" >inch</option>
</select>

我不确定是否可以使用我现在的表单设置正确处理它。

这是我迄今为止处理的成分输入(此设置只允许将第一种成分输入数据库)。

                $recipe_id = $pdo->lastInsertId('recipe_ID');

                //inputs inserted into ingredient table
                $query2 = $pdo->prepare('INSERT INTO ingredients (ingredient_name) VALUES (?)');
                $query2->bindValue(1, $ingname);

                $query2->execute();

                $ingredient_id = $pdo->lastInsertId('ingredient_ID');

                //inputs inserted into ingredient list table
                $query3 = $pdo->prepare('INSERT INTO ingredientLists (recipe_ID, ingredient_ID, amount, measurement_ID) VALUES (?,?,?,?)');
                $query3->bindValue(1, $recipe_id);
                $query3->bindValue(2, $ingredient_id);
                $query3->bindValue(3, $amount);
                $query3->bindValue(4, $measure);

                $query3->execute();

【问题讨论】:

【参考方案1】:

取出查询和 pdo 内容。

                $ingname     = $_POST['ingredient_name'];
                $amount      = $_POST['amount']; //ingredient amount
                $measure     = $_POST['measurement_ID']; //ingredient measurement


                for($i=0;$i<=count($ingname);$i++) 
                    if (isset($ingname[$i]))
                        print_r($_POST['ingredient_name']);
                    
                

当我打印包含成分名称的数组时,这就是结果。它只是重复数组四次,因为我输入了四种成分。我不确定这是好是坏。

Array ( [0] => cookies [1] => candy [2] => chocolate [3] => cake ) Array ( [0] => cookies [1] => candy [2] => chocolate [3] => cake ) Array ( [0] => cookies [1] => candy [2] => chocolate [3] => cake ) Array ( [0] => cookies [1] => candy [2] => chocolate [3] => cake )

【讨论】:

只计算 1 个变量 not this for($i=0;$i 你需要做的是取出查询和 pdo 的东西,然后在 for 循环中回显 sql 查询,看看你是否得到了所有你应该得到的。然后返回并添加数据库内容。 数量和测量也是如此。数组获取所有值,但随后数组重复输入的值的数量。 我只想感谢@FunkDoc 的所有帮助!根据您的反馈,我得到了它的工作。我比你知道的更感激! 干杯!对不起,那里有点残酷。当你前进时,你会习惯这些东西。编码愉快!【参考方案2】:

为了提交多行,您需要将它们放在一个数组中(注意名称后面的括号)

<input type="text" name="ingredient_name[]" value="" />
<input type="text" name="amount[]" value="" />
<select name="measurement_ID[]"> 
<option value="14" >n/a</option> 
<option value="1"  >teaspoon</option> 
<option value="2"  >tablespoon</option> 
<option value="3"  >fluid ounce</option> 
<option value="4"  >cup</option> 
<option value="5"  >pint</option> 
<option value="6"  >quart</option> 
<option value="7"  >pound</option> 
<option value="8"  >ounce</option> 
<option value="9"  >milligram</option> 
<option value="10" >gram</option> 
<option value="11" >millimeter</option> 
<option value="12" >centimeter</option> 
<option value="13" >inch</option>
</select>

当发布到您的 php 脚本时,它们将是您可以循环的数组。

$ingredient_name=$_POST['ingredient_name'];
$amount=$_POST['amount'];
$measurement_ID=$_POST['measurement_ID'];
for($i=0;$i<=count($ingredient_name);$i++) 
if (isset($ingredient_name[$i]))
//do your insert queries here you can insert to any tables you need to.
//the variables are accessed like this $ingredient_name[$i] 


下面是使用你的代码

$recipe_id = $pdo->lastInsertId('recipe_ID');

$ingname=$_POST['ingredient_name'];
$amount=$_POST['amount'];
$measure=$_POST['measurement_ID'];

for($i=0;$i<=count($ingname);$i++) 
if (isset($ingname[$i]))
$query2 = $pdo->prepare('INSERT INTO ingredients (ingredient_name) VALUES (?)');
$query2->bindValue(1, $ingname[$i]);
$query2->execute();
$ingredient_id = $pdo->lastInsertId('ingredient_ID');

$query3 = $pdo->prepare('INSERT INTO ingredientLists (recipe_ID, ingredient_ID, amount, measurement_ID) VALUES (?,?,?,?)');
$query3->bindValue(1, $recipe_id);
$query3->bindValue(2, $ingredient_id);
$query3->bindValue(3, $amount[$i]);
$query3->bindValue(4, $measure[$i]);
$query3->execute();


【讨论】:

好的,这看起来很简单。是这样吗?我仍然需要将成分名称输入到一个表(成分)中,并将数量和测量值输入到另一个表(成分列表)中。然后我从成分表中提取 lastInsertID(与刚刚输入的成分名称相关)并将其插入到成分列表表中,与刚输入的数量和测量值位于同一行。 根据您的反馈,我认为我在正确的轨道上,但它仍然无法正常工作。我将在下面发布我尝试过的内容。 我尝试使用它,但它仍然没有向成分表或成分列表表输入任何输入。为什么这只计算 ingname 并检查 ingname 是否设置?不应该也检查数量和测量值吗? 您可以查看是否需要。您是否像在名称后的括号中一样更改了 html?如果成分名称不是数组,则循环不会运行。当您发布时,您可以 print_r($_POST) 并将结果放在这里吗? 是的,我在表格中添加了括号。这是打印出来的整个表单提交。 Array ( [name] => My Recipe [category_ID] => 1 [ingredient_name] => Array ( [0] => orange [1] => apple ) [amount] => Array ( [0] => 2 [1 ] => 4) [measurement_ID] => 数组 ([0] => 14 [1] => 14) [servings_ID] => 9 [prep_hours] => [prep_minutes] => [cook_hours] => [cook_minutes] = > [oven_temp] => [directions] => 方向说明 [extra_cmets] => 额外说明)

以上是关于如何遍历一组动态表单输入并将它们插入到多个表中?的主要内容,如果未能解决你的问题,请参考以下文章

插入多个文本文件

如何将购物车中的多个项目插入表格中?

使用 Web 表单将数据插入到多个表中

雪花我们如何遍历临时表的每一行并将其值插入到另一个表中,其中每个字段的值都是单行?

使用foreach从动态post数组插入sql

如何知道是不是选中了表单中的多个复选框并将值插入数据库表c#