Как избежать дублирования результатов при импорте из RSS

#php #mysql #rss

#php #mysql #RSS-канал

Вопрос:

Я импортирую данные из RSS в mysql, используя core php, каждые x часов, но я борюсь с дублирующимися записями.

 $rss_url = 'https://promograd.bg/feed/agg/common.xml?a=143';
    $xml = simplexml_load_file($rss_url);
    foreach($xml->ITEM as $item) {
        $title = mysqli_real_escape_string($link, $item->TITLE);
        $offerUrl = $item->URL;
        $description = mysqli_real_escape_string($link, $item->DESCRIPTION);
        $offerTerms = mysqli_real_escape_string($link, $item->TERMS);
        $originalPrice = $item->ORIGINAL_PRICE;
        $finalPrice = $item->FINAL_PRICE;
        $offerDiscount = $item->DISCOUNT;
        $offerSales = $item->SALES;
        $offerEnds = $item->DEAL_END;
        $lat_coordinates = $item->LAT;
        $lng_coordinates = $item->LNG;
        $city = mysqli_real_escape_string($link, $item->CITY);
        $category = mysqli_real_escape_string($link, $item->CATEGORY);

        $img = $item->IMAGE;

        $query = mysqli_query($link, "
        INSERT INTO......       
        }
  

Моя проблема в том, что когда я запускаю этот скрипт, он импортирует те же результаты, но не так много нового.. Как я могу избежать дублирования результатов?

Комментарии:

1. Используйте insert ignore по ссылке, так как ссылка всегда будет уникальной

2. Какой узел вы хотите проверить на наличие дубликатов?

3. @RakeshJakhar заголовок для примера

4. Не проверяйте заголовок на дублирование. заголовок может быть одинаковым для нескольких сообщений. но ссылка на сообщение всегда будет уникальной

5. Где логика для проверки дубликатов? Используете ли вы индексы в своей базе данных?

Ответ №1:

Например, если вы проверяете заголовок на наличие дубликатов, вы можете попробовать это:-

 $rss_url = 'https://promograd.bg/feed/agg/common.xml?a=143';
$xml = simplexml_load_file($rss_url);
$tempRecords = array(); // temp array store titles
foreach($xml->ITEM as $item) {
    $title = mysqli_real_escape_string($link, $item->TITLE);
    if(in_array($title, $tempRecords)){ //skip if exists
        continue;
    }else{ // else insert
        //$title = mysqli_real_escape_string($link, $item->TITLE);
        $tempRecords[] = $title; //assign to temp array

        $offerUrl = $item->URL;
        $description = mysqli_real_escape_string($link, $item->DESCRIPTION);
        $offerTerms = mysqli_real_escape_string($link, $item->TERMS);
        $originalPrice = $item->ORIGINAL_PRICE;
        $finalPrice = $item->FINAL_PRICE;
        $offerDiscount = $item->DISCOUNT;
        $offerSales = $item->SALES;
        $offerEnds = $item->DEAL_END;
        $lat_coordinates = $item->LAT;
        $lng_coordinates = $item->LNG;
        $city = mysqli_real_escape_string($link, $item->CITY);
        $category = mysqli_real_escape_string($link, $item->CATEGORY);

        $img = $item->IMAGE;

        $query = mysqli_query($link, "
        INSERT INTO......  
    }

    }
  

Вы также можете сделать это с помощью запроса mysql, пожалуйста, перейдите по ссылке

 https://ypereirareis.github.io/blog/2016/03/22/mysql-insert-ignore-alternatives/
  

Ответ №2:

Поместите уникальный ключ в таблицу для столбца, который вы не хотите дублировать. Или вы можете поместить уникальный ключ в несколько столбцов, например, комбинацию заголовка и URL-адреса.

Теперь в инертном запросе

используйте insert ignore , чтобы избежать вставки повторяющихся записей

или используйте on duplicate key update для обновления некоторых полей при обнаружении дублирующейся записи. например, если вы хотите обновить новую цену для той же существующей записи.