Двойная передача строк в базы данных MySQL с использованием PHP


eBay Уведомления платформы рекомендует периодически опрашивать API GetOrders , чтобы убедиться, что каждый заказ получен.

В моем случае у меня настроена платформа уведомлений для анализа полученного XML-файла и вставки его в базу данных MySQL с использованием PHP.

Теперь я ищу, как рекомендовано, "двойной проход" с использованием GetOrders, который, по сути, должен давать мне дубликаты для каждой отдельной строки (или порядка).

Моя структура довольно простой. Но у меня есть UNIQUE INDEX для OrderLineItemID, который, насколько я понимаю, является уникальным идентификатором для каждого заказа eBay.

Есть ли лучший способ сделать это, чем я сейчас делаю?

//retrieve and escape variables for insertion//

$sql = "INSERT INTO eBayOrders (OrderLineItemID, SalesRecordNumber, BuyerUserID, BuyerEmail, Title, SKU, Quantity, TransactionPrice)
VALUES ('".$orderlineitemid."', '".$recordnumber."', '".$buyeruserid."', '".$buyeremail."', '".$title."', '".$sku."', '".$qty."', '".$transactionprice."')";
}

if ($connect->query($sql) === TRUE) {
         echo "New Record Created Successfully";
} else {
         echo "Error: " . $sql . "<br />" . $connect->error;
      $connect->close();
      die();
}

Из-за моего UNIQUE НА OrderLineItemID, когда поступает дублирующий заказ, запрос приведет к ошибке, закроет соединение, а затем выйдет из сценария.

Я подумал о том, чтобы сначала проверить (возможно, с помощью оператора SELECT), существует ли строка, а затем попробовать вставить, но Я выполняю цикл foreach до 100 заказов, используя API GetOrders для выполнения своих SQL-запросов, и кажется, что просто позволить ему ошибиться может быть более быстрым вариантом, но я устал, если это может вызвать проблемы в будущем.

В целом, я не знаком с лучшими практиками для "двойных проходов" MySQL. У кого-нибудь есть какие-либо идеи о том, как лучше всего это сделать?

Редактировать: вот весь мой цикл foreach:

foreach ($orders as $order) {
                $i++;
                        $buyeruserid2 = $order->BuyerUserID;
                            $buyeruserid = mysqli_real_escape_string($connect, $buyeruserid2);
                     // $extendedorderid = $order->TransactionArray->Transaction->ExtendedOrderID;
                        $buyeremail2 = $order->TransactionArray->Transaction->Buyer->Email;
                            $buyeremail = mysqli_real_escape_string($connect, $buyeremail2);
                        $salesrecordnumber2 = $order->TransactionArray->Transaction->ShippingDetails->SellingManagerSalesRecordNumber;
                            $salesrecordnumber = mysqli_real_escape_string($connect, $salesrecordnumber2);
                        $orderlineitemid2 = $order->TransactionArray->Transaction->OrderLineItemID;
                            $orderlineitemid = mysqli_real_escape_string($connect, $orderlineitemid2);
                        $title2 = $order->TransactionArray->Transaction->Item->Title;
                            $title = mysqli_real_escape_string($connect, $title2);
                        $sku2 = $order->TransactionArray->Transaction->Item->SKU;
                            $sku = mysqli_real_escape_string($connect, $sku2);
                        $quantitypurchased2 = $order->TransactionArray->Transaction->QuantityPurchased;
                            $quantitypurchased = mysqli_real_escape_string($connect, $quantitypurchased2);
                        $transactionprice2 = $order->TransactionArray->Transaction->TransactionPrice;
                            $transactionprice = mysqli_real_escape_string($connect, $transactionprice2);

            echo $i;
            echo "\n";
            echo "BuyerUserID: " . $buyeruserid . "\n";
            echo "extendedorderid: " . $quantitypurchased . "\n";
            echo "BuyerEmail: " . $buyeremail . "\n";
            echo "SellingManagerSalesRecordNumber: " . $salesrecordnumber . "\n";
            echo "OrderLineItemID: " . $orderlineitemid . "\n";
        // echo "ExtendedOrderID: " . $transaction->ExtendedOrderID . "\n";
            echo "Title: " . $title . "\n";
            echo "SKU: " . $sku . "\n";
            echo "QuantityPurchased: " . $quantitypurchased . "\n";
            echo "TransactionPrice: " . $transactionprice . "\n";
            echo "\n";


$sql = "INSERT INTO eBayOrders (OrderLineItemID, SalesRecordNumber, BuyerUserID, BuyerEmail, Title, SKU, Quantity, TransactionPrice)
VALUES ('".$orderlineitemid."', '".$recordnumber."', '".$buyeruserid."', '".$buyeremail."', '".$title."', '".$sku."', '".$qty."', '".$transactionprice."')";

if ($connect->query($sql) === TRUE) {
  echo "New Record Created Successfully";
} else {
  echo "Error: " . $sql . "<br />" . $connect->error;
  $connect->close();
  die();
}


}
Author: bbruman, 2017-03-16

1 answers

Чтобы избежать ошибки при сбое ВСТАВКИ из-за ограничения уникального ключа, мы можем использовать опцию ИГНОРИРОВАТЬ в инструкции INSERT.

INSERT IGNORE INTO eBayOrders ...

Если вы используете модификатор ИГНОРИРОВАТЬ, ошибки, возникающие при выполнении инструкции INSERT, игнорируются. Например, без ИГНОРИРОВАНИЯ строка, которая дублирует существующий УНИКАЛЬНЫЙ индекс или значение ПЕРВИЧНОГО КЛЮЧА в таблице, вызывает ошибку с дубликатом ключа, и инструкция прерывается. При ИГНОРИРОВАНИИ строка отбрасывается, и ошибка не возникает. Игнорируется вместо этого ошибки генерируют предупреждения.

Но это также влияет на условия ошибок, отличные от исключений повторяющихся ключей.

В качестве другого варианта мы можем использовать INSERT ... ON DUPLICATE KEY ...

Документация доступна здесь:

Ссылка: https://dev.mysql.com/doc/refman/5.7/en/insert.html

 1
Author: spencer7593, 2017-03-16 15:07:39