У меня есть HTML-форма, которая имеет 2 динамических поля:
<input type="text" name="ingredients[]" placeholder="Ingredients"/></div> <input type="text" name="quantity[]" placeholder="Quantity"/></div>
Посмотрите здесь, как таблица db должна быть для тех входов в виде Ing 1 1001 1KG Ing 2 1001 2KG ing 3 1001 3KG
теперь проверьте изображение, и вы увидите, что происходит
DB Ингредиенты ТАБЛИЦА
У меня есть идентификатор рецепта в моем php-файле. Мне просто нужен код PDO, который помогает мне вводить INSERT «ингредиенты», «количество» и «$ recipe_ID» каждый в строке.
<?php header('Content-type: application/json'); require_once 'db/pdoconnect.php'; if($_POST) { $sth = $con->prepare("SELECT `recipeid` FROM Recipes ORDER BY `recipeid` DESC"); $sth->execute(); $previousid = $sth->fetchColumn(); $offset=1; $generatingid=$previousid+$offset; $newid=$generatingid; //print("Last Id=$previousid\n"); //print("New Id=$newid\n"); $title = $_POST['title']; $preptime = $_POST['preptime']; $cocktime = $_POST['cocktime']; $level = $_POST['level']; $serving = $_POST['serving']; $recipetype = $_POST['recipetype']; $intro = $_POST['intro']; $details = $_POST['details']; $image = $_POST['image']; try { $stmt = $con->prepare("INSERT INTO Recipes (recipeid,title,preptime,cocktime,level,serving,recipetype,intro,details,recipeimg) VALUES( :newid, :title, :preptime, :cocktime, :level, :serving, :recipetype, :intro, :details, :image)"); $stmt->bindParam(":newid",$newid); $stmt->bindParam(":title",$title); $stmt->bindParam(":preptime",$preptime); $stmt->bindParam(":cocktime",$cocktime); $stmt->bindParam(":level",$level); $stmt->bindParam(":serving",$serving); $stmt->bindParam(":recipetype",$recipetype); $stmt->bindParam(":intro",$intro); $stmt->bindParam(":details",$details); $stmt->bindParam(":image",$image); if($stmt->execute()) { //check if main query has been executed $sql = "INSERT INTO Ingredients VALUES"; for($i = 1 ; $i <= count($_POST['ingredients']) ; $i++){ $sql .= " (:recipeid" .$i. ", :ingredient" .$i. ", :quantity" .$i. "),"; } // remove the last (,) from the $sql $sql = rtrim($sql, ','); $sth = $con->prepare($sql); // binding parameters for($i = 1 ; $i <= count($_POST['ingredients']) ; $i++){ $varIng = $_POST['ingredients'][$i]; $varQnty = $_POST['quantity'][$i]; $sth->bindParam(':recipeid' .$i , $newid , PDO::PARAM_STR); $sth->bindParam(':ingredient' .$i , $varIng , PDO::PARAM_STR); $sth->bindParam(':quantity' .$i , $varQnty , PDO::PARAM_STR); } if ($sth->execute()) { $response_array['status'] = 'success'; } }//END OF FIRST IF STATEMENT else{ $response_array['status'] = 'error'; } echo json_encode($response_array); //SEND THE RESPONSE }//END OF TRY catch(PDOException $e){ echo $e->getMessage(); } } ?>
Предполагая, что имя таблицы указано в изображении, опубликованном в вашем вопросе ingredient_quantity
в вашей базе данных, и вы сказали, что у вас уже есть recipe-ID
PHP Fiddle
<?php $newid = 'A10'; //considering this is your table shown in the picture $sql = "INSERT INTO ingredient_quantity VALUES"; for($i = 1 ; $i <= count($_POST['ingredients']) ; $i++){ $sql .= " (:newid" .$i. ", :ingredient" .$i. ", :quantity" .$i. "),"; } // remove the last (,) from the $sql $sql = rtrim($sql, ','); $sth = $con->prepare($sql); // binding parameters for($i = 1 ; $i <= count($_POST['ingredients']) ; $i++){ $varIng = $_POST['ingredients'][$i]; $varQnty = $_POST['quantity'][$i]; $sth->bindParam(':newid' .$i , $newid , PDO::PARAM_STR); $sth->bindParam(':ingredient' .$i , $varIng , PDO::PARAM_STR); $sth->bindParam(':quantity' .$i , $varQnty , PDO::PARAM_STR); } $sth->execute(); ?>
ИЗМЕНИТЬ 1:
для вышеуказанного кода у меня ошибка, так как массив ingredients[]
начинается с 0
а не 1
, окончательный index
цикла for
будет undefined
, поэтому работа вокруг него делает последний цикл цикла следующим:
for($i = 0 ; $i < count($_POST['ingredients']) ; $i++){ $varIng = $_POST['ingredients'][$i]; $varQnty = $_POST['quantity'][$i]; $j = $i + 1; $sth->bindParam(':newid' .$j , $newid , PDO::PARAM_STR); $sth->bindParam(':ingredient' .$j , $varIng , PDO::PARAM_STR); $sth->bindParam(':quantity' .$j , $varQnty , PDO::PARAM_STR); }
ИЗМЕНИТЬ 2: Вы можете попробовать это сделать ?
заполнители вместо именных заполнителей, таких как PHP Fiddle 2 :
//considering this is your table shown in the picture $sql = "INSERT INTO ingredient_quantity VALUES"; for($i = 0 ; $i < count($_POST['ingredients']) ; $i++){ $sql .= " ( ? , ? , ? ) , "; } // remove the last (,) from the $sql $sql = rtrim($sql, ','); $sth = $con->prepare($sql); // binding parameters $j = 1; for($i = 0 ; $i < count($_POST['ingredients']) ; $i++){ $varIng = $_POST['ingredients'][$i]; $varQnty = $_POST['quantity'][$i]; $sth->bindValue( $j , $varIng); $sth->bindValue( $j + 1, $newid); $sth->bindValue( $j + 2, $varQnty); $j += 3; } $sth->execute();