За последние 24 часа нас посетили 22308 программистов и 1083 робота. Сейчас ищут 589 программистов ...

INSERT нескольких значений из списка multiple

Тема в разделе "PHP для новичков", создана пользователем viktor72, 22 мар 2017.

Метки:
  1. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    Как из multiple сделать insert в базу?
    Из одной таблицы базы данных выводим в select multiple , выбираю несколько значений и вношу в другую таблицу. Как это сделать?
    Кроме $_POST я так понимаю должно быть ещё что то.

    PHP:
    1. <?php
    2.  
    3. $sql = "SELECT*FROM tovar";
    4. $query = mysqli_query($db, $sql);
    5. ?>
    6. <form action='index.php' method='post'>
    7.     <select name='tovar' multiple>
    8.     <?
    9.     while($row = mysqli_fetch_array($query))
    10.         echo '<option value="'.$row[tovar].'">'.$row[tovar].'</option>';
    11.     ?>  
    12.     </select>
    13.     <br>
    14.     <input type='submit'>
    15. </form>
    16. <?php
    17. $tovar = $_POST[tovar];
    18. ?????????? - какой то код наверное?
    19. $in = "INSERT INTO tovar2 (tovar2)VALUES ('$tovar')";
    20. $int = mysqli_query($db, $in);
    21. ?>
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.823
    Симпатии:
    736
    Адрес:
    Татарстан
    для начала переменную объявить массивом
    PHP:
    1. <select name='tovar[]' multiple>
    если у вас должно записаться - 1 значение 1 запись то
    PHP:
    1. $tovar =implode(",", $_POST['tovar']);
    а потом
    PHP:
    1. $in = "INSERT INTO tovar2 (tovar2)VALUES ($tovar)";
    надеюсь что tovar - не строка-название, а всего лишь идентификатор-число товара в бд?
    если строка - то по другому нужно будет формировать строку для вставки
     
    viktor72 нравится это.
  3. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    если вставляешь несколько значений и каждое значение в свою строку, то из полученного массива нужно сформировать запрос:
    PHP:
    1. "INSERT INTO tovar2 ( tovar2 ) VALUES ( '".$tovar[0]."' ), ( '".$tovar[1]."' ), ( '".$tovar[2]."' ), ( '".$tovar[3]."' )"
    Сделать это можно вот так:
    PHP:
    1. $query = "INSERT INTO tovar2 ( tovar2 ) VALUES ";
    2. for ( $k=0; $k<count($tovar); $k++ ) {
    3. if ( $k > 0 ) { $query .=", "; }
    4. $query .="( '".$tovar[$k]."' )";
    5. }
     
    viktor72 нравится это.
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.751
    Симпатии:
    1.322
    Адрес:
    Лень
    только потом не приходи с вопросом "почему в БД пустоту добавляет скрипт"
    --- Добавлено ---
    это уже сделал более логично выше собеседник, с помощью implode... никаких циклов с подсчетом нужно ли добавлять запятую и т.д. а просто.. implode...
     
    viktor72 нравится это.
  5. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    вносится в поле базы данных таким образом: 1, 2, 4 - то есть не создает для каждого значения новую запись в базе с уникальным id а всё вбивает в одно полей одной записи через запятую. ещё такой момент если у меня VALUES ('$tovar')"; с кавычками то вносится через запятую, если без кавычек как в вашм примере то вносит только по одной записи.
    Ещё выкидывает ошибку - Warning: implode() [function.implode]: Invalid arguments passed inC:\OpenServer\domains\localhost\crm\index.phpon line28
    Помогите пожалуйста.
     
    #5 viktor72, 23 мар 2017
    Последнее редактирование модератором: 23 мар 2017
  6. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    Кто нибудь помогите подскажите.
    Спасибо.
     
  7. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    Ну всё правильно implode возвращает строку элементов массива через разделитель. В твоём случае - через запятую.
     
    viktor72 нравится это.
  8. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    Это я понял. А что делать? Надо не через запятую а чтоб каждое выбранное значение в multiple делало новую запись в бд.
     
  9. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    я тебе выше код написал как это сделать)
     
    viktor72 нравится это.
  10. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    написал, не вносит. ошибки не выдает и не вносит. Я попробую сегодня ещё раз, может где то кавычки пропустил или ещё что то. напишу, выставлю код тут.
    Спаисбо
     
  11. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    implode убери. тебя человек не правильно понял просто.
    --- Добавлено ---
    и php надо писать сверху. Перед html. В html пишешь только если там что-то вывести нужно, а все обращения к базе и подсчеты сверху.
     
    viktor72 нравится это.
  12. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    сделал
    PHP:
    1. <?php
    2. $sql = "SELECT*FROM tovar";
    3. $query = mysqli_query($db, $sql);
    4.  
    5.  
    6. $tovar = $_POST['tovar'];
    7. $query2 = "INSERT INTO tovar2 ( tovar2 ) VALUES ";
    8. for ( $k=0; $k<count($tovar); $k++ ) {
    9. if ( $k > 0 ) { $query2 .=", "; }
    10. $query2 .="( '".$tovar[$k]."' )";
    11. }
    12. mysqli_query($db, $query2);
    13. print_r($query2);
    14. ?>
    15. <form action='index.php' method='post'>
    16.     <select name='tovar[]' multiple>
    17.     <?
    18.     while($row = mysqli_fetch_array($query))
    19.         echo '<option value="'.$row[idtovar].'">'.$row[tovar].'</option>';
    20.     ?>  
    21.     </select>
    22.     <br>
    23.     <input type='submit'>
    24. </form>
    работает как и хотел. Спасибо. Единственное я добавил в форму к name ковычки [ ] , чтоб массив был, без них по одному вносит.
    теперь буду разбирать и постигать логику происходящего и адаптирую к реальности.
    --- Добавлено ---
    Если есть замечания или варианты пишите.
     
  13. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    ну у тебя скрипт устроен так, как будто ему POST отправляется полюбому, а по факту это не так.
    Нужно что-то типа:
    PHP:
    1. if ($_POST['tovar']) {
    2. // и тут всё что связанно с обработкой формы
    3. }
    Ну и к инъекциям код уязвим.
     
    viktor72 нравится это.
  14. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    Если есть замечания
    Про условия и защиту я знаю, мне надо было сам принцип понять. Когда дело дойдет до реального кода, то конечно поставлю все условия и защиту.

    Не смог до конца осознать логику скрипта... и тут интересно у меня не хватает логики или знаний. А именно:
    PHP:
    1. $query2 = "INSERT INTO tovar2 ( tovar2 ) VALUES ";
    - из переменной вставляется values - первый раз такое вижу, сам бы не догадался.
    PHP:
    1. $query2 .=", ";
    - это так понимаю в строчку через запятую выставляется всё что из поста и надо вносить

    раздражает, но не понимаю как оно работает. Сам бы не додумался.
     
  15. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    почему вот эта комбинация корректно рабтает
    PHP:
    1. $k<count($tovar);
    хотя мне кажется что надо было бы так:
    PHP:
    1. $k<=count($tovar);
    в чём я не прав?
     
  16. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    потому что это я сам придумал))
    ну индексы массива с 0 начинаются а не с 1.
    А count возвращает количество элементов массива в нормальном человеческом понимании.
    Вот и получается: 0<1, 1<2, 2<3 и т д
    --- Добавлено ---
    я тебе специально написал запрос, который нам надо получить в итоге, чтобы ты сразу видел к чему это всё.

    если всё еще что-то не понятно - не стесняйся.
     
    viktor72 нравится это.
  17. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    Офигеть! авторские права... сколько мне ещё учится, чтоб такое самому выдумать...
    --- Добавлено ---
    - теперь понятно! да, ответ был прост.
    --- Добавлено ---
    то что я понимаю -
    в форе подсчитываем всё что было в посте, прибавлем по одному , затем если количестов строк всё ещё больше нуля, то в инсерте делаем пробелы для того чтоб вставить значения из поста, в строчку. и далее в туже переменную канкатенируем само значения из поста обработанное условием в форе ...
    До конца не понимаю, как так что переменная инсерта и переменная куда вставляется значение обработаное фором?
    Ага, вроде доходит - мы к переменной в которую вставлен инсерт конкатенируем пробелы и значения из поста обработанные фором. Поэтому и после валуес ничего не стоит.
    Я на правильном пути рассуждения?
     
  18. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    написал код ближе к жизни и облом...
    PHP:
    1. $firm = $_POST['firm'];
    2. $tovar = $_POST['tovar'];
    3. $in = "INSERT INTO firm (firm) VALUES ('$firm')";
    4. $query2 = mysqli_query($db, $in);
    5. $in2 = "INSERT INTO firm_has_tovar (firm_idfirm, tovar_idtovar) VALUES (LAST_INSERT_ID() )";
    6. $query3 = mysqli_query($db, $in2);
    7. for($k = 0; $k<count($tovar); $k++){
    8.     if($k>0){$in2.=", ";}
    9.     $in2.="('".$tovar[$k]."')";
    10. }
    есть две таблицы фирмы и товары , они связаны между собой многие ко многим, то есть есть ещё третьтя таблица. я делаю инсерт фирмы и несколько товарных груп которыми она торгует.
    не получается так как написано выше изза добавленных полей.
    Есть выход? Как сделать? можно добавить значение после LAST_INSERT_ID()? или надо полностью всё менять?
     
  19. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    Как у тебя всё запутанно))
    Просто представь как php машина будет выполнять код.

    С запятой такое дело, что её не надо ставить в конце. Поэтому вместо того, чтобы вычислять индекс последнего элемента массива и проверять if(это последний элемент) я решил ставить её перед присоединением следующего куска, если индекс>0, а 0 - это индекс перввого элемента массива. Т е перед первым элементом запятой не надо а перед остальными надо.
    Зашел, так сказать, с другой стороны)

    Если у тебя массив такой:
    PHP:
    1. [0] =>"велосипед",
    2. [1] =>"трамвай",
    3. [2] =>"вагон"
    4. );
    то в базу данных уйдет следующий запрос:
    PHP:
    1. "INSERT INTO tovar2 ( tovar2 ) VALUES ('велосипед'), ('трамвай'), ('вагон')"
    ты можешь выводить на экран переменные и смотреть что в них, и сам можешь всё это понять)
    А вот тут вообще ничего не понял.
     
    viktor72 нравится это.
  20. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    про запятую думаю что понял. Я сталкивался с таким, что код выводит сначало запятую или <li>пустые а затем выводит цикл с запятыми.
     
  21. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    да наверное я не корректно написал.
    Я чуть условжнил задачу:
    Вносится фирма через текстовое поле в таблицу firm + товары которые фирма продает (один или больше) через список мультпле.
    Таблицы firm и tovar связаны многие ко многим.
    img-2017-03-25-15-42-21.png
    Надо внести фирмы и присоединить к ней товары. В таблицу firm вносится значение а вот в таблицу firm_has_tovar не могу , не могу наверное выловить id фирмы и вставить в таблицу.

    PHP:
    1. <?php
    2. $sql = "SELECT*FROM tovar";
    3. $query = mysqli_query($db, $sql);
    4.  
    5. $firm = $_POST['firm'];
    6. $tovar = $_POST['tovar'];
    7.  
    8. $in = "INSERT INTO firm (firm) VALUES ('$firm')";
    9. $query2 = mysqli_query($db, $in);
    10. $id = ("LAST_INSERT_ID()");
    11.  
    12. $in2 = "INSERT INTO firm_has_tovar (firm_idfirm, tovar_idtovar) VALUES";
    13. $query3 = mysqli_query($db, $in2);
    14. for($k = 0; $k<count($tovar); $k++){
    15.     if($k>0){$in2.=", ";}
    16.     $in2.="('".$id."', '".$tovar[$k]."')";
    17. }
    18. ?>
    19.  
    20. <form action='index.php' method='POST'>
    21.     <input type='text' name='firm'><br>
    22.     <select name='tovar[]' multiple>
    23.     <?php
    24.         while($row = mysqli_fetch_array($query)){
    25.         echo '<option value="'.$row[idtovar].'">'.$row[tovar].'</option>';
    26.         }
    27.     ?>  
    28.     </select><br>
    29.     <input type='submit' value='Внести фирму'>
    30. </form>
    фирма вносится а товар к ней нет. где я ошибся? LAST_INSERT_ID() по каким то причинам не работает
    ошибаюсь впринципе или в деталях?
     
  22. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    вот тут ты отправляешь в базу еще не сформированный запрос.
     
    viktor72 нравится это.
  23. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    не понимаю... а чего не хватает?
    а вот это все не формирует запрос?:
    PHP:
    1. $id = "LAST_INSERT_ID()";
    2. .........
    3. for($k = 0; $k<count($tovar); $k++){
    4.     if($k>0){$in2.=", ";}
    5.     $in2.="('".$id."', '".$tovar[$k]."')";
    6. }
    чего я не понимаю?
     
  24. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    издеваешься?))
    ты с начала отправляешь не сформированный запрос, а потом его формируешь)
    --- Добавлено ---
    PHP:
    1. $query3 = mysqli_query($db, $in2); //эта строка отправляет запрос в бд, а на момент отправки в переменной $in2 то, что на строку выше.
    --- Добавлено ---
    пора отдохнуть)
     
    viktor72 нравится это.
  25. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    PHP:
    1. $in2 = "INSERT INTO firm_has_tovar (firm_idfirm, tovar_idtovar) VALUES";
    2. for($k = 0; $k<count($tovar); $k++){
    3.     if($k>0){$in2.=", ";}
    4.     $in2.="('".$id."', '".$tovar[$k]."')";
    5.    
    6. }
    7. $id = "LAST_INSERT_ID()";
    8. $query3 = mysqli_query($db, $in2);
    9.  
    10. print_r($in2);
    print_r - выдает такое - INSERT INTO firm_has_tovar (firm_idfirm, tovar_idtovar) VALUES('', '2') - id товара попадает в запрос id фирмы не попадает