2

我正在使用 shopify webhook 在订单更新时更新我的​​ sql server 的“数量”字段,下面是我的 php 代码

?php
$xmlData = fopen('php://input' , 'rb'); 
while (!feof($xmlData)) { $xmlString .= fread($xmlData, 4096); }
fclose($xmlData);
$xml = new SimplexmlElement($xmlString);


file_put_contents('orders/order' . '.xml', $xmlString);



$dom = new DomDocument();

$dom->load('orders/order.xml');

$itemList = $dom->getElementsByTagName('line-item');
foreach($itemList as $item) {
  $sku='';
  $qty='';
  foreach($item->childNodes as $child) {
    if ($child->localName == 'sku') {
      $sku = $child->textContent;
    }
    if ($child->localName == 'quantity') {
      $qty = $child->textContent;
    }
  }
  mysql_connect ("?????????????????????????");
mysql_select_db("??????????");

$query = "UPDATE xcart_categories SET product_count = product_count - $qty WHERE description='$sku';";

mysql_query($query);
}

下面是我从 shopify webhook 获取的 xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<order>
  <buyer-accepts-marketing type="boolean">true</buyer-accepts-marketing>
  <closed-at type="datetime" nil="true"></closed-at>
  <currency>USD</currency>
  <email>yeongju_l@yahoo.com</email>
  <financial-status>pending</financial-status>
  <fulfillment-status>fulfilled</fulfillment-status>
  <gateway>Local Pick-Up</gateway>
  <id type="integer">140303247</id>
  <name>#1012</name>
  <note></note>
  <number type="integer">12</number>
  <subtotal-price type="decimal">0.2</subtotal-price>
  <taxes-included type="boolean">false</taxes-included>
  <total-discounts type="decimal">0.0</total-discounts>
  <total-line-items-price type="decimal">0.2</total-line-items-price>
  <total-price type="decimal">0.2</total-price>
  <total-price-usd type="decimal">0.2</total-price-usd>
  <total-tax type="decimal">0.0</total-tax>
  <total-weight type="integer">0</total-weight>
  <updated-at type="datetime">2012-09-16T21:20:07-04:00</updated-at>
  <created-at type="datetime">2012-09-16T21:08:30-04:00</created-at>
  <token>dcf523d93c68159c15a7c8d1fabbee07</token>
  <landing-site>/products/test</landing-site>
  <referring-site></referring-site>
  <cancelled-at type="datetime" nil="true"></cancelled-at>
  <cancel-reason nil="true"></cancel-reason>
  <cart-token>a9a7bc5d8103f6a3bb45e827f0cb8928</cart-token>
  <browser-ip nil="true"></browser-ip>
  <landing-site-ref nil="true"></landing-site-ref>
  <order-number type="integer">1012</order-number>
  <discount-codes type="array"/>
  <note-attributes type="array">
  </note-attributes>
  <processing-method>manual</processing-method>
  <line-items type="array">
    <line-item>
      <id type="integer">228531213</id>
      <requires-shipping type="boolean">false</requires-shipping>
      <fulfillment-service>manual</fulfillment-service>
      <grams type="integer">0</grams>
      <price type="decimal">0.2</price>
      <quantity type="integer">1</quantity>
      <sku>1234567</sku>
      <title>test</title>
      <product-id type="integer">104663831</product-id>
      <variant-id type="integer">240660979</variant-id>
      <vendor>5 Second</vendor>
      <variant-title nil="true"></variant-title>
      <fulfillment-status>fulfilled</fulfillment-status>
      <name>test</name>
      <variant-inventory-management></variant-inventory-management>
      <properties type="array">
      </properties>
    </line-item>
  </line-items>
  <shipping-lines type="array"/>
  <tax-lines type="array">
    <tax-line>
      <title>NY State Tax</title>
      <price type="decimal">0.0</price>
      <rate type="float">0.04</rate>
    </tax-line>
    <tax-line>
      <title>Queens County Tax</title>
      <price type="decimal">0.0</price>
      <rate type="float">0.04875</rate>
    </tax-line>
  </tax-lines>
  <billing-address>
    <first-name>Yeongju</first-name>
    <last-name>Lee</last-name>
    <address1>14809 northern blvd</address1>
    <address2></address2>
    <city>Flushing</city>
    <company></company>
    <country>United States</country>
    <phone></phone>
    <province>New York</province>
    <zip>11354</zip>
    <latitude type="decimal">40.76529</latitude>
    <longitude type="decimal">-73.81831</longitude>
    <name>Yeongju Lee</name>
    <country-code>US</country-code>
    <province-code>NY</province-code>
  </billing-address>
  <fulfillments type="array">
    <fulfillment>
      <id type="integer">67712419</id>
      <order-id type="integer">140303247</order-id>
      <created-at type="datetime">2012-09-16T21:20:07-04:00</created-at>
      <updated-at type="datetime">2012-09-16T21:20:07-04:00</updated-at>
      <tracking-number nil="true"></tracking-number>
      <tracking-company nil="true"></tracking-company>
      <status>success</status>
      <service>manual</service>
      <tracking-url>http://www.google.com/search?q=</tracking-url>
      <receipt>
      </receipt>
      <line-items type="array">
        <line-item>
          <id type="integer">228531213</id>
          <requires-shipping type="boolean">false</requires-shipping>
          <fulfillment-service>manual</fulfillment-service>
          <grams type="integer">0</grams>
          <price type="decimal">0.2</price>
          <quantity type="integer">1</quantity>
          <sku>1234567</sku>
          <title>test</title>
          <product-id type="integer">104663831</product-id>
          <variant-id type="integer">240660979</variant-id>
          <vendor>5 Second</vendor>
          <variant-title nil="true"></variant-title>
          <fulfillment-status>fulfilled</fulfillment-status>
          <name>test</name>
          <variant-inventory-management></variant-inventory-management>
          <properties type="array">
          </properties>
        </line-item>
      </line-items>
    </fulfillment>
  </fulfillments>
  <customer>
    <id type="integer">96489088</id>
    <email>yeongju_l@yahoo.com</email>
    <accepts-marketing type="boolean">true</accepts-marketing>
    <first-name>Yeongju</first-name>
    <last-name>Lee</last-name>
    <orders-count type="integer">12</orders-count>
    <total-spent type="decimal">16.26</total-spent>
    <note nil="true"></note>
    <created-at type="datetime">2012-08-17T11:31:50-04:00</created-at>
    <updated-at type="datetime">2012-09-16T21:20:07-04:00</updated-at>
    <state>enabled</state>
    <last-order-id type="integer">140303509</last-order-id>
    <tags>C</tags>
    <last-order-name>#1013</last-order-name>
  </customer>

