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
simplexml_load_file/simplexml_load_string, php.net/manual/en/function.simplexml-load-file.php, it might do it, it doesn't give you an array per se but it does gives you a pretty easy to handle object, how big is the file?