如何遍历一组动态表单输入并将它们插入到多个表中?
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] => 额外说明)以上是关于如何遍历一组动态表单输入并将它们插入到多个表中?的主要内容,如果未能解决你的问题,请参考以下文章