2017-03-16 10 views
3

eBay Platform NotificationsGetOrders API를 주기적으로 폴링하여 모든 주문을 받도록합니다.PHP를 사용하여 MySQL 데이터베이스에 행을 두 번 전달

내 경우에는받은 XML 파일을 구문 분석하고 PHP를 사용하여 MySQL 데이터베이스에 삽입하도록 플랫폼 알림을 설정했습니다.

이제 추천대로 "double pass"를 GetOrders으로 사용하여 본질적으로 각각의 모든 행 (또는 주문)에 대해 복제본을 제공해야합니다.

내 구조는 다소 간단합니다. 하지만 은 OrderLineItemID입니다. 제 생각에 각 이베이 주문의 고유 식별자입니다.

현재 수행중인 것보다 더 효과적인 방법이 있습니까? 때문에 중복 주문이 들어 오면, 쿼리가 연결을 닫은 다음 스크립트를 종료, 오류가 발생합니다 내 UNIQUEOrderLineItemID, ON의

//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(); 
} 

.

행이 존재하고 삽입을 시도하면 먼저 SELECT 문을 사용하여 확인하려고했으나 실행하려면 GetOrders API를 사용하여 최대 100 개 주문의 foreach 루프를 수행하고 있습니다. 내 SQL 쿼리, 그리고 그것이 단지 오류가 빠를 수 있도록하는 것이 더 빠른 선택일지도 모른다. 그러나 이것이 문제를 일으키는 원인이 될 수 있다면 나는 지치고있다.

나는 모두 MySQL의 모범 사례에 익숙하지 않습니다. 누구든지이 작업을 수행하는 가장 좋은 방법에 대해 통찰력을 갖고 있습니까?

편집 : 우리는이 INSERT 문에서 무시 옵션을 사용할 수 있습니다, 때문에 고유 키 제약 조건에 INSERT가 실패 할 때

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(); 
} 


} 
+0

SQL 주입, 나는 준비에 대한 자세한 내용은 좋아 사용할 수 – Jens

+0

방지하기 위해 준비된 명령문에 대해 알아보기 진술. mysqli_real_escape_string을 사용하여 SQL injection 용 변수를 캡슐화했지만 현재 질문과 관련이 없다고 느꼈을 때 포함하지 않았다. – bbruman

+2

'INSERT ... ON DUPLICATE KEY'는 https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html 또는 INSERT ... SELECT' https : //dev.mysql.com/doc/refman/5.7/ko/insert-select.html –

답변

1

오류를 방지하려면 : 여기 내 전체 foreach 루프입니다. 당신이이 수정을 무시 사용하는 경우

INSERT IGNORE INTO eBayOrders ... 

는 INSERT 문을 실행하는 동안 발생하는 오류는 무시됩니다. 예를 들어, IGNORE가 없으면 테이블의 기존 UNIQUE 인덱스 또는 PRIMARY KEY 값을 복제하는 행에서 중복 키 오류가 발생하고 명령문이 중단됩니다. IGNORE를 사용하면 행이 삭제되고 오류가 발생하지 않습니다. 무시 된 오류는 대신 경고를 생성합니다.

그러나이 또한 중복 키 예외 이외의 오류 조건에 영향을줍니다.

또 다른 옵션으로

, 우리는 여기 INSERT ... ON DUPLICATE KEY ...

문서를 사용할 수 있습니다

참조 : https://dev.mysql.com/doc/refman/5.7/en/insert.html

+0

이것이 내 질문에 대한 답이라고 가정하고 아마도 그것을 받아 들일 것입니다 (여전히 참고 자료를 읽음). 내가 빠뜨린 것은 주문이 들어 오면'Inventory' 테이블에서'Quantity' 레벨을 빼는 PHP 스크립트가 있다는 것입니다. 따라서 레코드가 이미있는 경우 * 어쩌면 * 오류가 발생하여 스크립트를 중단하는 것이 좋습니다. 그렇지 않으면 행이 삽입되면 인벤토리 수량을 뺍니다 (동일한 주문에 대해 '이중 전달'을 원하지 않습니다.). 적어도, 그것이 내가 지금 설정 한 방법입니다. – bbruman

+0

실제로 오류가 발생하고 연결을 닫고 스크립팅을 중단하는 것이 foreach (한 번에 하나의 주문 만 제공하는 플랫폼 알림 사용과 달리)에서 작동하지 않습니다. 왜냐하면 오류 및 종료가 중지 될 것이기 때문에 미래의 반복과 일부는 놓칠 것이다. 대안으로보기 – bbruman

+1

@bbruman : SQL 오류가 발생하면 코드가 반드시 연결을 닫고 죽을 필요는 없습니다. 코드는 이미 수행하고있는 것처럼 오류를 감지 할 수 있으며, mysqli_error를 사용하여 오류를 검색한다. (이미 수행하고있는 것처럼) ... 그리고 나서 * 오류를 검사 할 수있다. 처리의 나머지 부분을 건너 뛰고 (예 : 재고에서 수량을 빼지 말 것), 루프에서 계속하여 다음 순서를 처리하십시오. – spencer7593