Как перебрать массив входов динамической формы и вставить их в несколько таблиц?

У меня есть мастер-форма для вставки рецептов в базу данных. Большая часть формы работает, за исключением возможности вставлять в базу данных более одного ингредиента.

Я думаю, что мне нужен массив для хранения входных данных ингредиента (имя_ ингредиента, количество, тип измерения), а затем каким-то образом перебрать этот массив столько раз, сколько он был заполнен (пользователь может нажать кнопку «добавить новый ингредиент», и 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

Решение

Чтобы отправить несколько строк, вам нужно поместить их в массив (обратите внимание на квадратные скобки после имени)

<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();
}
}
1

Другие решения

Вытащил запросы и прочее.

                $ingname     = $_POST['ingredient_name'];
$amount      = $_POST['amount']; //ingredient amount
$measure     = $_POST['measurement_ID']; //ingredient measurementfor($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 )
0

По вопросам рекламы [email protected]