2016-10-07 3 views
2

Я получаю некоторые данные из формы в виде массивов. Каждый $_POST значение является сам массив:Как вставить несколько массивов в базу данных?

//Example snippet from my code; I have some more data/arrays 
$department_name = ($_POST[department_name]); 
$participant_name = ($_POST[participant_name]); 
$activity = ($_POST[activity]); 
$location = ($_POST[location]); 

Теперь я знаю, что я мог бы использовать цикл Еогеасп для цикла по каждому из этих массивов и подставлять соответствующие значения по одному в моей базе данных:

foreach($department_name as $department) { 
    $query = "INSERT INTO location_info (`department`) VALUES ('{$department}')"; 
    $result = mysqli_query($connection, $query); 
} 

Это похоже на много кода для всех моих 35 переменных POST, а также много работы для сервера. Что еще более важно, как я собираюсь «выровнять» каждую часть данных? Из-за цикла он создавал бы новую строку внутри базы данных каждую итерацию и оставлял пустые поля для всех остальных столбцов.

Так что я искал, как я мог цикл по нескольким массивам сразу и нашел это решение:

<?php 

    $ZZ = array('a', 'b', 'c', 'd'); 
    $KK = array('1', '2', '3', '4'); 

    foreach($ZZ as $index => $value) { 
     echo $ZZ[$index] . $KK[$index]; 
     echo "<br/>"; 
    } 

?> 

Но я действительно не понимаю, как это работает и как я могу применить это мой код?

В основном в качестве примера у меня есть несколько массивов, таких как:

$department_name = array("A", "B", "C"); 
$participant_name = array(1, 2, 3); 

И мне нужно, чтобы вставить их в свою базу данных, как это:

INSERT INTO location_info (`department`, `participant`) VALUES ('A', 1); 
INSERT INTO location_info (`department`, `participant`) VALUES ('B', 2); 
INSERT INTO location_info (`department`, `participant`) VALUES ('C', 3); 

Так что я думаю, что я должен использовать цикл Еогеасп и циклически перебирать все массивы сразу, чтобы вставлять данные по строкам, но я не вижу, как я могу применить код, который я нашел выше, к моему коду?


После некоторых полезных комментариев я переключился на PDO и добился определенного прогресса.

Мой текущий код выглядит следующим образом.

соединения:

<?php 

    try { 
     $dsn = 'mysql:host=localhost;dbname=assessment'; 
     $db = new PDO($dsn, 'xxx', 'xxx'); 
    } catch (Exception $e) { 
     $error = $e->getMessage(); 
    } 

?> 

Дальше у меня есть:

