2012-03-11 4 views
1

Может кто-нибудь объяснить мне, как я могу импортировать данные массива, которые я выводил в строки в моей базе данных.Ввести данные массива в базу данных с помощью PDO

HTML

<form id="AddRecipeForm" method="post" action="includes/add-recipe.php" class="form-inline">  
    <input type="text" name="recipe[ingredient][1]" class="input-large" placeholder="Title 1"><input type="text" name="recipe[quantity][1]" class="input-large" placeholder="Quantity 1"><br /><br /> 
    <input type="text" name="recipe[ingredient][2]" class="input-large" placeholder="Title 2"><input type="text" name="recipe[quantity][2]" class="input-large" placeholder="Quantity 2"><br /><br /> 
    <input type="text" name="recipe[ingredient][3]" class="input-large" placeholder="Title 3"><input type="text" name="recipe[quantity][3]" class="input-large" placeholder="Quantity 3"><br /><br /> 
    <button type="submit" class="btn">Add Recipe</button> 
</form> 

Это передается в виде PHP:

foreach($_POST['recipe'] as $key=>$value) 
    { 

    } 

print_r($_POST); 

и выводит следующий массив:

Array ( 
    [recipe] => Array ( 
     [ingredient] => Array ( 
      [1] => eggs 
      [2] => milk 
      [3] => flour 
     ) [quantity] => Array ( 
      [1] => 12 
      [2] => 13 
      [3] => 14 
     ) 
    ) 
) 

Мне нужно импортировать каждый из отдельных ингредиентов и количества в новую строку в моей таблице базы данных. Я использую PDO для подключения к моей базе данных, но я не уверен, как я могу вставить данные из массива в строки моей базы данных.

Спасибо.

+0

Реорганизация базы данных и отдельная таблица ингредиентов ... не хранить их все в столбце таблицы рецептов –

+0

@Mark Baker спасибо за комментарий. У меня в настоящее время моя база данных разделена на таблицы ингредиентов, рецептов и таблиц рецептов. Мне нужно получить данные из массива и вставить это в таблицу элементов рецепта, но я не уверен, как я могу это сделать с помощью PDO. Любая помощь приветствуется. –

ответ

2

Ну я бы stucture моя форма немного по-другому, так что вы получите ingerdients assemebled как их собственный массив, но с stcuture у вас есть:

$db = new PDO($dsn, $user, $pass); 

$stmt = $db->prepare('INSERT INTO ingredient (name, quantity) VALUES (?,?)'); 

// youll want to verify that both arrays have the same number of elements before doing this 
// as part of your validation 
$ingredients = array_combine($_POST['recipe']['ingredient'], $_POST['recipe']['quantity']); 

$errors = array(); 

foreach($ingredients as $name => $quantity) 
{ 
    try { 
     $stmt->execute(array($name, $quantity)); 
    } catch (PDOException $e) { 
     $errors[] = array(
      'message' => "Could not insert \"$name\", \"$quantity\".", 
      'error' => $e 
    }  
} 

if(!empty($errors)) { 
    //do something? 
} 
+0

Спасибо всем за сообщения @prodigitalson ваш код выше сделал трюк. Это очень ценится! –

0

Я предполагаю, что ваша проблема формат $_POST массива. У вас есть:

[recipe][ingredient][...] and 
[recipe][quantity][...] 

Однако это не структура базы данных, организовавшего ее в строках и столбцах:

[recipe][...][ingredient, quantity] 

Вы можете увидеть, как [...] движется вокруг. Вам необходимо указать map формат массива в формат вашей базы данных. Это проще всего сделать с помощью foreach:

$recipes = array(); # Zero rows to insert we start with. 
$formRecipes = $_POST['recipe']; # The form recipes are located here. 

# The [...] part is in ingredient: 
foreach ($formRecipes['ingredient'] as $index => $ingredient) 
{ 
    # the [...] part is $index now 
    $recipes[$index]['ingredient'] = $ingredient;  
    $recipes[$index]['quantity'] = $formRecipes['quantity'][$index]; 
} 

После того как вы запустите это, используйте print_r, чтобы проверить, все было сделано правильно:

print_r($recipes); 

Вы можете теперь использовать $recipes массив, чтобы вставить свои данные в базы данных для каждой строки (я предполагаю, что вы знаете, как вы вставляете SQL-запрос, поэтому я не помещаю его в ответ).

1

Простой пример без проверки ошибок:

<?php 

    $dbc = new PDO(/* ... */); 

    $stmt = $dbc->prepare("INSERT INTO tbl(ingredient,quantity) VALUES(:ingredient,:quantity);"); 
    $numIngredients = count($_POST['recipe']['ingredient']); 
    for ($i=1; $i <= $numIngredients; $i++) { 
     $stmt->execute(array(
      ':ingredient' => $_POST['recipe']['ingredient'][$i], 
      ':quantity' => $_POST['recipe']['quantity'][$i] 
     )); 
    } 

?> 

Обратите внимание, что, как правило, вы должны начать отсчет индексов от 0, и если вы просто написать recipe[ingredient][] PHP будет автоматически создавать индексы.

Смежные вопросы