За последние 24 часа нас посетил 73621 программист и 10181 робот. Сейчас ищут 2532 программиста ...

(PHP)Запись в базу MySQL данных из многоуровневого массива $_POST каждый уровень в свою таблицу

Тема в разделе "PHP для новичков", создана пользователем roman_php, 1 ноя 2022.

  1. roman_php

    roman_php Активный пользователь

    С нами с:
    20 сен 2009
    Сообщения:
    39
    Симпатии:
    1
    Доброго времени суток!

    Прошу откликнуться и помочь с запросом к базе для создания записей в ней, два дня по всякому пытаюсь реализовать не получается.

    В файл .php где будет запрос к базе на MySQL приходят данные из формы посредствам POST. Проблема в том, что данные приходят в виде многомерного массива и я это ни как поменять не могу (есть скрипт который делает динамическую таблицу и туда автоматом прописываются ключи, которые в последствии становиться ключами в многомерном массиве на 2-м его уровне.)

    данные в POST которые приходят выглядят так:
    Код (Text):
    1. Array
    2. (
    3.     [adres] => г. Орел
    4.     [shema] => ДДА
    5.     [0] => Array
    6.         (
    7.             [nomer_r_doc] => 4.1
    8.             [vib_r_doc] => risk_doc
    9.             [text_r_doc] => 11
    10.             [nomer_r_dog] => 5.1
    11.             [vib_r_dog] => risk_dog
    12.             [text_r_dog] => 44
    13.         )
    14.  
    15.     [1] => Array
    16.         (
    17.             [nomer_r_doc] => 4.2
    18.             [vib_r_doc] => min_doc
    19.             [text_r_doc] => 22
    20.         )
    21.  
    22.     [2] => Array
    23.         (
    24.             [nomer_r_doc] => 4.3
    25.             [vib_r_doc] => st_r_doc
    26.             [text_r_doc] => 33
    27.         )
    28.  
    29.     [ka] => 5
    30.     [objekt] => 6
    31.     [zemly] => 7
    32.     [dop_info] => 8
    33.     [fas] => 9
    34.     [no_dok] => 10
    35.     [rezoluciy] => sogl_zamech
    36.     [send] => Сформировать ЮЗ
    Причем, важно, что второй уровень массива не заканчивается ключами 0 и 1, там может быть сколько угодно ключей со значениями, но еще одной вложенности скажем в массив с индексом 2 уже не будет!

    В базе есть 2 таблицы следующего вида:

    dop_baza.jpg baza.jpg

    просто вывести все содержание пришедшего массива $_POST я могу (подсказали)
    PHP:
    1. <?php
    2. if (!empty($_POST)){
    3.     foreach ($_POST as $key => $value) {
    4.         if(is_array($value))
    5.         {
    6.             foreach ($value as $key_2 => $value_2) {
    7.                 //вложенный массив
    8.                 echo $key_2. '=>'.$value_2."<br />";
    9.             }
    10.         }
    11.         else echo $key. '=>'.$value."<br />";
    12.     }
    13. }
    14. ?>
    Но моя задача записать из этого пришедшего массива данные в разные таблицы, должно быть так:

    1)данные из массива с ключами adres, shema уже могут быть в таблице 'baza' в столбцах соответственно adres, shema, так как до формирования формы которая отправляет этот двумерный массив, есть форма которая уже заносит в таблицу следующие поля adres, shema, sessiya, region, status, но поскольку инпуты в первой форме с ключами adres, shema не обязательны на данном этапе, то именно эти поля могут быть определены в таблице как NULL, получается нужно проверить, если не NULL то заносим adres, shema при этом идентификатором строки в таблице куда нужно занести будет поле sessiya, на страницу где должен отработать скрипт занесения базу значения поля sessiya передается $_GET, соответственно этот идентификатор есть:

    PHP:
    1. $sessiya = $_GET['sessiya'];
    2)вторая цель занести именно в таблицу `dop_baza` в одноименные поля следующие значения из второго уровня массива: nomer_r_doc, vib_r_doc, text_r_doc, nomer_r_dog, vib_r_dog, text_r_dog. При всем при этом особенность в том, что в полученном массиве $_POST может быть несколько вложенных массивов 2 уровня и соответственно значений этих ключей может быть несколько. Таким образом получается, что через цикл нужно занести все значения, при этом поле id_b у все записей получается как как идентификатор на таблицу 'baza' и они при записи одинаковые, сам идентификатор так же передается уже на страницу со скриптом и доступен в переменной:

    PHP:
    1. $id_baza = $_GET['id_baza'];
    Вот такую запись в базу в разные таблицы из многомерного массива мне нужно реализовать.
    Я понимаю, что тут изначально, что-то не так, а конкретно, если бы не создавался этот многомерный массив, то скорее всего и проблем бы таких не было. Я не знаю можно ли вообще такое реализовать, у меня не получается.

    Буду очень признателен за любую помощь.
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.875
    Симпатии:
    756
    Адрес:
    Татарстан
    ну вывод же есть...
    вместо вывода - записывайте в БД

    PHP:
    1. <?php
    2. if (!empty($_POST)){
    3.     foreach ($_POST as $key => $value) {
    4.        /* $last_id = тут вставляем в первую таблицу и получаем ид записи */
    5.         if(is_array($value))
    6.         {
    7.             foreach ($value as $key_2 => $value_2) {
    8.                 //вложенный массив
    9.                 /* тут записываем во вторую таблицу в цикле - используя $last_id для связи с первой */
    10.             }
    11.         }
    12.     }
    13. }
    14. ?>
    примерно так
     
  3. roman_php

    roman_php Активный пользователь

    С нами с:
    20 сен 2009
    Сообщения:
    39
    Симпатии:
    1
    Доброго времени суток!

    Спасибо Вам, что не прошли мимо и не указали мне, на мою беспомощность, как на одном из форумов мне написали, когда я просил помочь:
    "нет никакого желания браться за эту задачу, по одним именам ключей массива и названиям полей в БД, видно что код писал полный профан, поэтому "не в коня корм"", да вы и сами на этом форуме это видели. И человек то в общем то прав!

    На том форуме вы мне задали вопрос: "я же вам на другом форуме ответил как сделать.... или прямо надо сделать за вас?"

    Если возможно, я был бы вам признателен, потому, что я как только не крутил и вот не как не могу понять, как же мне в цикле каждый раз делать запись значений из массива в свою таблицу. Я как только не крутил $key и $value и пытался прямо прописывать к каким ключам обращаюсь $key['adres'] не чего не получается.
     
  4. roman_php

    roman_php Активный пользователь

    С нами с:
    20 сен 2009
    Сообщения:
    39
    Симпатии:
    1
    Может кто ни будь поможет из уважаемых программистов. Наверное надо было и мне по-точнее объяснить с самого начала, откуда берётся такой многомерный массив.
    Есть некая таблица внутри которой есть форма, при этом таблица в некоторой части динамическая, т.е. есть кнопки + и - соответственно они посредством JS скрипта добавляют к таблице:
    HTML:
    1. <tbody id="dynamic">
    2.     <tr>
    3.         <td width="5%" class="td_namber_table"><input style="width: 100%; text-align: center; font-size: 14px; font-weight: 900" type="text" form="form_uz" name="nomer_r_doc" placeholder="№п/п"></td>
    4.         <td width="30%">
    5.             <label>
    6.                 <select style="width: 100%; text-align: center; font-size: 14px; padding: 10px" form="form_uz" name="vib_r_doc">
    7.                     <option value="" disabled selected hidden>Выбрать из списка</option>
    8.                     <option value="risk_doc">Описание риска:</option>
    9.                     <option value="min_doc">Минимизация:</option>
    10.                     <option value="st_r_doc">Степень риска:</option>
    11.                 </select>
    12.             </label>
    13.         </td>
    14.         <script>autosize($('textarea'));</script>
    15.         <td width="60%"><textarea style="width: 99%; text-align: left; font-size: 14px" rows="3" cols="113" class="bloggood" form="form_uz" name="text_r_doc" placeholder="Обязательное поле для заполнения!"></textarea></td>
    16.         <td width="5%">
    17.             <button type="button" class="add">+</button>
    18.             <button type="button" class="del">-</button>
    19.         </td>
    20.     </tr>
    21.     </tbody>
    таким образом формируется второй уровень массива, который передается на отработку в _POST на следующую страницу со скриптом, где все эти данные из массива и надо записать в базу, причем, данный из массива первого уровня в таблицу `baza`с уникальным id ключом, а данные из массива 2-го уровня в свою таблицу `dop_baza` в которой поле id_b это уникальный номер в поле id в таблице `baza`, таким образом таблицы подвязываются, что бы в последствии из этих двух таблиц можно было опять собрать в единое целое форму юридического заключения.

    Подробнее наглядно, это таблица с формой где не нажата кнопка "выявлены" и соответственно после отправки формы у нас нормальный массив с одним уровнем:
    tabl_1arr.jpg
    Это таблица с формой после нажатия кнопки "выявлены" в этом случае появляется возможность динамически строить таблицу скриптом JS добавляя или удаляя поля, из них как раз и формируется массив 2-го уровня:
    tabl_2arr.jpg

    А это поля которые обязательны пользователем для заполнения и которые проверяются на заполняемость:
    tabl_obaz.jpg

    А это скрипт на JS который делает некоторые части таблицы с формой динамической, скрипт скопированный с просторов интернета:
    Код (Javascript):
    1. var DynamicTable = (function (GLOB) {
    2.     var RID = 0;
    3.     return function (tBody) {
    4.         /* Если ф-цию вызвали не как конструктор фиксим этот момент: */
    5.         if (!(this instanceof arguments.callee)) {
    6.             return new arguments.callee.apply(arguments);
    7.         }
    8.         //Делегируем прослушку событий элементу tbody
    9.         tBody.onclick = function(e) {
    10.             var evt = e || GLOB.event,
    11.                 trg = evt.target || evt.srcElement;
    12.             if (trg.className && trg.className.indexOf("add") !== -1) {
    13.                 _addRow(trg.parentNode.parentNode, tBody);
    14.             } else if (trg.className && trg.className.indexOf("del") !== -1) {
    15.                 tBody.rows.length > 1 && _delRow(trg.parentNode.parentNode, tBody);
    16.             }
    17.         };
    18.         var _rowTpl = tBody.rows[0].cloneNode(true);
    19.         // Корректируем имена элементов формы
    20.         var _correctNames = function (row) {
    21.             var elements = row.getElementsByTagName("*");
    22.             for (var i = 0; i < elements.length; i += 1) {
    23.                 if (elements.item(i).name) {
    24.                     if (elements.item(i).type &&
    25.                         elements.item(i).type === "radio" &&
    26.                         elements.item(i).className &&
    27.                         elements.item(i).className.indexOf("glob") !== -1)
    28.                     {
    29.                         elements.item(i).value = RID;
    30.                     } else {
    31.                         elements.item(i).name = RID + "["+ elements.item(i).name +"]";
    32.                     }
    33.                 }
    34.             }
    35.             RID++;
    36.             return row;
    37.         };
    38.         var _addRow = function (before, tBody) {
    39.             var newNode = _correctNames(_rowTpl.cloneNode(true));
    40.             tBody.insertBefore(newNode, before.nextSibling);
    41.         };
    42.         var _delRow = function (row, tBody) {
    43.             tBody.removeChild(row);
    44.         };
    45.         _correctNames(tBody.rows[0]);
    46.     };
    47. })(this);
     
  5. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    Для добавления записей в таблицу используется SQL-команда:
    INSERT INTO <Имя таблицы> [(<Поле1>, <Поле2>, ...)]
    VALUES ('<Значение1>', '<Значение2>', ...);
    Это я из книги цитирую.
    Но сначала надо соединиться с базой данных:
    $db = mysqli_connect(<Имя хоста>, <Имя пользователя>, <Пароль>,
    <База данных>);
    Потом внутри цикла составить строку запроса:
    $query = "
    INSERT INTO <Имя таблицы>
    VALUES (null, '<Значение1>', '<Значение2>','<Значение3>' итд)";
    И выполнить запрос:
    mysqli_query($db, $query);
    цикл закончился
    закрыть соединение:
    mysqli_close($db);
     
  6. roman_php

    roman_php Активный пользователь

    С нами с:
    20 сен 2009
    Сообщения:
    39
    Симпатии:
    1
    @antoniii, добрый день!

    Сделано.

    в том то и дело не знаю как обратиться к нужным полям таблицы, что бы нужное значение подставлялось, массив то не одномерный
    PHP:
    1. <?php
    2. if (!empty($_POST)){
    3.     foreach ($_POST as $key => $value) {
    4.       $arr1 = "INSERT INTO `baza` SET как обратиться к полю adres в таблице baza = как записать из массива $_POST c ключом ["adres"], и т.д. из первого уровня массива $_POST";
    5.       $add = mysqli_query($db, $arr1);
    6.         if(is_array($value))
    7.         {
    8.             foreach ($value as $key_2 => $value_2) {
    9.                 //вложенный массив
    10.                 $arr2 = "INSERT INTO `dop_baza` SET как обратиться к полю nomer_r_doc в таблице dop_baza = как записать из массива $_POST c ключом ["0"]["nomer_r_doc"], и т.д. из второго уровня массива $_POST";
    11.         $add2 = mysqli_query($db, $arr2);
    12.             }
    13.         }
    14.     }
    15. }
    16. ?>
     
  7. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    Если использовать SET то надо передавать через запятую пары ключ=значение
    Наверное надо составить запрос так
    "INSERT INTO baza SET $key = '$value' "
    --- Добавлено ---
    Но я думаю, что запрос нужно выполнять вне цикла. В цикле нужно лишь сформировать строку запроса.
    Начинаем до цикла:
    $query = "INSERT INTO basa SET";
    В цикле после foreach($value as $key_2=>$value_2)
    $query .= $key2 . ' = ' . $value2;
    после цикла:
    mysqli_query($query);
     
  8. roman_php

    roman_php Активный пользователь

    С нами с:
    20 сен 2009
    Сообщения:
    39
    Симпатии:
    1
    Да через SET передаются пары ключ и значение, но как сделать, что бы например в $key было сначала ключ со значением, adres, потом shema и т.д. по одномерному массиву и при этом в $value оказались значения сначала г. Орел, потом ДДА и так далее по одномерному массиву, ну и получается то же самое но потом по вложенному?
     
  9. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    Я тебе советую вот что:
    PHP:
    1. <?php
    2. if (!empty($_POST)){
    3.       $query = "INSERT INTO `dop_baza` SET ";//Это начало строки запроса
    4.     foreach ($_POST as $key => $value) {
    5.         if(is_array($value))
    6.         {
    7.             foreach ($value as $key_2 => $value_2) {
    8.                 //вложенный массив
    9.                 $query .=  $key2 . ' = ' . $value2 . ' , ' ;
    10.             }
    11.         }
    12.     }
    13. echo $query;//это получившаяся строка запроса ее нужно проверить.
    14. mysqli_query($query);//если строка устраивает тогда выполнить запрос
    15. }
    16. ?>
     
  10. roman_php

    roman_php Активный пользователь

    С нами с:
    20 сен 2009
    Сообщения:
    39
    Симпатии:
    1
    @antoniii, в том то все и дело, что и поля таблицы в базе и значения должны подставляться в цикле foreach, вы же предлагаете вынести формирование строки запроса и исполнение за цикл.
     
  11. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    Какие результаты? Что говорит ПХП? Какой получилась строка запроса?
    Значения в строку и подставляются в цикле.
     
  12. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.875
    Симпатии:
    756
    Адрес:
    Татарстан
    В - внимательность!

    формирование строки запроса - внутри цикла
    mysqli_query($query) - сам запрос после цикла
     
  13. roman_php

    roman_php Активный пользователь

    С нами с:
    20 сен 2009
    Сообщения:
    39
    Симпатии:
    1
    Точно, я не увидел.
    Но выдает вот это:
    Warning: Undefined variable $key2 in F:\server\OpenServer\domains\uz\result_uz.php on line 31

    Warning: Undefined variable $value2 in F:\server\OpenServer\domains\uz\result_uz.php on line 31

    Warning: Undefined variable $key2 in F:\server\OpenServer\domains\uz\result_uz.php on line 31

    Warning: Undefined variable $value2 in F:\server\OpenServer\domains\uz\result_uz.php on line 31

    Warning: Undefined variable $key2 in F:\server\OpenServer\domains\uz\result_uz.php on line 31

    Warning: Undefined variable $value2 in F:\server\OpenServer\domains\uz\result_uz.php on line 31

    Warning: Undefined variable $key2 in F:\server\OpenServer\domains\uz\result_uz.php on line 31

    Warning: Undefined variable $value2 in F:\server\OpenServer\domains\uz\result_uz.php on line 31
    INSERT INTO `dop_baza` SET = , = , = , = ,
    Fatal error: Uncaught ArgumentCountError: mysqli_query() expects at least 2 arguments, 1 given in F:\server\OpenServer\domains\uz\result_uz.php:36 Stack trace: #0 F:\server\OpenServer\domains\uz\result_uz.php(36): mysqli_query() #1 {main} thrown in F:\server\OpenServer\domains\uz\result_uz.php on line 36

     
  14. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    Я забыл передать параметр в функцию надо mysqli_query($db,$query)
    и переменные я назвал неправильно забыл пробел $key_2 и $value_2 !!!!!!!
     
    #14 antoniii, 8 ноя 2022
    Последнее редактирование: 8 ноя 2022
  15. roman_php

    roman_php Активный пользователь

    С нами с:
    20 сен 2009
    Сообщения:
    39
    Симпатии:
    1
    Поправил, немного
    PHP:
    1. $query .= $key_2 . ' = ' . $value_2 . ' , ' ;
    теперь выдает:

    INSERT INTO `dop_baza` SET nomer_r_doc = , text_r_doc = , nomer_r_dog = , text_r_dog = ,
    Fatal error: Uncaught ArgumentCountError: mysqli_query() expects at least 2 arguments, 1 given in F:\server\OpenServer\domains\uz\result_uz.php:37 Stack trace: #0 F:\server\OpenServer\domains\uz\result_uz.php(37): mysqli_query() #1 {main} thrown in F:\server\OpenServer\domains\uz\result_uz.php on line 37
    --- Добавлено ---
    Все равно ошибка записи

    NSERT INTO `dop_baza` SET nomer_r_doc = 4.1 , vib_r_doc = risk_doc , text_r_doc = 11 , nomer_r_dog = 5.1 , vib_r_dog = min_dog , text_r_dog = 22 ,
    Fatal error: Uncaught mysqli_sql_exception: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 in F:\server\OpenServer\domains\uz\result_uz.php:37 Stack trace: #0 F:\server\OpenServer\domains\uz\result_uz.php(37): mysqli_query() #1 {main} thrown in F:\server\OpenServer\domains\uz\result_uz.php on line 37
    --- Добавлено ---
    на синтаксис ругается
     
  16. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    Обрати внимание в строке запроса нет первой буквы в слове INSERT и есть запятая в конце строки запроса. Строковые значения заключаются в кавычки одинарные. Я вроде их вставлял
     
  17. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.875
    Симпатии:
    756
    Адрес:
    Татарстан
    да тут куча ошибок так и будет .. вам же принцип показали, а не точный код...
    все значения сделайте в кавычках... как строки
    PHP:
    1. $query .= " $key_2  = ' $value_2' ," ;
    ну и английский надо хотя бы с переводчиком уметь переводить
     
  18. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    Осталось поработать со строкой запроса в цикле и после цикла можно использовать строковые функции strpos и strlen
     
  19. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.875
    Симпатии:
    756
    Адрес:
    Татарстан
    а лучше ключи и параметры собирать в массив, а потом через implode() и не нужна работа со строками
     
  20. roman_php

    roman_php Активный пользователь

    С нами с:
    20 сен 2009
    Сообщения:
    39
    Симпатии:
    1
    Спасибо, ребята. Перевариваю информацию. Сейчас буду пробовать. В строке запроса которая получается, выходит, что последняя запятая лишняя, нет закрывающих кавычек
    Код (Text):
    1. INSERT INTO `dop_baza` SET nomer_r_doc = ' 4.1' , vib_r_doc = ' risk_doc' , text_r_doc = ' 11' , nomer_r_dog = ' 5.1' , vib_r_dog = ' min_dog' , text_r_dog = ' 22' ,
    и точки с запятой.
     
  21. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    Попробуй строковыми функциями подшаманить.
    Код (Text):
    1. $query = substr($query, 0, strlen($query)-1);
    Это мы запятую удалим. А потом
    $query .= ";";
     
    #21 antoniii, 8 ноя 2022
    Последнее редактирование: 8 ноя 2022
  22. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.875
    Симпатии:
    756
    Адрес:
    Татарстан
    а зачем ; ??? нафиг не нужно в запросе
     
    #22 ADSoft, 8 ноя 2022
    Последнее редактирование: 8 ноя 2022
  23. roman_php

    roman_php Активный пользователь

    С нами с:
    20 сен 2009
    Сообщения:
    39
    Симпатии:
    1
    В итоге же сам запрос должен быть примерно следующим:
    PHP:
    1. $sql = "INSERT INTO `dop_baza` (`id`, `id_b`, `nomer_r_doc`, `vib_r_doc`, `text_r_doc`, `nomer_r_dog`, `vib_r_dog`, `text_r_dog`) VALUES (NULL, '1', '4.1', '1111', '2222', NULL, NULL, NULL);";
    2. $query = mysqli_query($db, $sql);
    там с ; или не так вообще?
     
  24. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    Точка с запятой не обязательна. Она служит для разделения двух разных запросов к базе данных. Строка запроса выглядит правильно. Данные вставляются?