try { 

    $sql = "INSERT INTO location_info (`department`, `participant`, `activity`, `location`, `rec_injuries`, `rec_injuries_timeframe`, `non_rec_injuries`, `non_rec_injuries_timeframe`, `competitor`, `cost_per_pair`, `usage_rate`, `leakage`, `cost_of_productivity`, `non_rec_impact`, `non_rec_sprain`, `non_rec_puncture`, `non_rec_dermatitis`, `non_rec_infection`, `non_rec_burns`, `non_rec_cuts`, `rec_impact`, `rec_sprain`, `rec_puncture`, `rec_dermatitis`, `rec_infection`, `rec_burns`, `rec_cuts`, `condition`, `general_id`) 
     VALUES (:department, :participant, :activity, :location, :rec_injuries, :rec_injuries_timeframe, :non_rec_injuries_timeframe, :competitor, :cost_per_pair, :usage_rate, :leakage, :cost_of_productivity,:non_rec_impact, :non_rec_sprain, :non_rec_puncture, :non_rec_dermatitis, :non_rec_infection, :non_rec_burns, :non_rec_cuts, :rec_impact, :rec_sprain, :rec_puncture, :rec_dermatitis, :rec_infection, :rec_burns, :rec_cuts, :condition, :general_id)"; 

    $stmt = $db->prepare($sql); 

for($i = 0, $l = count($_POST["department_name"]); $i < $l; $i++) { 

    $loc_info = array(':department' => $_POST["department_name"][$i], 
        ':participant' => $_POST["participant_name"][$i], 
        ':activity' => $_POST["activity"][$i], 
        ':location' => $_POST["location"][$i], 
        ':rec_injuries' => $_POST["injuries"][$i], 
        ':rec_injuries_timeframe' => $_POST["injury_time_frame"][$i], 
        ':non_rec_injuries' => $_POST["non_rec_injuries"][$i], 
        ':non_rec_injuries_timeframe' => $_POST["non_rec_injury_timeframe"][$i], 
        ':competitor' => $_POST["competitor"][$i], 
        ':cost_per_pair' => $_POST["cost_per_pair"][$i], 
        ':usage_rate' => $_POST["usage_rate"][$i], 
        ':leakage' => $_POST["leakage"][$i], 
        ':cost_of_productivity' => $_POST["cost_of_productivity"][$i], 
        ':non_rec_impact' => $_POST["non_rec_impact"][$i], 
        ':non_rec_sprain' => $_POST["non_rec_sprain"][$i], 
        ':non_rec_puncture' => $_POST["non_rec_puncture"][$i], 
        ':non_rec_dermatitis' => $_POST["non_rec_dermatitis"][$i], 
        ':non_rec_infection' => $_POST["non_rec_infection"][$i], 
        ':non_rec_burns' => $_POST["non_rec_burns"][$i], 
        ':non_rec_cuts' => $_POST["non_rec_cuts"][$i], 
        ':rec_impact' => $_POST["impact"][$i], 
        ':rec_sprain' => $_POST["sprain"][$i], 
        ':rec_puncture' => $_POST["puncture"][$i], 
        ':rec_dermatitis' => $_POST["dermatitis"][$i], 
        ':rec_infection' => $_POST["infection"][$i], 
        ':rec_burns' => $_POST["burns"][$i], 
        ':rec_cuts' => $_POST["cuts"][$i], 
        ':condition' => $_POST["condition"][$i], 
        ':general_id' => $_POST["id"][$i] 
      ); 

    $stmt->execute($loc_info);  
} 

} catch (Exception $e) { 
    $error = $e->getMessage(); 
} 

Но это все еще не работает.

Мысли? Могу ли я помещать массив внутри массива?

+1

Просто сделайте простой подготовленный оператор и привяжите все значения к нему. Смотрите: http://php.net/manual/en/pdo.prepare.php – Rizier123

+0

wow - я знал, что там может быть решение. Спасибо. Я расскажу о своем обновленном коде –

+0

. Думаю, вы делаете это более сложным, чем это. Вы просто хотите сделать простой запрос здесь. Также взгляните на: http://stackoverflow.com/q/6980792/3933332, чтобы увидеть несколько простых примеров использования PDO – Rizier123

ответ

2

Ok после нескольких проб и ошибок, и некоторой помощи от @ Rizier123, вот ответ:

HTML на странице формы

Ради ясности, я пытался выяснить, как добавить несколько массивов данных для моего db.Так что на динамической странице формы, у меня есть входы, аналогичные:

<p>Location: <input type='text' name='location[]' > </p> 

Обработка формы и ввода данных в БД

Во-первых, я перешел от MySQLi к PDO, то я побежал со следующим код:

