За последние 24 часа нас посетили 22043 программиста и 987 роботов. Сейчас ищут 664 программиста ...

Добавление через форму несколько записей в БД sql

Тема в разделе "PHP для новичков", создана пользователем IGARRRRR, 18 июл 2019.

  1. IGARRRRR

    IGARRRRR Новичок

    С нами с:
    6 июл 2019
    Сообщения:
    21
    Симпатии:
    0
    Возможно ли вообще?...

    Есть таблица образцов (obrazec)
    1. id
    2. группа (GR)
    3. номер
    4. статус

    вывел запросом select * from obrazec WHERE GR='44'
    запрос показал все строки, с группой 44. Например 4 строки.

    есть таблица операций
    1.id
    2.id_obrazec
    3.название операции
    4.дата

    Есть форма для добавления данных
    выбираем из select образец, записываем название и дату.

    добавить одновременно столько строк операций, сколько показало строк в первом запросе и присвоить им id образца. все данные одинаковые, кроме id образца.

    массив нужно сделать insert into?
     
  2. sushko

    sushko Новичок

    С нами с:
    17 июл 2019
    Сообщения:
    78
    Симпатии:
    8
    Надо сделать несколько - по числу добавляемых операций - запросов INSERT INTO. Вы можете либо засунуть их в массив и выполнять эти запросы по очереди, либо объединить их одной длинной строкой с разделителем - точка с запятой - между запросами, и скормить Вашему серверу БД эту длинную строку один раз.

    Такой синтаксис (несколько запросов через точку-с-запятой) понимает абсолютное большинство СУБД, но я, конечно, не могу ручаться за абсолютно каждый из существующих. Конкретно mySQL я не проверял.
     
  3. IGARRRRR

    IGARRRRR Новичок

    С нами с:
    6 июл 2019
    Сообщения:
    21
    Симпатии:
    0
    Попробую, спасибо большое
     
  4. sushko

    sushko Новичок

    С нами с:
    17 июл 2019
    Сообщения:
    78
    Симпатии:
    8
    А можно, кстати, и одним запросом:

    INSERT INTO operations
    SELECT is_obrazec, 'имя операции', '2019/07/18'
    FROM obrazec
    WHERE gr=44

    (В синтаксисе мог напутать)
     
  5. IGARRRRR

    IGARRRRR Новичок

    С нами с:
    6 июл 2019
    Сообщения:
    21
    Симпатии:
    0
    Попробую завтра возможные варианты, отпишу как получилось.
     
  6. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    Надо бить (сильно) в лоб за такие советы.
    Необходимо сформировать многострочный INSERT (это абсолютно не одно и то же, что "несколько запросов через точку-с-запятой")
    Быстро однако одумался :D
     
  7. sushko

    sushko Новичок

    С нами с:
    17 июл 2019
    Сообщения:
    78
    Симпатии:
    8
    Пожалуйста, не надо отвечать на мои сообщения в таком тоне. Мы с Вами незнакомы.

    В зависимости от условий задачи и 1-ый. и 2-ой, и 3-ий варианты имеют право на жизнь. И я готов предложить пример ситуации, когда 1-ый вариант будет намного лучше 3-го со всех точек зрения, в т.ч. и с т.з.нагрузки на сервер.
     
  8. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    Внимательно слушаю

    P.S. Мой тон всегда прямо пропорционален качеству совета вне зависимости от статуса знакомства. Никакого негатива лично к Вам я не испытываю.
     
  9. sushko

    sushko Новичок

    С нами с:
    17 июл 2019
    Сообщения:
    78
    Симпатии:
    8
    ??? Ну элементарно же ж. В случае, если таблица OBRAZEC не проиндексирована по полю GR и имеет очень много строк.

    Тогда при выполнении 1-го запроса SELECT FROM obrazec WHERE GR=44 сервер выполняет full table scan - мы идем на это, т.к. нам надо на клиенте заполнить HTML SELECT с названиями образцов.

    Если после этого мы запустим запрос "INSERT INTO... SELECT FROM", мы нарвемся на ВТОРОЙ full table scan при том, что небходимая информация (ID'ы образцов) у нас уже есть и тащить их из БД такими трудозатратами нам не нужно. В этом случае 1-ый вариант будет предпочтительнее 3-го.

    Причем я даже могу придумать ситуацию, когда вышеописанное, т.е. отсутствие индекса по полю GR - это продуманный результат грамотного построения БД, а вовсе не отходы жизнедеятельности второкурсника :)
     
  10. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @sushko, вряд ли Вы меня напугаете таблицей без индекса. А вот на счёт всего остального высосано из пальца.
    Сделали выборку, сформировали html форму, отправили данные обратно на сервер, сформировали многострочный INSERT, добавили данные в БД. Один запрос на 10, 100, 1000 строк предпочтительнее, чем 10, 100, 1000 запросов. Это в самом простом случае. Более сложные варианты без конкретного ТЗ обсуждать не имеет смысла.
     
  11. sushko

    sushko Новичок

    С нами с:
    17 июл 2019
    Сообщения:
    78
    Симпатии:
    8
    Да я, собственно, никого пугать и не собирался :)
     
  12. IGARRRRR

    IGARRRRR Новичок

    С нами с:
    6 июл 2019
    Сообщения:
    21
    Симпатии:
    0
    Отписываю как получилось, если есть к чему придраться, я буду только рад!

    1. запрос на вывод только тех образцов, которые в группе "44"
    $str="select * from obrazec WHERE GR='44' ";
    2. выводим данные по образцам:
    $sql=mysql_query($str);
    while($dp=mysql_fetch_object($sql)){
    $ID_OBRZ=$dp->ID_OBRZ;
    $GR=$dp->GR;
    $NUMOBRZ=$dp->NUMOBRZ;
    $f=$ID_OBRZ; //пусть id будет в переменной f.

    3. запрос insert into

    $u=isset($_POST['submit']);
    if($u=="Сохранить") {

    $GR=STRIP_TAGS($_POST['GR']);
    $ID_OBRZ=STRIP_TAGS($_POST['ID_OBRZ']);
    $NAMEOPER=STRIP_TAGS($_POST['NAMEOPER]);
    $DATEOP=STRIP_TAGS($_POST['DATEOP]);
    $query=mysql_query("INSERT INTO operacdiag (ID_OBRZ, NAMEOPER, DATEOP) VALUES ('$f, '$NAMEOPER','$DATEOP' )");
    }
    }

    Попробовал и если в группе штук 40 образцов, очень быстро обрабатывает. Если что-то плохо, буду рад если напишите.
     
  13. sushko

    sushko Новичок

    С нами с:
    17 июл 2019
    Сообщения:
    78
    Симпатии:
    8
    Будет лучше, если Вы, действительно, сделаете все одним запросом, т.е. замените ВЕСЬ приведенный Вами кусок кода на:

    $query = sprintf
    (
    'INSERT INTO operacdiag (ID_OBRZ, NAMEOPER, DATEOP)
    SELECT idobrz, "%s", "%s" FROM obrazec WHERE gr=44' ,
    STRIP_TAGS($_POST['NAMEOPER]),
    STRIP_TAGS($_POST['DATEOP])
    );

    и дальше выполнять этот запрос. Оно и в исходном коде аккуратнее лежать будет (меньше кода - легче его прочесть в будущем), и сервер меньше напряжет.
     
  14. IGARRRRR

    IGARRRRR Новичок

    С нами с:
    6 июл 2019
    Сообщения:
    21
    Симпатии:
    0
    Отлично, спасибо огромное!!