0

'09年に投稿されたこの問題とほぼ同じ問題が発生しています。それはうまく解決されていないようで、私は一日中関連する質問を熟読し、見つけた提案を実装しています.

XML ソース (ファイルではない) から動的 (毎日変更) データを取得し、mySQL データベースに挿入しようとしています。fwrite を使用せずにデータをプルしようとすると、出力にタグ/キーなしでデータが返されます。したがって、特定のデータベース フィールドにデータを適切に割り当てることができません。

情報をファイルに書き込んでそこから移動することにしましたが、ファイルは毎回 334kb で中止/「完了」します。残念ながら、私は cURL の初心者であり、問​​題が何であるかを正確に把握するための知識がありません。また、これを行うために vqMod for OpenCart を使用しています。それ以外の場合は、まっすぐな PHP を使用します。

私は何が欠けていますか?

また、xml を文字列ではなく配列としてプルする方法はありますか (それにより、fwrite ステップをバイパスする可能性があります)。または、他のファイルタイプに書き込む必要がありますか?

私が見逃した解決済みの質問への提案やリダイレクトは大歓迎です。

これは関連するコードです。コメント部分は私が試みた修正です。

$curl = curl_init();
    $fp = fopen('dir/file.xml' , "w" );
    //w+ will not download any information from the url - file is created but empty.

    //AS IS, downloads first 334KB of file then lands on a blank page
    //and a 500 error when any of these other options are implemented. 
    curl_setopt($curl, CURLOPT_URL, 'http://www.url.com');
    curl_setopt($curl, CURLOPT_FILE, $fp);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);

    //  curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    //  curl_setopt($curl, CURLOPT_TIMEOUT,  300);
    //  curl_setopt($curl, CURLOPT_NOPROGRESS, false);
    //  curl_setopt($curl, CURLOPT_RANGE, '0-1000');


    //  $data = array();
    $data = curl_exec($curl);

    fwrite($fp, $data);

    curl_close($curl);
    fclose($fp);

更新: fwrite() の代わりに simplexml_load_string を使用して 1 つの製品の情報を取得しようとしましたが、まだ成功は限られています。私が使用しているXMLの例:

        <?xml version="1.0"?>
      <response>
        <root>
          <part>
            <![CDATA[PARTNUM]]>
          </part>
          <errorcode>0</errorcode>
          <errormsg></errormsg>
          <special>N</special>
          <description>
            <![CDATA[]]>
          </description>
          <price>75</price>
          <weight>1.02</weight>
          <webpurch>Y</webpurch>
          <altnum>
            <![CDATA[ALT-NUM]]>
          </altnum>
          <active>Y</active>
          <redo>
            <![CDATA[]]>
          </redo>
          <codes> 
              <code>
                <fieldname>
                  <![CDATA[Mfr Part No]]>
                </fieldname>
                <fieldvalue>
                  <![CDATA[PARTNUM]]>
                </fieldvalue>
               </code>
               <code>
                <fieldname>
                  <![CDATA[Special Code 1]]>
                </fieldname>
                <fieldvalue>
                  <![CDATA[XYZ123]]>
                </fieldvalue>
               </code> 
            </codes>
          <customtag>N</customtag>
          <onhand>0</onhand>
          <notes>
            <![CDATA[PRODUCT-SPECIFIC NOTE]]>
          </notes>
          <mfr>
            <mfr_name>
              <![CDATA[MFR]]>
            </mfr_name>
          </mfr>
          <altpartnums>
            <altnum>
              <![CDATA[PARTNUM.12]]>
            </altnum>
          </altpartnums>
          <gtrue>N</gtrue>
          <group>
            <![CDATA[GROUP NAME]]>
          </group>
          <categories>
            <cat>294</cat>
            <cat>475</cat>
          </categories>
        </root>
      </response>

これは、fwrite() を使用しない場合の複数の製品の $data 戻り値の例です: 0 N 75 1.02 Y Y N 0 N 294 475 0 N 288 12 Y Y Y 18 Y 222 456 3786

4

2 に答える 2

0

