За последние 24 часа нас посетили 16666 программистов и 1651 робот. Сейчас ищут 1747 программистов ...

Запись данных из строки в бд.

Тема в разделе "PHP и базы данных", создана пользователем Good_PHP, 14 окт 2017.

  1. Good_PHP

    Good_PHP Новичок

    С нами с:
    14 окт 2017
    Сообщения:
    21
    Симпатии:
    1
    Здравствуйте! Столкнулся с проблемой. Имеется стока данных вида:
    Код (Text):
    1. [{"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. Если найдутся те кто даст сразу готовый код, прошу этих людей дать ссылки на ресурсы касательно моего вопроса для личного, подробного изучения.
     
    #1 Good_PHP, 14 окт 2017
    Последнее редактирование: 14 окт 2017
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.797
    Симпатии:
    1.331
    Адрес:
    Лень
  3. Good_PHP

    Good_PHP Новичок

    С нами с:
    14 окт 2017
    Сообщения:
    21
    Симпатии:
    1
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.797
    Симпатии:
    1.331
    Адрес:
    Лень
  5. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Ну..каков вопрос, таков ответ:
    Код (Text):
    1. 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"}]');
     
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.797
    Симпатии:
    1.331
    Адрес:
    Лень
     
  7. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Мамой клянус, данные из этой строки это

    [{"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"}]

    Трыжды провэрил. Других данных там нэт.
     
    mahmuzar нравится это.
  8. Good_PHP

    Good_PHP Новичок

    С нами с:
    14 окт 2017
    Сообщения:
    21
    Симпатии:
    1
    Да, я поспешил и неправильно описал свой вопрос. В идеале я имел ввиду что бы в бд в таблице например test в столбец order_id заносились данные 4984305291, в столбец type_id данные 34, location_id 60000292 и так далее. Но смысл понял. В преть буду более точно составлять вопрос.
     
  9. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Ну тогда тебе надо действительно, для начала, сконвертить эту строку в структуру данных через json_decode.
    Потом, из этой структуры надо сформировать группы типа

    Код (Text):
    1. '('.$data.')'
    Да, со скобками, это важно. Где $data - это элементы структуры, отражающие строки, прогнанные через implode с запятой в качестве соединителя.

    Потом эти группы снова прогнать через implode с запятой в качестве соединителя.
    Все это в переменную сохранить, ессно дело.

    Потом эту переменную воткнуть в запрос INSERT INTO, где правильно перечислены твои колонки. Вставлять после слова VALUES.

    ну и про SQL-инъекции почитать неплохо бы, и про то, как их избежать.
     
  10. Good_PHP

    Good_PHP Новичок

    С нами с:
    14 окт 2017
    Сообщения:
    21
    Симпатии:
    1
    Подскажи пожалуйста поподробнее насчёт групп:
    . Нигде в гугле не могу найти информации.
     
  11. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    А потому что это не пхпшный термин. Это я тебе описал человеческим языком алгоритм.
    прогонишь через имплод элементы массива, получишь строки, состоящие из его значений, склеенных запятой. Это и есть то, что я назвал группами :)

    Ты попробуй начать делать то, что я описал, сам все поймешь.
     
  12. Good_PHP

    Good_PHP Новичок

    С нами с:
    14 окт 2017
    Сообщения:
    21
    Симпатии:
    1
    Ты имел ввиду это я должен получить??
    Код (Text):
    1.  [{"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:
    1. foreach ($testd as $i => $value) {
    2.    implode(",", [$i]);
    3. }
    4. print_r($testd);
     
    #12 Good_PHP, 15 окт 2017
    Последнее редактирование: 15 окт 2017
  13. Good_PHP

    Good_PHP Новичок

    С нами с:
    14 окт 2017
    Сообщения:
    21
    Симпатии:
    1
    Нашёл таки способ это сделать!
    PHP:
    1. $jd = json_decode($testd, true);
    2. foreach ($jd as $value) {
    3. $fr = implode(",", $value);
    4. }
    И получил эти строки:
    Код (Text):
    1. 4984305291,34,60000292,1,2017-10-13T21:06:14Z
    2.  
    3. 4982814165,34,60004366,1,2017-10-12T18:34:58Z
    4.  
    5. 4833961968,34,60014659,1,2017-09-15T02:23:29Z
    Далее
    PHP:
    1. $dfr = explode(",", $fr);
    2. $ad = $dfr[0];
    3. $bd = $dfr[1];
    4. $cd = $dfr[2];
    5. $ed = $dfr[3];
    6. $dd = $dfr[3];
    что дало
    Код (Text):
    1. 4833961968
    2.  
    3. 34
    4.  
    5. 60014659
    6.  
    7. 1
    8.  
    9. 2017-09-15T02:23:29Z
    этот результат из последней строки поскольку цикл. Теперь вот мучаюсь с записью в бд. Запись не идёт. Видимо опять у меня ошибки где то.
    PHP:
    1. $link = mysqli_connect($host, $user, $password, $database) or die("Ошибка доступа к бд" . mysqli_error($link));
    2. $db = mysql_select_db( 'id3242305_evio', $link );  
    3. $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);
    4. mysqli_close($link);
    Это код которым я пытаюсь внести эти данные в бд, но запись не идёт. mysql_error($result); ничего не возвращает. Если кто сможет пожалуйста подскажите в какую сторону копать) Заранее спасибо!)
     
  14. Good_PHP

    Good_PHP Новичок

    С нами с:
    14 окт 2017
    Сообщения:
    21
    Симпатии:
    1
    переписал SQL запрос в такой вид
    PHP:
    1. $result = ("INSERT INTO ards ( order_id, type_id, location_id, is_buy_order, issued) values ( '{$ad}', '{$bd}' , '{$cd}' , '{$ed}' , '{$dd}')");
    2. mysql_query($result);
    3. echo $result;
    4. mysqli_close($link);
    теперь отображается echo $result; и выглядит так:
    Код (Text):
    1. INSERT INTO ards ( order_id, type_id, location_id, is_buy_order, issued) values ( '4833961968', '34' , '60014659' , '1' , '2017-09-15T02:23:29Z')
    Но запись в бд всё равно не идёт( Пробую дальше...
     
  15. Good_PHP

    Good_PHP Новичок

    С нами с:
    14 окт 2017
    Сообщения:
    21
    Симпатии:
    1
    А вот так заработало:
    PHP:
    1. # Соединение
    2. mysql_connect('localhost', 'USER', 'PASSWORD') or die('Could not connect: ' . mysql_error());
    3. # Выбор базы данных
    4. mysql_select_db('id3242305_evio') or die('Не могу выбрать базу данных');
    5. # Выполнение запроса
    6.  
    7. # Выполнение запроса
    8. $query = "INSERT INTO ards ( order_id, type_id, location_id, is_buy_order, issued) values ( '{$ad}', '{$bd}' , '{$cd}' , '{$ed}' , '{$dd}')";
    9. $result = mysql_query($query) or die('Query failed: ' . mysql_error());
     
  16. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.797
    Симпатии:
    1.331
    Адрес:
    Лень
    ...
    поддерживаю юзеров юзающих пхп 7.*
    удачи
     
  17. Good_PHP

    Good_PHP Новичок

    С нами с:
    14 окт 2017
    Сообщения:
    21
    Симпатии:
    1
    Спасибо))
     
  18. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.797
    Симпатии:
    1.331
    Адрес:
    Лень
    json_encode — Возвращает JSON-представление данных

    тс наглядно назвал просто как строкой с данными
     
  19. Good_PHP

    Good_PHP Новичок

    С нами с:
    14 окт 2017
    Сообщения:
    21
    Симпатии:
    1
    У меня опять трабла:
    Код (Text):
    1. 4984305291,34,60000292,1,2017-10-13T21:06:14Z
    2.  
    3. 4982814165,34,60004366,1,2017-10-12T18:34:58Z
    4.  
    5. 4833961968,34,60014659,1,2017-09-15T02:23:29Z
    этих записей 3, и при записи в бд записывается последняя. а хотелось бы их пустить через цикл что бы занеслись все 3 в поля в бд. Я нашёл конструкцию
    PHP:
    1. $query = "INSERT INTO `ards` ( order_id, type_id, location_id, is_buy_order, issued) values ";
    2.  
    3. foreach ($fr as $i=>$value) {
    4.   $query .= "'{$value}'";
    5.  
    6.   if ($i+1 < count($fr)) {
    7.     $query .= ", ";
    8.   }
    9. } // Result query: INSERT INTO `table`(nomer) VALUES (1), (2), (3), (4), (5)
    10.  
    11. $res = mysql_query($query);
    12. echo ($query);
    13. $mysqli->close();
    немного адаптировал под себя. получаю SQL строку запроса вида:
    Код (Text):
    1. INSERT INTO `ards` ( order_id, type_id, location_id, is_buy_order, issued) values '4833961968', '34', '60014659', '1', '2017-09-15T02:23:29Z',
    а нужно что бы она была такого вида:
    Код (Text):
    1. INSERT INTO ards ( order_id, type_id, location_id, is_buy_order, issued) values ( '4833961968', '34' , '60014659' , '1' , '2017-09-15T02:23:29Z')
    именно непойму куда в цикл встроить () что бы ограничить values.
     
  20. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.797
    Симпатии:
    1.331
    Адрес:
    Лень
    --- Добавлено ---
    ?
    --- Добавлено ---
    фиговая конструкция, выше implode упоминали
    --- Добавлено ---
    сейчас бы Лерму сюда пропихнуть..
    PHP:
    1. <?php
    2.  
    3. Lerma::prepare( 'INSERT INTO `ards` ( `order_id`, `type_id`, `location_id`, `is_buy_order`, `issued` ) VALUES ( ?,?,?,?,? )', json_decode ( '...' ) );
    4.  
    5. # ( sql, [[],[],[],[],[]] )



     
  21. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Они в массиве?

    PHP:
    1. array_walk($array, function(&$val,$key){
    2.     $val = '('.$val.')';
    3. });
    4.  
    5. $values = implode(',', $array);
    И вот values пихай в запрос.
    --- Добавлено ---
    Да, на древних версиях php этот код может не заработать. Можно, в принципе, на foreach переписать, суть не поменяется особо.
     
    MouseZver нравится это.
  22. Good_PHP

    Good_PHP Новичок

    С нами с:
    14 окт 2017
    Сообщения:
    21
    Симпатии:
    1
    это php 7?
     
  23. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Если ты про анонимную функцию, то эта возможность появилась еще до седьмой версии. Но не сильно прям давно.
     
  24. Good_PHP

    Good_PHP Новичок

    С нами с:
    14 окт 2017
    Сообщения:
    21
    Симпатии:
    1
    Такс что то я совсем запутался! Уже более 20 часов с этой траблой воюю.@Fell-x27 у меня последняя надежда на тебя.в общем всё обстоит так:
    PHP:
    1. $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"}]';
    2.  
    3. $jsondata = json_decode($testd, true);
    4. print_r ($jsondata);
    5.  
    6. foreach ($jsondata as $data) {
    7. $implodedata = implode(",", $data);
    8.    echo "<br>";
    9.    print_r ($implodedata);
    10.    echo "<br>";
    11.    echo "<br>";
    12. }
    13.  
    14. $explodedata = explode(",", $implodedata);
    15. echo"<br>";
    16. print_r ($explodedata);
    17. echo"<br>";
    18.  
    19. $ad = $explodedata[0];
    20. $bd = $explodedata[1];
    21. $cd = $explodedata[2];
    22. $ed = $explodedata[3];
    23. $dd = $explodedata[4];
    24.  
    25.  
    26.  
    27.  
    28.  
    29. # Соединение
    30. mysql_connect('localhost', 'id3242305_root1', '1qwe4ASD') or die('Could not connect: ' . mysql_error());
    31. # Выбор базы данных
    32. mysql_select_db('id3242305_evio') or die('Не могу выбрать базу данных');
    33.  
    34. # Выполнение запроса
    35.  
    36. $query = "INSERT INTO ards ( order_id, type_id, location_id, is_buy_order, issued) values ( '{$ad}', '{$bd}' , '{$cd}' , '{$ed}' , '{$dd}')";
    37. $result = mysql_query($query) or die('Query failed: ' . mysql_error());
    38. echo ($query);
    39. mysqli_close($link);
    Это весь код.
    PHP:
    1. $jsondata = json_decode($testd, true);
    2. print_r ($jsondata);
    Декодируем данные для удобоваримого вида. получаем:
    Код (Text):
    1. 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:
    1. foreach ($jsondata as $data) {
    2. $implodedata = implode(",", $data);
    3.    echo "<br>";
    4.    print_r ($implodedata);
    5.    echo "<br>";
    6.    echo "<br>";
    7. }
    обрабатываем с помощью implode. После имеем данные вида:
    Код (Text):
    1. 4984305291,34,60000292,1,2017-10-13T21:06:14Z
    2.  
    3. 4982814165,34,60004366,1,2017-10-12T18:34:58Z
    4.  
    5. 4833961968,34,60014659,1,2017-09-15T02:23:29Z
    Дальнейшие действия:
    PHP:
    1. $explodedata = explode(",", $implodedata);
    2. echo"<br>";
    3. print_r ($explodedata);
    4. echo"<br>";
    Собираем из этого массив вида:
    Код (Text):
    1. Array ( [0] => 4833961968 [1] => 34 [2] => 60014659 [3] => 1 [4] => 2017-09-15T02:23:29Z )
    Вот тут то я и затух. Не могу понять есть ли возможность запустить explode так что бы он собрал массив из одной пачки значений. Имею ввиду взял эту строку:
    Код (Text):
    1. 4833961968,34,60014659,1,2017-09-15T02:23:29Z
    обработал до вида массива
    Код (Text):
    1. Array ( [0] => 4833961968 [1] => 34 [2] => 60014659 [3] => 1 [4] => 2017-09-15T02:23:29Z )
    далее передал данные $explodedata[0],$explodedata[1]... Оттуда отправить их на
    PHP:
    1. "INSERT INTO ards ( order_id, type_id, location_id, is_buy_order, issued) values ( '{$ad}', '{$bd}' , '{$cd}' , '{$ed}' , '{$dd}')";
    и всё в цикле ведь, придётся обрабатывать 3 или более этих строк
    Код (Text):
    1. [{"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"}]
    . Вот полная моя цель. Голова уже не варит от недосыпа и массы данных. Прошу помощи!
     
    #24 Good_PHP, 15 окт 2017
    Последнее редактирование: 15 окт 2017
  25. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Вот с этого момента логика сломалась в твоих действиях, потому что ты не понимаешь, о чем я говорю и к чему веду. Перечитай внимателньо, еще раз. И перечитай документацию к MySQL multi INSERT, чтобы понять, к какому результату я двигаю это все.
    --- Добавлено ---
    Суть в том, что полученные строки не надо разбивать на массив. НЕ НАДО. Их надо обернуть в скобочки обыкновенные, склеить между собой полученные пачки данных в скобках через запятую имплодом и подставить в MySQL-запрос после секии VALUES. И получится синтаксически корректный запрос на множественную вставку.

    Там все просто, а ты пытаешься искать двойное дно и все усложять. Ты не спеши, а почитай о том, с чем работаешь.