Формирование многомерного массива

Тема в разделе "Инъекции в MySQL", создана пользователем Vitus, 10 сен 2018.

  1. Vitus

    Vitus New Member Пользователи

    Регистрация:
    12 июл 2017
    Сообщения:
    9
    Город:
    Moskow
    Добрый день. Всё никак не получается сформировать многомерный массив в php скрипт.
    Создаю несколько границ парсинга, далее создаю повторяющуюся границу парсинга, в которой вношу свои границы. Либо получаю отдельными переменными свои значения и в глобальный массив POST попадают отдельно, либо получается создать один массив (с результатами цикла парсинга) и разбить его на элементы при помощи функции $arrData1 = explode(",",$arrData); в итоге получаю элементы массива внутри которого все мои переменные одной строкой, т.к. вложенные конструкции [DATAENCODE][/DATAENCODE] как то не корректно отрабатываются.
    Видимо я что то не так делаю, а может и есть ограничение. Прошу помочь гуру парсинга мне в этом не лёгком деле :)
    Снимок экрана от 2018-09-10 15-47-03.png Снимок экрана от 2018-09-10 15-53-18.png Снимок экрана от 2018-09-10 15-54-08.png
     
  2. Vitus

    Vitus New Member Пользователи

    Регистрация:
    12 июл 2017
    Сообщения:
    9
    Город:
    Moskow
    [​IMG]
    Вот что то похожее хочется получить на входе php скрипта
     
  3. napserious

    napserious Well-Known Member Пользователи Активирован

    Регистрация:
    16 окт 2015
    Сообщения:
    324
    PHP:
    $array[2757] = array();
    $array[2757]['response'] = 'choice 1';
    $array[2757]['response_vote_count'] = 0;
    $array[2757]['voters'] = '';
    Так выглядит запись для вашего примера из второго поста.
     
    Последнее редактирование: 10 сен 2018
  4. napserious

    napserious Well-Known Member Пользователи Активирован

    Регистрация:
    16 окт 2015
    Сообщения:
    324
    PHP:
    <?php
    $array 
    = array();
    $array[2757] = array();
    $array[2757]['response'] = 'choice 1';
    $array[2757]['response_vote_count'] = 0;
    $array[2757]['voters'] = '';

    $array[2758] = array();
    $array[2758]['response'] = 'choice 2';
    $array[2758]['response_vote_count'] = 0;
    $array[2758]['voters'] = '';

    $array[2759] = array();
    $array[2759]['response'] = 'choice 3';
    $array[2759]['response_vote_count'] = 0;
    $array[2759]['voters'] = '';

    echo 
    '<pre>'print_r($array); echo '</pre>';
    ?>
    Результат:

    upload_2018-9-10_16-13-41.png
     
  5. Vitus

    Vitus New Member Пользователи

    Регистрация:
    12 июл 2017
    Сообщения:
    9
    Город:
    Moskow
    Это я пример привёл, мне надо сфоримровать такой массив на уровне парсера, и передать его одной переменной в глобальный массив POST в php скрипт.
    Второй пост был как пример структуры моего массива
     
  6. napserious

    napserious Well-Known Member Пользователи Активирован

    Регистрация:
    16 окт 2015
    Сообщения:
    324
    Приложите пример как должен выглядеть ваш масив, примерно.
     
  7. Vitus

    Vitus New Member Пользователи

    Регистрация:
    12 июл 2017
    Сообщения:
    9
    Город:
    Moskow
    <PHP_SCRIPT=Ссылки недоступны для гостей
    Это шаблон вывода

    myArr должен иметь конечную структуру:

    Array(
    [0] => Array (
    [cod_pid] => 1
    [pname] => "товар1"
    [price] => 10
    )​
    [1] => Array (
    [cod_pid] => 2
    [pname] => "товар2"
    [price] => 20
    )​
    [2] => Array (
    [cod_pid] => 3
    [pname] => "товар3"
    [price] => 30
    )​
    )

    cod_pid, pname, price - переменные в которые попадают результаты парсинга границ [GRAN1], [GRAN2], [GRAN3]
     
  8. napserious

    napserious Well-Known Member Пользователи Активирован

    Регистрация:
    16 окт 2015
    Сообщения:
    324
    Обработчик PHP:
    PHP:
    <?php

    $data 
    $_POST["myArr"];
    $id 0;
    foreach (
    explode(';'$data) as $piece) {
    $piece explode(','$piece);
    foreach (
    $piece as $new_piece){
    $result[$id] = explode('='$new_piece);
    $array[$id][$result[$id][0]] = $result[$id][1];
    }
    $id++;
    }
    print_r($array); // ТУТ НУЖНЫЙ ВАМ МАССИВ. В $array
    ?>
    Вот что я послал к нему:

    Код:
    <PHP_SCRIPT=http://localhost/array/index.php>myArr=[DATAENCODE]cod_pid=1,pname=товар1,price=10;cod_pid=2,pname=товар2,price=20;cod_pid=3,pname=товар3,price=30[/DATAENCODE]</PHP_SCRIPT>
    Вот что получилось после обработки в PHP:
    Код:
    Array
    (
    [0] => Array
    (
    [cod_pid] => 1
    [pname] => товар1
    [price] => 10
    )
    [1] => Array
    (
    [cod_pid] => 2
    [pname] => товар2
    [price] => 20
    )
    [2] => Array
    (
    [cod_pid] => 3
    [pname] => товар3
    [price] => 30
    )
    )
     
    Vitus нравится это.
  9. Kreol

    Kreol Модератор Команда форума Модератор

    Регистрация:
    6 янв 2013
    Сообщения:
    2.666
    а если их там тысячи?)
    повторяющимися нельзя сделать?
     
  10. Vitus

    Vitus New Member Пользователи

    Регистрация:
    12 июл 2017
    Сообщения:
    9
    Город:
    Moskow
    У меня как раз повторяющаяся граница парсинга, потому что да их там тысячи, и нет желания тысячу раз вызывать скрипт добавления в базу, хочется передать массив данных и уже внутри php скрипта обработать этот массив данных.
     
  11. Kreol

    Kreol Модератор Команда форума Модератор

    Регистрация:
    6 янв 2013
    Сообщения:
    2.666
    Тогда я не понял что именно вы хотели?
    Берем правильную структуру массива и по ней строим в повторяющейся шаблон.
     
  12. napserious

    napserious Well-Known Member Пользователи Активирован

    Регистрация:
    16 окт 2015
    Сообщения:
    324
    Так он работает и для милионов элементов)
    Не понял почему вы подумали что он только для тех которые из примера?

    Там где я привел пример выше из шаблона вывода это было содержимое из CD_CYCLE_GRAN.
     
    Последнее редактирование: 11 сен 2018
  13. napserious

    napserious Well-Known Member Пользователи Активирован

    Регистрация:
    16 окт 2015
    Сообщения:
    324
    Когда я писал скрипт я отправлял в него тысячи повт. границ. Но чтобы @Vitus было понятно, при публикации ответа я заменил свои данные под данные из его примера.
     
  14. napserious

    napserious Well-Known Member Пользователи Активирован

    Регистрация:
    16 окт 2015
    Сообщения:
    324
    Для записи в sql вам нужен не массив, а строки)

    Так как запись в sql выглядет так:
    Код:
    INSERT INTO table_name (cod_pid, pname, price) VALUES ((1, товар1, 10), (2, товар2, 20), (3, товар3, 30))
     
    Последнее редактирование: 11 сен 2018
  15. Vitus

    Vitus New Member Пользователи

    Регистрация:
    12 июл 2017
    Сообщения:
    9
    Город:
    Moskow
    Я думал что на уровне парсера можно сформировать массив и передать POST запросом в скрипт.
    Теперь понятно что передаем одну большую строку и разбиваем как надо в самом php скрипте.

    Теперь всё встало на свои места, спасибо большое за ответ и пример.
     
  16. napserious

    napserious Well-Known Member Пользователи Активирован

    Регистрация:
    16 окт 2015
    Сообщения:
    324
    @Vitus

    Запись повт. границ в MySQL через один запрос.

    Шаблон вывода:
    Код:
    <PHP_SCRIPT=http://10.0.1.44/frm/cd/test.php>myArr=[DATAENCODE]<CD_CYCLE_GRAN_1!>[/DATAENCODE]</PHP_SCRIPT>
    Содержимое <CD_CYCLE_GRAN_1!>:
    Код:
    cod_pid=1,pname=товар1,price=10;cod_pid=2,pname=товар2,price=20;cod_pid=3,pname=товар3,price=30
    Код из Ссылки недоступны для гостей:
    PHP:
    <?php
    header
    ("Access-Control-Allow-Origin: *");
    header("Content-Type: application/json; charset=UTF-8");
    $conn = new mysqli('localhost''root''''database_name');
    $fields '';
    $data $_POST["myArr"];
    $id 0;
    $i=0;
    foreach (
    explode(';'$data) as $piece) {
    $piece explode(','$piece);
    foreach (
    $piece as $new_piece){
    $result[$id] = explode('='$new_piece);
    $array[$id][$result[$id][0]] = $result[$id][1];
    $len count($array[$id]);
    if (
    $id==0) {
    $fields .= $result[$id][0].", ";
    }
    }
    $id++;
    }
    $fields rtrim($fields,", ");
    $values = array();
    foreach (
    $array as $rowValues) {
    foreach (
    $rowValues as $key => $rowValue) {
    $rowValues[$key] = mysqli_real_escape_string$conn$rowValues[$key]);
    }
    $values[] = "(" implode(', '$rowValues) . ")";
    }
    $query "INSERT INTO table_name ($fields) VALUES (" implode (', '$values) . ")";
    mysqli_query($conn,$query);
    echo 
    $query// ТУТ ВАШ ЗАПРОС.
    ?>

    В результате всего выполняется запроса к базе данных такого вида:
    Код:
    INSERT INTO table_name (cod_pid, pname, price) VALUES ((1, товар1, 10), (2, товар2, 20), (3, товар3, 30))
     
    Последнее редактирование: 11 сен 2018
    SEO_Tesla, Kreol и Vitus нравится это.
  17. Vitus

    Vitus New Member Пользователи

    Регистрация:
    12 июл 2017
    Сообщения:
    9
    Город:
    Moskow
    Я получил ответ полностью. Спасибо ещё раз за развёрнутый ответ. Думаю другим пользователям будет полезен тоже пример. Хорошего дня
     
    napserious нравится это.
  18. napserious

    napserious Well-Known Member Пользователи Активирован

    Регистрация:
    16 окт 2015
    Сообщения:
    324
    Всегда пожалуйста =)
     
    Vitus нравится это.

Поделиться этой страницей