PHP / SQL / XMLReader - обновить большую таблицу, используя другую - PullRequest
0 голосов
/ 23 ноября 2018

Я использую XMLReader для импорта продукта в мою таблицу SQL.В таблице «товары» 62419 товаров.Когда-то в первом XML-файле нет цены на продукты, но они находятся во втором файле.Поэтому я снова использую XMLReader для хранения этих цен в таблице «products_prices».Сейчас у меня 50912 предметов в этой таблице.Мне нужно решение, как обновлять цены в таблице «products» с помощью «products_prices».

Схема для таблицы «products»:

id
pxmlId
pprice
psale_price

Схема для таблицы «products_prices»:

id
pxml_id
pprice
psale_price

'pxmlId' и 'pxml_id' - это одно и то же - это продукт ID из обоих файлов .xml.

Что я пробовал:

  1. Первая заливка 'Затем в таблицу products_prices, когда XMLReader считывает файлы .xml для таблицы «products», я отправляю запрос в «products_prices», если существует какой-либо «pxml_id».if is then получить цены и обновить последний запрос.

Это займет много времени, и иногда я получаю '500 error'.

Что я могу сделать: 1. Получитьэлементы из «products_prices» и помещают их в большой массив тогда, когда XMLReader считывает файлы .xml для поиска «products» в этом массиве по ценам.

Объедините эти XML-файлы, используя XMLReader, но я не знаю, возможно ли это.

Это код для XMLReader:

    $reader = new XMLReader();
    $reader->open($wpis->feed);

    while($reader->read() && $reader->name != 'item' && $reader->name != 'entry'){;}

    $i = 0;
    $e = 0;
    while($reader->name === 'item')
    {
        $parent = $reader->expand();
        $price = $parent->getElementsByTagName('price')->item(0)->nodeValue;
        $description = $parent->getElementsByTagName('description')->item(0)->nodeValue;
        $title = $parent->getElementsByTagName('title')->item(0)->nodeValue;
        $sale_price = $parent->getElementsByTagName('sale_price')->item(0)->nodeValue;
        $gtin = $parent->getElementsByTagName('gtin')->item(0)->nodeValue;
        $availability = $parent->getElementsByTagName('availability')->item(0)->nodeValue;
        $link = $parent->getElementsByTagName('link')->item(0)->nodeValue;
        $condition = $parent->getElementsByTagName('condition')->item(0)->nodeValue;
        $image_link = $parent->getElementsByTagName('image_link')->item(0)->nodeValue;
        $brand = $parent->getElementsByTagName('brand')->item(0)->nodeValue;
        $pxmlId = $parent->getElementsByTagName('id')->item(0)->nodeValue;

        $clean_price = preg_replace('/[^.0-9]/', '', $price);
        $sale_clean_price = preg_replace('/[^.0-9]/', '', $sale_price);

        if($gtin){
            $gtins = $gtin;
        } else {
            $gtins = 'nogtin';
        }

        $data = array(
            'ptitle' => trim($title),
            'pdesc' => $description,
            'pprice' => $clean_price,
            'psale_price' => $sale_clean_price,
            'pgtin' => $gtins,
            'pavailability' => $availability,
            'plink' => $link,
            'pcondition' => $condition,
            'pimage' => $image_link,
            'pbrand' => $brand,
            'pbrand_tag' => zmiana($brand),
            'pshop_currency' => $wpis->waluta,
            'pshop' => $wpis->nazwa,
            'pshop_id' => $wpis->id,
            'pxmlId' => $pxmlId
        );

        $db->insert('gmc_products', $data);
        $lastId = $db->lastInsertId();

        $reader->next('item');

        $i++;
    }
...