Здравствуйте! Столкнулся с проблемой. Имеется стока данных вида: Код (Text): [{"order_id":4984305291,"type_id":34,"location_id":60000292,"is_buy_order":true,"issued":"2017-10-13T21:06:14Z"},{"order_id":4982814165,"type_id":34,"location_id":60004366,"is_buy_order":true,"issued":"2017-10-12T18:34:58Z"},{"order_id":4833961968,"type_id":34,"location_id":60014659,"is_buy_order":true,"issued":"2017-09-15T02:23:29Z"}] Подскажите как данные из этой строки ввести в базу данных? Заранее спасибо! P.S. Если найдутся те кто даст сразу готовый код, прошу этих людей дать ссылки на ресурсы касательно моего вопроса для личного, подробного изучения.
Ну..каков вопрос, таков ответ: Код (Text): INSERT INTO `table` (`col1`) VALUES ('[{"order_id":4984305291,"type_id":34,"location_id":60000292,"is_buy_order":true,"issued":"2017-10-13T21:06:14Z"},{"order_id":4982814165,"type_id":34,"location_id":60004366,"is_buy_order":true,"issued":"2017-10-12T18:34:58Z"},{"order_id":4833961968,"type_id":34,"location_id":60014659,"is_buy_order":true,"issued":"2017-09-15T02:23:29Z"}]');
Мамой клянус, данные из этой строки это [{"order_id":4984305291,"type_id":34,"location_id":60000292,"is_buy_order":true,"issued":"2017-10-13T21:06:14Z"},{"order_id":4982814165,"type_id":34,"location_id":60004366,"is_buy_order":true,"issued":"2017-10-12T18:34:58Z"},{"order_id":4833961968,"type_id":34,"location_id":60014659,"is_buy_order":true,"issued":"2017-09-15T02:23:29Z"}] Трыжды провэрил. Других данных там нэт.
Да, я поспешил и неправильно описал свой вопрос. В идеале я имел ввиду что бы в бд в таблице например test в столбец order_id заносились данные 4984305291, в столбец type_id данные 34, location_id 60000292 и так далее. Но смысл понял. В преть буду более точно составлять вопрос.
Ну тогда тебе надо действительно, для начала, сконвертить эту строку в структуру данных через json_decode. Потом, из этой структуры надо сформировать группы типа Код (Text): '('.$data.')' Да, со скобками, это важно. Где $data - это элементы структуры, отражающие строки, прогнанные через implode с запятой в качестве соединителя. Потом эти группы снова прогнать через implode с запятой в качестве соединителя. Все это в переменную сохранить, ессно дело. Потом эту переменную воткнуть в запрос INSERT INTO, где правильно перечислены твои колонки. Вставлять после слова VALUES. ну и про SQL-инъекции почитать неплохо бы, и про то, как их избежать.
А потому что это не пхпшный термин. Это я тебе описал человеческим языком алгоритм. прогонишь через имплод элементы массива, получишь строки, состоящие из его значений, склеенных запятой. Это и есть то, что я назвал группами Ты попробуй начать делать то, что я описал, сам все поймешь.
Ты имел ввиду это я должен получить?? Код (Text): [{"order_id":4984305291,"type_id":34,"location_id":60000292,"is_buy_order":true,"issued":"2017-10-13T21:06:14Z"},{"order_id":4982814165,"type_id":34,"location_id":60004366,"is_buy_order":true,"issued":"2017-10-12T18:34:58Z"},{"order_id":4833961968,"type_id":34,"location_id":60014659,"is_buy_order":true,"issued":"2017-09-15T02:23:29Z"}] После выполнения этого кода PHP: foreach ($testd as $i => $value) { implode(",", [$i]); } print_r($testd);
Нашёл таки способ это сделать! PHP: $jd = json_decode($testd, true); foreach ($jd as $value) { $fr = implode(",", $value); } И получил эти строки: Код (Text): 4984305291,34,60000292,1,2017-10-13T21:06:14Z 4982814165,34,60004366,1,2017-10-12T18:34:58Z 4833961968,34,60014659,1,2017-09-15T02:23:29Z Далее PHP: $dfr = explode(",", $fr); $ad = $dfr[0]; $bd = $dfr[1]; $cd = $dfr[2]; $ed = $dfr[3]; $dd = $dfr[3]; что дало Код (Text): 4833961968 34 60014659 1 2017-09-15T02:23:29Z этот результат из последней строки поскольку цикл. Теперь вот мучаюсь с записью в бд. Запись не идёт. Видимо опять у меня ошибки где то. PHP: $link = mysqli_connect($host, $user, $password, $database) or die("Ошибка доступа к бд" . mysqli_error($link)); $db = mysql_select_db( 'id3242305_evio', $link ); $result = mysql_query("INSERT INTO `ards`(`order_id`,`type_id`,`location_id`,`is_buy_order`,`issued`) VALUES ('$ad','$bd','$cd','$ed','$dd');") or mysql_error($result); mysqli_close($link); Это код которым я пытаюсь внести эти данные в бд, но запись не идёт. mysql_error($result); ничего не возвращает. Если кто сможет пожалуйста подскажите в какую сторону копать) Заранее спасибо!)
переписал SQL запрос в такой вид PHP: $result = ("INSERT INTO ards ( order_id, type_id, location_id, is_buy_order, issued) values ( '{$ad}', '{$bd}' , '{$cd}' , '{$ed}' , '{$dd}')"); mysql_query($result); echo $result; mysqli_close($link); теперь отображается echo $result; и выглядит так: Код (Text): INSERT INTO ards ( order_id, type_id, location_id, is_buy_order, issued) values ( '4833961968', '34' , '60014659' , '1' , '2017-09-15T02:23:29Z') Но запись в бд всё равно не идёт( Пробую дальше...
А вот так заработало: PHP: # Соединение mysql_connect('localhost', 'USER', 'PASSWORD') or die('Could not connect: ' . mysql_error()); # Выбор базы данных mysql_select_db('id3242305_evio') or die('Не могу выбрать базу данных'); # Выполнение запроса # Выполнение запроса $query = "INSERT INTO ards ( order_id, type_id, location_id, is_buy_order, issued) values ( '{$ad}', '{$bd}' , '{$cd}' , '{$ed}' , '{$dd}')"; $result = mysql_query($query) or die('Query failed: ' . mysql_error());
У меня опять трабла: Код (Text): 4984305291,34,60000292,1,2017-10-13T21:06:14Z 4982814165,34,60004366,1,2017-10-12T18:34:58Z 4833961968,34,60014659,1,2017-09-15T02:23:29Z этих записей 3, и при записи в бд записывается последняя. а хотелось бы их пустить через цикл что бы занеслись все 3 в поля в бд. Я нашёл конструкцию PHP: $query = "INSERT INTO `ards` ( order_id, type_id, location_id, is_buy_order, issued) values "; foreach ($fr as $i=>$value) { $query .= "'{$value}'"; if ($i+1 < count($fr)) { $query .= ", "; } } // Result query: INSERT INTO `table`(nomer) VALUES (1), (2), (3), (4), (5) $res = mysql_query($query); echo ($query); $mysqli->close(); немного адаптировал под себя. получаю SQL строку запроса вида: Код (Text): INSERT INTO `ards` ( order_id, type_id, location_id, is_buy_order, issued) values '4833961968', '34', '60014659', '1', '2017-09-15T02:23:29Z', а нужно что бы она была такого вида: Код (Text): INSERT INTO ards ( order_id, type_id, location_id, is_buy_order, issued) values ( '4833961968', '34' , '60014659' , '1' , '2017-09-15T02:23:29Z') именно непойму куда в цикл встроить () что бы ограничить values.
--- Добавлено --- ? --- Добавлено --- фиговая конструкция, выше implode упоминали --- Добавлено --- Спойлер: ps сейчас бы Лерму сюда пропихнуть.. PHP: <?php Lerma::prepare( 'INSERT INTO `ards` ( `order_id`, `type_id`, `location_id`, `is_buy_order`, `issued` ) VALUES ( ?,?,?,?,? )', json_decode ( '...' ) ); # ( sql, [[],[],[],[],[]] )
Они в массиве? PHP: array_walk($array, function(&$val,$key){ $val = '('.$val.')'; }); $values = implode(',', $array); И вот values пихай в запрос. --- Добавлено --- Да, на древних версиях php этот код может не заработать. Можно, в принципе, на foreach переписать, суть не поменяется особо.
Если ты про анонимную функцию, то эта возможность появилась еще до седьмой версии. Но не сильно прям давно.
Такс что то я совсем запутался! Уже более 20 часов с этой траблой воюю.@Fell-x27 у меня последняя надежда на тебя.в общем всё обстоит так: PHP: $testd = '[{"order_id":4984305291,"type_id":34,"location_id":60000292,"is_buy_order":true,"issued":"2017-10-13T21:06:14Z"},{"order_id":4982814165,"type_id":34,"location_id":60004366,"is_buy_order":true,"issued":"2017-10-12T18:34:58Z"},{"order_id":4833961968,"type_id":34,"location_id":60014659,"is_buy_order":true,"issued":"2017-09-15T02:23:29Z"}]'; $jsondata = json_decode($testd, true); print_r ($jsondata); foreach ($jsondata as $data) { $implodedata = implode(",", $data); echo "<br>"; print_r ($implodedata); echo "<br>"; echo "<br>"; } $explodedata = explode(",", $implodedata); echo"<br>"; print_r ($explodedata); echo"<br>"; $ad = $explodedata[0]; $bd = $explodedata[1]; $cd = $explodedata[2]; $ed = $explodedata[3]; $dd = $explodedata[4]; # Соединение mysql_connect('localhost', 'id3242305_root1', '1qwe4ASD') or die('Could not connect: ' . mysql_error()); # Выбор базы данных mysql_select_db('id3242305_evio') or die('Не могу выбрать базу данных'); # Выполнение запроса $query = "INSERT INTO ards ( order_id, type_id, location_id, is_buy_order, issued) values ( '{$ad}', '{$bd}' , '{$cd}' , '{$ed}' , '{$dd}')"; $result = mysql_query($query) or die('Query failed: ' . mysql_error()); echo ($query); mysqli_close($link); Это весь код. PHP: $jsondata = json_decode($testd, true); print_r ($jsondata); Декодируем данные для удобоваримого вида. получаем: Код (Text): Array ( [0] => Array ( [order_id] => 4984305291 [type_id] => 34 [location_id] => 60000292 [is_buy_order] => 1 [issued] => 2017-10-13T21:06:14Z ) [1] => Array ( [order_id] => 4982814165 [type_id] => 34 [location_id] => 60004366 [is_buy_order] => 1 [issued] => 2017-10-12T18:34:58Z ) [2] => Array ( [order_id] => 4833961968 [type_id] => 34 [location_id] => 60014659 [is_buy_order] => 1 [issued] => 2017-09-15T02:23:29Z ) ) Далее: PHP: foreach ($jsondata as $data) { $implodedata = implode(",", $data); echo "<br>"; print_r ($implodedata); echo "<br>"; echo "<br>"; } обрабатываем с помощью implode. После имеем данные вида: Код (Text): 4984305291,34,60000292,1,2017-10-13T21:06:14Z 4982814165,34,60004366,1,2017-10-12T18:34:58Z 4833961968,34,60014659,1,2017-09-15T02:23:29Z Дальнейшие действия: PHP: $explodedata = explode(",", $implodedata); echo"<br>"; print_r ($explodedata); echo"<br>"; Собираем из этого массив вида: Код (Text): Array ( [0] => 4833961968 [1] => 34 [2] => 60014659 [3] => 1 [4] => 2017-09-15T02:23:29Z ) Вот тут то я и затух. Не могу понять есть ли возможность запустить explode так что бы он собрал массив из одной пачки значений. Имею ввиду взял эту строку: Код (Text): 4833961968,34,60014659,1,2017-09-15T02:23:29Z обработал до вида массива Код (Text): Array ( [0] => 4833961968 [1] => 34 [2] => 60014659 [3] => 1 [4] => 2017-09-15T02:23:29Z ) далее передал данные $explodedata[0],$explodedata[1]... Оттуда отправить их на PHP: "INSERT INTO ards ( order_id, type_id, location_id, is_buy_order, issued) values ( '{$ad}', '{$bd}' , '{$cd}' , '{$ed}' , '{$dd}')"; и всё в цикле ведь, придётся обрабатывать 3 или более этих строк Код (Text): [{"order_id":4984305291,"type_id":34,"location_id":60000292,"is_buy_order":true,"issued":"2017-10-13T21:06:14Z"},{"order_id":4982814165,"type_id":34,"location_id":60004366,"is_buy_order":true,"issued":"2017-10-12T18:34:58Z"},{"order_id":4833961968,"type_id":34,"location_id":60014659,"is_buy_order":true,"issued":"2017-09-15T02:23:29Z"}] . Вот полная моя цель. Голова уже не варит от недосыпа и массы данных. Прошу помощи!
Вот с этого момента логика сломалась в твоих действиях, потому что ты не понимаешь, о чем я говорю и к чему веду. Перечитай внимателньо, еще раз. И перечитай документацию к MySQL multi INSERT, чтобы понять, к какому результату я двигаю это все. --- Добавлено --- Суть в том, что полученные строки не надо разбивать на массив. НЕ НАДО. Их надо обернуть в скобочки обыкновенные, склеить между собой полученные пачки данных в скобках через запятую имплодом и подставить в MySQL-запрос после секии VALUES. И получится синтаксически корректный запрос на множественную вставку. Там все просто, а ты пытаешься искать двойное дно и все усложять. Ты не спеши, а почитай о том, с чем работаешь.