このコードを使用して、fwrite()を使用せずに動作させることができました。

        if(extension_loaded('curl')){
                    $curl = curl_init();
                    curl_setopt($curl, CURLOPT_URL, 'http://www.url.com');
                    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
                    curl_setopt($curl, CURLOPT_TIMEOUT, 30);
                    curl_setopt($curl, CURLOPT_NOPROGRESS, FALSE);
                    curl_setopt($curl, CURLOPT_MAXCONNECTS, 1);
                    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 0); 

                    $newparts = curl_exec($curl);

                    $xml = simplexml_load_string($newparts);

                foreach($xml->modpart as $item){

                      if(($item->active == 'Y') || ($item->active == 'YES')){
                          $status = '1';
                      } else {
                          $status = '0';
                      }


                if(!empty($item->mfr)){ 
                      $rs   = $this->db->query("SELECT manufacturer_id FROM ".DB_PREFIX."manufacturer WHERE name = '".$item->mfr->mfr_name."'");
                      $mfr_id = $rs->row['manufacturer_id'];
                }

                 if(!empty($item->codes)){
                          if($item->codes->code->fieldname == 'Mfr Part No'){
                              $mpn = $item->codes->code->fieldvalue;
                          } 
                  }
                      $this->db->query("INSERT IGNORE INTO " . DB_PREFIX . "product (model, sku, mpn, quantity, date_available, sort_order, manufacturer_id, price, weight, status, date_added) 
                          VALUES ( 
                              '".mysql_real_escape_string($item->description=htmlspecialchars(trim($item->description)))."', 
                              '".mysql_real_escape_string($item->sku)."', 
                               '".$mpn."', 
                              '".mysql_real_escape_string($item->mpn)."', 
                               NOW(), 1000,
                              '".$mfr_id."',
                               '".mysql_real_escape_string($item->price)."', 
                               '".mysql_real_escape_string($item->weight)."', 
                               '".$status."', 
                                 NOW() 
                              )");    

                    $pr = $this->db->query("SELECT product_id FROM ".DB_PREFIX."product WHERE sku = '".$item->part."'");
                    $product_id = $pr->row['product_id'];

                    if(isset($product_id)){

                              $this->db->query("INSERT IGNORE INTO " . DB_PREFIX . "product_description (product_id, language_id, name, meta_keyword, meta_description, description, tag)
                                      VALUES(                                                       
                                              '" . (int)$product_id . "',
                                              '1',
                                              '" . $item->part. "',
                                              '" . $item->part. "',
                                              '".mysql_real_escape_string($item->description=htmlspecialchars(trim($item->description)))."', 
                                              '".mysql_real_escape_string($item->description=htmlspecialchars(trim($item->description)))."', 
                                              '".mysql_real_escape_string($item->description=htmlspecialchars(trim($item->description)))."' 
                                      )");


                            $this->db->query("INSERT IGNORE INTO " . DB_PREFIX . "product_to_store SET product_id = '" . (int)$product_id . "', store_id = '0'");

                            $this->db->query("INSERT IGNORE INTO " . DB_PREFIX . "url_alias SET query = 'product_id=" . (int)$product_id . "', keyword = '" .$item->part . "'");


                        foreach($item->cats as $cats){
                            $category = $cats->cat;
                                foreach($category as $category_id){
                                $this->db->query("INSERT IGNORE INTO " . DB_PREFIX . "product_to_category SET product_id = '" . (int)$product_id . "', category_id = '" . (int)$category_id . "'");
                                } 
                        } 
                             $this->cache->delete('product');
                    } 
            } 

            curl_close($curl);

    } 

タイムアウトの問題はまだうまくいきませんが、少なくとも何らかの方法で製品をデータベースに取り込むことができます。タイムアウトソリューションが見つかった場合は、投稿します。

于 2013-03-05T22:19:54.650 に答える
0

次の行を削除します。

fwrite($fp, $data);

$data文字列データを返さずにファイルに書き込むように指定したため、空であると確信しています。ファイルも空であることは驚くことではありません。

于 2013-03-01T20:26:12.207 に答える