就像您看到的那样,由于重复的行项目,我得到了两个 sku 和数量,例如,当客户订购一个“产品名称 - 在这种情况下进行测试时,我在我的 sql server sku 测试字段中得到了“-2”数量更新,但是当我在创建订单时使用 webhook 事件它起作用我的意思是我只看到一个订单项,但所有其他情况(订单更新时、订单付款时、订单完成时......)即使我认为只订购了一件商品,也会向我显示重复的订单项我正在严重解析我的 XML 任何能教我正确代码以从第一个 line-items 节点中提取“line items”的人,我将非常感激!再次感谢..

4

1 回答 1

2

您正在执行大量冗余步骤来在那里解析您的 XML。您不需要在处理数据之前将其保存到文件中,并且您对未使用的 SimpleXML 进行了杂散调用。你只需要这样:

$xmlString = file_get_contents('php://input');
$dom = new DomDocument();
$dom->loadXML($xmlString);

之后,您的解析逻辑看起来不错,但您只运行一个 SQL 查询,其中包含一个 SKU。

在循环内部foreach,您定义变量$skuand $qty,但在循环内部不对它们执行任何操作。因此,下一次循环时,您将覆盖它们的值,而对旧值一无所知。

有几种方法可以做到这一点:

  • 在循环内运行 SQL(效率不高)
  • 建立一个 SKU 和数量数组 ( $sku[] = ...; $qty[] = ...;),然后从这些数组构建你的 SQL
  • 稍微整洁,构建一个单一的数组,其中 SKU 数量对作为嵌套数组 ( $sku_list[] = array('sku' => ..., 'qty' => ...))
  • 在循环 ( $sql .= '...') 内逐步构建您的 SQL 字符串并在最后执行一次
于 2012-09-20T12:20:26.710 回答