Как заставить PHP записать сразу множество данных из одной формы в одну таблицу mysql?
Всем привет, я новичок в PHP, решил для практики сделать небольшой сайт для оформления заказов.
Есть таблица order, где содержится номер заказа и данные клиента.
И таблица order_items, где с номером заказа записаны данные заказываемых товаров: название, артикул, цена, количество.
UPD: Для каждого заказа будут созданы свои товары, и они не будут потом вновь использоваться.
Также сейчас делаю таблицу с формой для добавления заказа. В связи с тем что количество заказываемых товаров всегда разное, у меня возникла затупка: а как собственно заставить PHP принять целую кучу строк (например, заказываем 5 товаров - тогда у нас 5 наборов полей с названием, артикулом, ценой, количеством) и потом каждую добавить в таблицу?
Самый понятный но неудобный метод - на странице с формой для добавления заказа сделать одну форму и поштучно добавлять товар: сначала первый, потом перезагрузить таблицу и добавить второй, третий. Но хочется ведь чтобы можно было за раз внести все данные.
Менее понятный метод - каким-то образом все данные из формы загнать в массив, и потом с помощью WHILE (есть строки в массиве) добавлять их в БД.
Третий метод - наплодить например 20 input`ов с именами: name1, sku1, price1, quantity1, name2, sku2, price2, quanity2 и тд, и потом наплодить 20 IF (в поле name1/name2/и так далее) что-то есть, то добавить соответственно данные из sku1/sku2 и тд в БД.
Но я чувствую, что есть какое-то простое и элегантное решение. Может кто-то подскажет?
UPD: для простоты понимания моей проблемы представьте, что речь идёт о регистрации пользователя/добавлении любой другой записи в MySQL.
Так вот, мне надо добавить сразу несколько пользователей. Нужно вывести, к примеру, 10 комплектов полей (логин пароль почта), потом те поля что заполнены - добавить в БД.
Может вас стоит разобрать реальный пример создания магазина? Есть обучающие материалы. Поняв , как работают стандартные решения, вы сможете использовать их в своих проектах.
вот, первое , что нашлось по запросу. Гугл в помощь ) lifeexample.ru/php-primeryi-skriptov/pishem-intern...
TopClans: это первый попавшийся. вы можете найти те , что вам больше подходят. просто , как мне кажется, для новичка - оптимальный вариант изучать решения, нежели создавать их самостоятельно. хотя, это конечно, процесс непростой ))
И таблица order_items, где с номером заказа записаны данные заказываемых товаров: название, артикул, цена, количество.
Это неверный подход. В таблице order_items нужно хранить информацию о заказе (время, id клиента и т.д.). Для связи many-to-many нужно использовать связующую таблицу, которая содержит id заказа и идентификаторы товаров в этом заказе.
то есть будет 3 таблицы:
order - здесь ID заказа, имя клиента, номер телефона
order_items - здесь ID товара, название товара, количество, цены и тд.
link - здесь для ID заказа мы храним список ID товара.
потом когда хотим посмотреть статус заказа, мы по ID заказа из одной таблицы берем статичные данные, потом во второй таблице узнаём какие нужны товары, потом из третьей таблицы достаем нужные товары.
а какой смысл? у меня в заказе будет в среднем 3-4 товара, то есть экономим 3-4 ячейки в order_items за счет того что мы не пишем, для какого заказа создан товар, но всё равно создаём каждому товару свой ID. вдобавок делаем ещё и третью таблицу.
мне кажется, так нужно делать, если у нас есть скажем 1000 фиксированных товаров, и сколько угодно заказов, в которых используется несколько товаров из уже имеющихся. у меня же каждый раз будет создаваться новый товар, конкретно под заказ, то есть для 100 заказов будет сделано 400 товаров (в среднем), для 1000 заказов - 4000 товаров.
мне кажется, так нужно делать, если у нас есть скажем 1000 фиксированных товаров, и сколько угодно заказов, в которых используется несколько товаров из уже имеющихся. у меня же каждый раз будет создаваться новый товар, конкретно под заказ, то есть для 100 заказов будет сделано 400 товаров (в среднем), для 1000 заказов - 4000 товаров.
Если честно, объяснили вы не очень...
создаваться новый товар, конкретно под заказ
Это как и зачем?
для какого заказа создан товар
Вот это вообще странно звучит. Вы создаете товар в момент его покупки?!
а какой смысл?
А смысл в том, чтобы сделать нормальную осмысленную модель база данных, с которой будет удобно работать.
то есть экономим 3-4 ячейки в order_items за счет того что мы не пишем, для какого заказа создан товар, но всё равно создаём каждому товару свой ID
Именно! Заносим товары в базу данных, а когда клиент оформляет заказ, в заказе прописываем id связующей таблицы, которая содержит список товаров, которые приобрел клиент. И, если еще тысяча клиентов приобретет этот же товар, не будет ни какого дублирования данных. Так же это поможет при подсчете всевозможных статистик.
в любом случае спасибо за совет!
Вы так написали, как будто я вам посоветовал какой-то бред :)
"Вот это вообще странно звучит. Вы создаете товар в момент его покупки?!"
Ну, в общем, да. Объясню, зачем создавать новый товар под заказ. Во-первых, в принципе товаров могут быть миллионы. Во-вторых, у них может поменяться артикул. В-третьих, цена меняется каждый день.
Соответственно, вероятность того что какой-либо товар будет заказан повторно с точно такими же параметрами - совсем низкая. Поэтому я и решил, что товары будут одноразовые. Если когда-нибудь таблица забьётся и товаров будут десятки тысяч - я, во-первых, буду вероятно богат, а во-вторых, просто удалю старые записи. Ну или перенесу их в таблицу "архив", и при потребности посмотреть старые заказы какого-то клиента (я тут не написал, но я пишу ещё и ID клиента) достану их из истории.
Так что извиняйте конечно, совет про many-to-many Вы дали полезный, я эту штуку с промежуточной таблицей запомню (я в общем-то так и думал, что делают такую таблицу если товары фиксированные). Но мне этот финт не нужен)
Видимо надо конкретнее пояснить, зачем нужен скрипт.
Есть магазин, в основном розничная торговля запчастями из наличия. Если товара нет и товар редкий - то его везут под заказ, с оформлением договора и предоплатой. Думаю, можете себе представить, сколько в каждой машине запчастей - от мелочи типа сливной пробки поддона картера, до корпуса КПП, например. И повторюсь, если оформляется договор - то деталь редкая, потому что если нужна шаровая опора - то её везут без договора.
Так вот, раньше договора там оформляли в блокнотике, сейчас - есть .XLS файл, где всё те же данные.
Сейчас я хочу им запилить веб-сервис, где можно будет например посмотреть все заказы клиента, средний срок выполнения заказа, текущие невыполненные заказы, для СМС-оповещения клиента о статусе выполнения заказа. Ну а больше всего я это делаю для себя самого, давно пытался научиться в PHP, но всякий раз читал книги по программированию и мало что понимал. А на практике мне как-то лучше запоминается всё что сделал. Делаю ошибки, ищу ошибки, понимаю код. Один минус, иногда придумываю велосипед, а потом узнаю что он уже придуман и реализован штатными средствами PHP)
Может, Вы всё-таки подскажете, как мне быть с формами?) А то я тут ещё захотел прикрутить javascript для подсчета сумм из полей, и судя по всему каждому полю нужно будет давать свой ID, так что в любом случае мне придётся сделать форму на 20 строк, а потом как-то научить PHP узнавать что строка не пустая и если так, то заполнять её данные в БД.
Элементы формы создавайте с помощью Javascript (количество отдайте на откуп пользователя, пусть для каждого товара поля создаются, скажем, по кнопке), делая полям определенный префикс и инкрементный индекс (art1, price1, quantity1 и т.д.). Обрабатывающему скрипту в $_post передавайте этот индекс (и значения всех полей формы, естественно).
Сделайте функции, которые будут забирать переменные из $_post в массив с помощью цикла ($_post["art".i], где i от старта инкрементного индекса до его значения на момент отправки).
Создайте функцию, которая будет пробегать полученные массивы и добавлять данные в таблицу.