Доброго времени суток! Прошу откликнуться и помочь с запросом к базе для создания записей в ней, два дня по всякому пытаюсь реализовать не получается. В файл .php где будет запрос к базе на MySQL приходят данные из формы посредствам POST. Проблема в том, что данные приходят в виде многомерного массива и я это ни как поменять не могу (есть скрипт который делает динамическую таблицу и туда автоматом прописываются ключи, которые в последствии становиться ключами в многомерном массиве на 2-м его уровне.) данные в POST которые приходят выглядят так: Код (Text): Array ( [adres] => г. Орел [shema] => ДДА [0] => Array ( [nomer_r_doc] => 4.1 [vib_r_doc] => risk_doc [text_r_doc] => 11 [nomer_r_dog] => 5.1 [vib_r_dog] => risk_dog [text_r_dog] => 44 ) [1] => Array ( [nomer_r_doc] => 4.2 [vib_r_doc] => min_doc [text_r_doc] => 22 ) [2] => Array ( [nomer_r_doc] => 4.3 [vib_r_doc] => st_r_doc [text_r_doc] => 33 ) [ka] => 5 [objekt] => 6 [zemly] => 7 [dop_info] => 8 [fas] => 9 [no_dok] => 10 [rezoluciy] => sogl_zamech [send] => Сформировать ЮЗ Причем, важно, что второй уровень массива не заканчивается ключами 0 и 1, там может быть сколько угодно ключей со значениями, но еще одной вложенности скажем в массив с индексом 2 уже не будет! В базе есть 2 таблицы следующего вида: просто вывести все содержание пришедшего массива $_POST я могу (подсказали) PHP: <?php if (!empty($_POST)){ foreach ($_POST as $key => $value) { if(is_array($value)) { foreach ($value as $key_2 => $value_2) { //вложенный массив echo $key_2. '=>'.$value_2."<br />"; } } else echo $key. '=>'.$value."<br />"; } } ?> Но моя задача записать из этого пришедшего массива данные в разные таблицы, должно быть так: 1)данные из массива с ключами adres, shema уже могут быть в таблице 'baza' в столбцах соответственно adres, shema, так как до формирования формы которая отправляет этот двумерный массив, есть форма которая уже заносит в таблицу следующие поля adres, shema, sessiya, region, status, но поскольку инпуты в первой форме с ключами adres, shema не обязательны на данном этапе, то именно эти поля могут быть определены в таблице как NULL, получается нужно проверить, если не NULL то заносим adres, shema при этом идентификатором строки в таблице куда нужно занести будет поле sessiya, на страницу где должен отработать скрипт занесения базу значения поля sessiya передается $_GET, соответственно этот идентификатор есть: PHP: $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: $id_baza = $_GET['id_baza']; Вот такую запись в базу в разные таблицы из многомерного массива мне нужно реализовать. Я понимаю, что тут изначально, что-то не так, а конкретно, если бы не создавался этот многомерный массив, то скорее всего и проблем бы таких не было. Я не знаю можно ли вообще такое реализовать, у меня не получается. Буду очень признателен за любую помощь.
ну вывод же есть... вместо вывода - записывайте в БД PHP: <?php if (!empty($_POST)){ foreach ($_POST as $key => $value) { /* $last_id = тут вставляем в первую таблицу и получаем ид записи */ if(is_array($value)) { foreach ($value as $key_2 => $value_2) { //вложенный массив /* тут записываем во вторую таблицу в цикле - используя $last_id для связи с первой */ } } } } ?> примерно так
Доброго времени суток! Спасибо Вам, что не прошли мимо и не указали мне, на мою беспомощность, как на одном из форумов мне написали, когда я просил помочь: "нет никакого желания браться за эту задачу, по одним именам ключей массива и названиям полей в БД, видно что код писал полный профан, поэтому "не в коня корм"", да вы и сами на этом форуме это видели. И человек то в общем то прав! На том форуме вы мне задали вопрос: "я же вам на другом форуме ответил как сделать.... или прямо надо сделать за вас?" Если возможно, я был бы вам признателен, потому, что я как только не крутил и вот не как не могу понять, как же мне в цикле каждый раз делать запись значений из массива в свою таблицу. Я как только не крутил $key и $value и пытался прямо прописывать к каким ключам обращаюсь $key['adres'] не чего не получается.
Может кто ни будь поможет из уважаемых программистов. Наверное надо было и мне по-точнее объяснить с самого начала, откуда берётся такой многомерный массив. Есть некая таблица внутри которой есть форма, при этом таблица в некоторой части динамическая, т.е. есть кнопки + и - соответственно они посредством JS скрипта добавляют к таблице: HTML: <tbody id="dynamic"> <tr> <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> <td width="30%"> <label> <select style="width: 100%; text-align: center; font-size: 14px; padding: 10px" form="form_uz" name="vib_r_doc"> <option value="" disabled selected hidden>Выбрать из списка</option> <option value="risk_doc">Описание риска:</option> <option value="min_doc">Минимизация:</option> <option value="st_r_doc">Степень риска:</option> </select> </label> </td> <script>autosize($('textarea'));</script> <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> <td width="5%"> <button type="button" class="add">+</button> <button type="button" class="del">-</button> </td> </tr> </tbody> таким образом формируется второй уровень массива, который передается на отработку в _POST на следующую страницу со скриптом, где все эти данные из массива и надо записать в базу, причем, данный из массива первого уровня в таблицу `baza`с уникальным id ключом, а данные из массива 2-го уровня в свою таблицу `dop_baza` в которой поле id_b это уникальный номер в поле id в таблице `baza`, таким образом таблицы подвязываются, что бы в последствии из этих двух таблиц можно было опять собрать в единое целое форму юридического заключения. Подробнее наглядно, это таблица с формой где не нажата кнопка "выявлены" и соответственно после отправки формы у нас нормальный массив с одним уровнем: Это таблица с формой после нажатия кнопки "выявлены" в этом случае появляется возможность динамически строить таблицу скриптом JS добавляя или удаляя поля, из них как раз и формируется массив 2-го уровня: А это поля которые обязательны пользователем для заполнения и которые проверяются на заполняемость: А это скрипт на JS который делает некоторые части таблицы с формой динамической, скрипт скопированный с просторов интернета: Код (Javascript): var DynamicTable = (function (GLOB) { var RID = 0; return function (tBody) { /* Если ф-цию вызвали не как конструктор фиксим этот момент: */ if (!(this instanceof arguments.callee)) { return new arguments.callee.apply(arguments); } //Делегируем прослушку событий элементу tbody tBody.onclick = function(e) { var evt = e || GLOB.event, trg = evt.target || evt.srcElement; if (trg.className && trg.className.indexOf("add") !== -1) { _addRow(trg.parentNode.parentNode, tBody); } else if (trg.className && trg.className.indexOf("del") !== -1) { tBody.rows.length > 1 && _delRow(trg.parentNode.parentNode, tBody); } }; var _rowTpl = tBody.rows[0].cloneNode(true); // Корректируем имена элементов формы var _correctNames = function (row) { var elements = row.getElementsByTagName("*"); for (var i = 0; i < elements.length; i += 1) { if (elements.item(i).name) { if (elements.item(i).type && elements.item(i).type === "radio" && elements.item(i).className && elements.item(i).className.indexOf("glob") !== -1) { elements.item(i).value = RID; } else { elements.item(i).name = RID + "["+ elements.item(i).name +"]"; } } } RID++; return row; }; var _addRow = function (before, tBody) { var newNode = _correctNames(_rowTpl.cloneNode(true)); tBody.insertBefore(newNode, before.nextSibling); }; var _delRow = function (row, tBody) { tBody.removeChild(row); }; _correctNames(tBody.rows[0]); }; })(this);
Для добавления записей в таблицу используется 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);
@antoniii, добрый день! Сделано. в том то и дело не знаю как обратиться к нужным полям таблицы, что бы нужное значение подставлялось, массив то не одномерный PHP: <?php if (!empty($_POST)){ foreach ($_POST as $key => $value) { $arr1 = "INSERT INTO `baza` SET как обратиться к полю adres в таблице baza = как записать из массива $_POST c ключом ["adres"], и т.д. из первого уровня массива $_POST"; $add = mysqli_query($db, $arr1); if(is_array($value)) { foreach ($value as $key_2 => $value_2) { //вложенный массив $arr2 = "INSERT INTO `dop_baza` SET как обратиться к полю nomer_r_doc в таблице dop_baza = как записать из массива $_POST c ключом ["0"]["nomer_r_doc"], и т.д. из второго уровня массива $_POST"; $add2 = mysqli_query($db, $arr2); } } } } ?>
Если использовать 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);
Да через SET передаются пары ключ и значение, но как сделать, что бы например в $key было сначала ключ со значением, adres, потом shema и т.д. по одномерному массиву и при этом в $value оказались значения сначала г. Орел, потом ДДА и так далее по одномерному массиву, ну и получается то же самое но потом по вложенному?
Я тебе советую вот что: PHP: <?php if (!empty($_POST)){ $query = "INSERT INTO `dop_baza` SET ";//Это начало строки запроса foreach ($_POST as $key => $value) { if(is_array($value)) { foreach ($value as $key_2 => $value_2) { //вложенный массив $query .= $key2 . ' = ' . $value2 . ' , ' ; } } } echo $query;//это получившаяся строка запроса ее нужно проверить. mysqli_query($query);//если строка устраивает тогда выполнить запрос } ?>
@antoniii, в том то все и дело, что и поля таблицы в базе и значения должны подставляться в цикле foreach, вы же предлагаете вынести формирование строки запроса и исполнение за цикл.
Какие результаты? Что говорит ПХП? Какой получилась строка запроса? Значения в строку и подставляются в цикле.
В - внимательность! формирование строки запроса - внутри цикла mysqli_query($query) - сам запрос после цикла
Точно, я не увидел. Но выдает вот это: 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
Я забыл передать параметр в функцию надо mysqli_query($db,$query) и переменные я назвал неправильно забыл пробел $key_2 и $value_2 !!!!!!!
Поправил, немного PHP: $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 --- Добавлено --- на синтаксис ругается
Обрати внимание в строке запроса нет первой буквы в слове INSERT и есть запятая в конце строки запроса. Строковые значения заключаются в кавычки одинарные. Я вроде их вставлял
да тут куча ошибок так и будет .. вам же принцип показали, а не точный код... все значения сделайте в кавычках... как строки PHP: $query .= " $key_2 = ' $value_2' ," ; ну и английский надо хотя бы с переводчиком уметь переводить
Осталось поработать со строкой запроса в цикле и после цикла можно использовать строковые функции strpos и strlen
Спасибо, ребята. Перевариваю информацию. Сейчас буду пробовать. В строке запроса которая получается, выходит, что последняя запятая лишняя, нет закрывающих кавычек Код (Text): 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' , и точки с запятой.
Попробуй строковыми функциями подшаманить. Код (Text): $query = substr($query, 0, strlen($query)-1); Это мы запятую удалим. А потом $query .= ";";
В итоге же сам запрос должен быть примерно следующим: PHP: $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);"; $query = mysqli_query($db, $sql); там с ; или не так вообще?
Точка с запятой не обязательна. Она служит для разделения двух разных запросов к базе данных. Строка запроса выглядит правильно. Данные вставляются?