eBay Platform Notifications은 GetOrders API를 주기적으로 폴링하여 모든 주문을 받도록합니다.PHP를 사용하여 MySQL 데이터베이스에 행을 두 번 전달
내 경우에는받은 XML 파일을 구문 분석하고 PHP를 사용하여 MySQL 데이터베이스에 삽입하도록 플랫폼 알림을 설정했습니다.
이제 추천대로 "double pass"를 GetOrders
으로 사용하여 본질적으로 각각의 모든 행 (또는 주문)에 대해 복제본을 제공해야합니다.
내 구조는 다소 간단합니다. 하지만 은 OrderLineItemID
입니다. 제 생각에 각 이베이 주문의 고유 식별자입니다.
현재 수행중인 것보다 더 효과적인 방법이 있습니까? 때문에 중복 주문이 들어 오면, 쿼리가 연결을 닫은 다음 스크립트를 종료, 오류가 발생합니다 내 UNIQUE
OrderLineItemID
, 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();
}
}
SQL 주입, 나는 준비에 대한 자세한 내용은 좋아 사용할 수 – Jens
방지하기 위해 준비된 명령문에 대해 알아보기 진술. mysqli_real_escape_string을 사용하여 SQL injection 용 변수를 캡슐화했지만 현재 질문과 관련이 없다고 느꼈을 때 포함하지 않았다. – bbruman
'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 –