try { 
     $sql = "INSERT INTO location_info (`department`, `participant`, `activity`, `location`, `rec_injuries`, `rec_injuries_timeframe`, `non_rec_injuries`, `non_rec_injuries_timeframe`, `competitor`, `cost_per_pair`, `usage_rate`, `leakage`, `cost_of_productivity`, `non_rec_impact`, `non_rec_sprain`, `non_rec_puncture`, `non_rec_dermatitis`, `non_rec_infection`, `non_rec_burns`, `non_rec_cuts`, `rec_impact`, `rec_sprain`, `rec_puncture`, `rec_dermatitis`, `rec_infection`, `rec_burns`, `rec_cuts`, `condition`, `general_id`) 
     VALUES (:department, :participant, :activity, :location, :rec_injuries, :rec_injuries_timeframe, :non_rec_injuries, :non_rec_injuries_timeframe, :competitor, :cost_per_pair, :usage_rate, :leakage, :cost_of_productivity,:non_rec_impact, :non_rec_sprain, :non_rec_puncture, :non_rec_dermatitis, :non_rec_infection, :non_rec_burns, :non_rec_cuts, :rec_impact, :rec_sprain, :rec_puncture, :rec_dermatitis, :rec_infection, :rec_burns, :rec_cuts, :condition, '{$id}')"; 

     $stmt = $db->prepare($sql); 

for($i = 0, $l = count($_POST["department_name"]); $i < $l; $i++) { 

    $loc_info = array(':department' => $_POST["department_name"][$i], 
         ':participant' => $_POST["participant_name"][$i], 
         ':activity' => $_POST["activity"][$i], 
         ':location' => $_POST["location"][$i], 
         ':rec_injuries' => $_POST["injuries"][$i], 
         ':rec_injuries_timeframe' => $_POST["injury_time_frame"][$i], 
         ':non_rec_injuries' => $_POST["non_rec_injuries"][$i], 
         ':non_rec_injuries_timeframe' => $_POST["non_rec_injury_timeframe"][$i], 
         ':competitor' => $_POST["competitor"][$i], 
         ':cost_per_pair' => $_POST["cost_per_pair"][$i], 
         ':usage_rate' => $_POST["usage_rate"][$i], 
         ':leakage' => $_POST["leakage"][$i], 
         ':cost_of_productivity' => $_POST["cost_of_productivity"][$i], 
         ':non_rec_impact' => $_POST["non_rec_impact"][$i], 
         ':non_rec_sprain' => $_POST["non_rec_sprain"][$i], 
         ':non_rec_puncture' => $_POST["non_rec_puncture"][$i], 
         ':non_rec_dermatitis' => $_POST["non_rec_dermatitis"][$i], 
         ':non_rec_infection' => $_POST["non_rec_infection"][$i], 
         ':non_rec_burns' => $_POST["non_rec_burns"][$i], 
         ':non_rec_cuts' => $_POST["non_rec_cuts"][$i], 
         ':rec_impact' => $_POST["impact"][$i], 
         ':rec_sprain' => $_POST["sprain"][$i], 
         ':rec_puncture' => $_POST["puncture"][$i], 
         ':rec_dermatitis' => $_POST["dermatitis"][$i], 
         ':rec_infection' => $_POST["infection"][$i], 
         ':rec_burns' => $_POST["burns"][$i], 
         ':rec_cuts' => $_POST["cuts"][$i], 
         ':condition' => $_POST["condition"][$i]); 

$stmt->execute($loc_info); 
} 
+0

Немного вещей: 1) Во-первых, отличная работа! Вы действительно приняли мои советы в комментариях и сделали свою работу. 2) Возможно, вам захочется взглянуть на редактирование, которое я сделал на ваш вопрос, и что именно я улучшил, поэтому вы можете сделать то же самое в следующий раз. 2.1) Например, я урезал присвоения значений POST нескольким из них в качестве примера вместо того, чтобы показывать как 35 присваиваний. 2.2) Я удалил нерелевантный код для вопроса, например, часть перенаправления дырок 2.3). Я добавил простой пример с двумя массивами, каждый с 3, чтобы показать базовый пример того, что вы пытаетесь выполнить. – Rizier123

+0

3) Side thingy, вам не нужно класть скобки вокруг ваших значений post для простого назначения, просто '$ xy = $ _POST [" xy "];' 4) Теперь, наконец, у вас все еще есть проблема/вопрос которые вы описали в комментариях по вашему вопросу? – Rizier123

+0

@ Rizier123, так что это странно - теперь я замечаю, что пока это работает, его добавление лишней пустой строки в db каждый раз - мысли? –