Как из multiple сделать insert в базу? Из одной таблицы базы данных выводим в select multiple , выбираю несколько значений и вношу в другую таблицу. Как это сделать? Кроме $_POST я так понимаю должно быть ещё что то. PHP: <?php $sql = "SELECT*FROM tovar"; $query = mysqli_query($db, $sql); ?> <form action='index.php' method='post'> <select name='tovar' multiple> <? while($row = mysqli_fetch_array($query)) echo '<option value="'.$row[tovar].'">'.$row[tovar].'</option>'; ?> </select> <br> <input type='submit'> </form> <?php $tovar = $_POST[tovar]; ?????????? - какой то код наверное? $in = "INSERT INTO tovar2 (tovar2)VALUES ('$tovar')"; $int = mysqli_query($db, $in); ?>
для начала переменную объявить массивом PHP: <select name='tovar[]' multiple> если у вас должно записаться - 1 значение 1 запись то PHP: $tovar =implode(",", $_POST['tovar']); а потом PHP: $in = "INSERT INTO tovar2 (tovar2)VALUES ($tovar)"; надеюсь что tovar - не строка-название, а всего лишь идентификатор-число товара в бд? если строка - то по другому нужно будет формировать строку для вставки
если вставляешь несколько значений и каждое значение в свою строку, то из полученного массива нужно сформировать запрос: PHP: "INSERT INTO tovar2 ( tovar2 ) VALUES ( '".$tovar[0]."' ), ( '".$tovar[1]."' ), ( '".$tovar[2]."' ), ( '".$tovar[3]."' )" Сделать это можно вот так: PHP: $query = "INSERT INTO tovar2 ( tovar2 ) VALUES "; for ( $k=0; $k<count($tovar); $k++ ) { if ( $k > 0 ) { $query .=", "; } $query .="( '".$tovar[$k]."' )"; }
только потом не приходи с вопросом "почему в БД пустоту добавляет скрипт" --- Добавлено --- это уже сделал более логично выше собеседник, с помощью implode... никаких циклов с подсчетом нужно ли добавлять запятую и т.д. а просто.. implode...
вносится в поле базы данных таким образом: 1, 2, 4 - то есть не создает для каждого значения новую запись в базе с уникальным id а всё вбивает в одно полей одной записи через запятую. ещё такой момент если у меня VALUES ('$tovar')"; с кавычками то вносится через запятую, если без кавычек как в вашм примере то вносит только по одной записи. Ещё выкидывает ошибку - Warning: implode() [function.implode]: Invalid arguments passed inC:\OpenServer\domains\localhost\crm\index.phpon line28 Помогите пожалуйста.
Ну всё правильно implode возвращает строку элементов массива через разделитель. В твоём случае - через запятую.
Это я понял. А что делать? Надо не через запятую а чтоб каждое выбранное значение в multiple делало новую запись в бд.
написал, не вносит. ошибки не выдает и не вносит. Я попробую сегодня ещё раз, может где то кавычки пропустил или ещё что то. напишу, выставлю код тут. Спаисбо
implode убери. тебя человек не правильно понял просто. --- Добавлено --- и php надо писать сверху. Перед html. В html пишешь только если там что-то вывести нужно, а все обращения к базе и подсчеты сверху.
сделал PHP: <?php $sql = "SELECT*FROM tovar"; $query = mysqli_query($db, $sql); $tovar = $_POST['tovar']; $query2 = "INSERT INTO tovar2 ( tovar2 ) VALUES "; for ( $k=0; $k<count($tovar); $k++ ) { if ( $k > 0 ) { $query2 .=", "; } $query2 .="( '".$tovar[$k]."' )"; } mysqli_query($db, $query2); print_r($query2); ?> <form action='index.php' method='post'> <select name='tovar[]' multiple> <? while($row = mysqli_fetch_array($query)) echo '<option value="'.$row[idtovar].'">'.$row[tovar].'</option>'; ?> </select> <br> <input type='submit'> </form> работает как и хотел. Спасибо. Единственное я добавил в форму к name ковычки [ ] , чтоб массив был, без них по одному вносит. теперь буду разбирать и постигать логику происходящего и адаптирую к реальности. --- Добавлено --- Если есть замечания или варианты пишите.
ну у тебя скрипт устроен так, как будто ему POST отправляется полюбому, а по факту это не так. Нужно что-то типа: PHP: if ($_POST['tovar']) { // и тут всё что связанно с обработкой формы } Ну и к инъекциям код уязвим.
Если есть замечания Про условия и защиту я знаю, мне надо было сам принцип понять. Когда дело дойдет до реального кода, то конечно поставлю все условия и защиту. Не смог до конца осознать логику скрипта... и тут интересно у меня не хватает логики или знаний. А именно: PHP: $query2 = "INSERT INTO tovar2 ( tovar2 ) VALUES "; - из переменной вставляется values - первый раз такое вижу, сам бы не догадался. PHP: $query2 .=", "; - это так понимаю в строчку через запятую выставляется всё что из поста и надо вносить раздражает, но не понимаю как оно работает. Сам бы не додумался.
почему вот эта комбинация корректно рабтает PHP: $k<count($tovar); хотя мне кажется что надо было бы так: PHP: $k<=count($tovar); в чём я не прав?
потому что это я сам придумал)) ну индексы массива с 0 начинаются а не с 1. А count возвращает количество элементов массива в нормальном человеческом понимании. Вот и получается: 0<1, 1<2, 2<3 и т д --- Добавлено --- я тебе специально написал запрос, который нам надо получить в итоге, чтобы ты сразу видел к чему это всё. если всё еще что-то не понятно - не стесняйся.
Офигеть! авторские права... сколько мне ещё учится, чтоб такое самому выдумать... --- Добавлено --- - теперь понятно! да, ответ был прост. --- Добавлено --- то что я понимаю - в форе подсчитываем всё что было в посте, прибавлем по одному , затем если количестов строк всё ещё больше нуля, то в инсерте делаем пробелы для того чтоб вставить значения из поста, в строчку. и далее в туже переменную канкатенируем само значения из поста обработанное условием в форе ... До конца не понимаю, как так что переменная инсерта и переменная куда вставляется значение обработаное фором? Ага, вроде доходит - мы к переменной в которую вставлен инсерт конкатенируем пробелы и значения из поста обработанные фором. Поэтому и после валуес ничего не стоит. Я на правильном пути рассуждения?
написал код ближе к жизни и облом... PHP: $firm = $_POST['firm']; $tovar = $_POST['tovar']; $in = "INSERT INTO firm (firm) VALUES ('$firm')"; $query2 = mysqli_query($db, $in); $in2 = "INSERT INTO firm_has_tovar (firm_idfirm, tovar_idtovar) VALUES (LAST_INSERT_ID() )"; $query3 = mysqli_query($db, $in2); for($k = 0; $k<count($tovar); $k++){ if($k>0){$in2.=", ";} $in2.="('".$tovar[$k]."')"; } есть две таблицы фирмы и товары , они связаны между собой многие ко многим, то есть есть ещё третьтя таблица. я делаю инсерт фирмы и несколько товарных груп которыми она торгует. не получается так как написано выше изза добавленных полей. Есть выход? Как сделать? можно добавить значение после LAST_INSERT_ID()? или надо полностью всё менять?
Как у тебя всё запутанно)) Просто представь как php машина будет выполнять код. С запятой такое дело, что её не надо ставить в конце. Поэтому вместо того, чтобы вычислять индекс последнего элемента массива и проверять if(это последний элемент) я решил ставить её перед присоединением следующего куска, если индекс>0, а 0 - это индекс перввого элемента массива. Т е перед первым элементом запятой не надо а перед остальными надо. Зашел, так сказать, с другой стороны) Если у тебя массив такой: PHP: array( [0] =>"велосипед", [1] =>"трамвай", [2] =>"вагон" ); то в базу данных уйдет следующий запрос: PHP: "INSERT INTO tovar2 ( tovar2 ) VALUES ('велосипед'), ('трамвай'), ('вагон')" ты можешь выводить на экран переменные и смотреть что в них, и сам можешь всё это понять) А вот тут вообще ничего не понял.
про запятую думаю что понял. Я сталкивался с таким, что код выводит сначало запятую или <li>пустые а затем выводит цикл с запятыми.
да наверное я не корректно написал. Я чуть условжнил задачу: Вносится фирма через текстовое поле в таблицу firm + товары которые фирма продает (один или больше) через список мультпле. Таблицы firm и tovar связаны многие ко многим. Надо внести фирмы и присоединить к ней товары. В таблицу firm вносится значение а вот в таблицу firm_has_tovar не могу , не могу наверное выловить id фирмы и вставить в таблицу. PHP: <?php $sql = "SELECT*FROM tovar"; $query = mysqli_query($db, $sql); $firm = $_POST['firm']; $tovar = $_POST['tovar']; $in = "INSERT INTO firm (firm) VALUES ('$firm')"; $query2 = mysqli_query($db, $in); $id = ("LAST_INSERT_ID()"); $in2 = "INSERT INTO firm_has_tovar (firm_idfirm, tovar_idtovar) VALUES"; $query3 = mysqli_query($db, $in2); for($k = 0; $k<count($tovar); $k++){ if($k>0){$in2.=", ";} $in2.="('".$id."', '".$tovar[$k]."')"; } ?> <form action='index.php' method='POST'> <input type='text' name='firm'><br> <select name='tovar[]' multiple> <?php while($row = mysqli_fetch_array($query)){ echo '<option value="'.$row[idtovar].'">'.$row[tovar].'</option>'; } ?> </select><br> <input type='submit' value='Внести фирму'> </form> фирма вносится а товар к ней нет. где я ошибся? LAST_INSERT_ID() по каким то причинам не работает ошибаюсь впринципе или в деталях?
не понимаю... а чего не хватает? а вот это все не формирует запрос?: PHP: $id = "LAST_INSERT_ID()"; ......... for($k = 0; $k<count($tovar); $k++){ if($k>0){$in2.=", ";} $in2.="('".$id."', '".$tovar[$k]."')"; } чего я не понимаю?
издеваешься?)) ты с начала отправляешь не сформированный запрос, а потом его формируешь) --- Добавлено --- PHP: $query3 = mysqli_query($db, $in2); //эта строка отправляет запрос в бд, а на момент отправки в переменной $in2 то, что на строку выше. --- Добавлено --- пора отдохнуть)
PHP: $in2 = "INSERT INTO firm_has_tovar (firm_idfirm, tovar_idtovar) VALUES"; for($k = 0; $k<count($tovar); $k++){ if($k>0){$in2.=", ";} $in2.="('".$id."', '".$tovar[$k]."')"; } $id = "LAST_INSERT_ID()"; $query3 = mysqli_query($db, $in2); print_r($in2); print_r - выдает такое - INSERT INTO firm_has_tovar (firm_idfirm, tovar_idtovar) VALUES('', '2') - id товара попадает в запрос id фирмы не попадает