I am having an almost identical problem to this one, posted in '09. It doesn't appear to be successfully solved, and I have been poring over related questions all day & implementing suggestions I have found.
I am attempting to pull dynamic (changes daily) data from an XML source (not a file) and insert into a mySQL database. When I attempt to pull the data without fwrite, the data returns without tags/keys in the output. Thus, I cannot properly assign the data to specific database fields.
I decided to write the information to a file and go from there, but the file aborts/"completes" at 334kb every single time. Unfortunately, I am a cURL novice and don't have the chops to see exactly what the issue is. Also, I am using vqMod for OpenCart to do this, otherwise I'd be using straight up PHP.
What am I missing?
Also, is there a way to pull the xml as an array instead of as a string (thereby potentially bypassing the fwrite step)? Or, should I be writing to some other file type?
Any suggestions or a redirect to a solved question I've missed are appreciated.
This is the relevant code, commented portions are fixes I've attempted:
$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);
Update: Attempted to use simplexml_load_string instead of fwrite() to pull one product's information, but am still having limited success. Example of XML I am using:
<?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>
This is an example of the $data return for multiple products when I do not use fwrite():
0
N
75
1.02
Y
Y
N
0
N
294
475
0
N
288
12
Y
Y
Y
18
Y
222
456
3786