Вставка данных массива в базу данных с использованием PDO - PullRequest
1 голос
/ 12 марта 2012

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

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 для подключения к моей базе данных, но я не уверен, как вставить данные из массива в строки в моей базе данных.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 12 марта 2012

Ну, я бы структурировал свою форму немного по-другому, так что вы получите компоненты, собранные как их собственный массив, но с 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?
}
1 голос
/ 12 марта 2012

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

<?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 автоматически создаст индексы.

0 голосов
/ 12 марта 2012

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

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

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

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

Вы можете видеть, как движется [...].Вам необходимо сопоставить формат массива с форматом вашей базы данных.Это проще всего сделать с помощью 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-запрос на вставку, поэтому я не помещаю его в ответ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...