Radi se o aplikaciji koja se vrti na standardnoj LAMP konfiguraciji, i za koju je potrebno napraviti modul preko koga će korisnik jednom sedmično učitavati veliki xml fajl - radi se o tabeli osiguranika RFZO.
XML fajl ima sledeću strukturu:
Code:
<?xml version="1.0" encoding="windows-1250"?>
<Osiguranici>
<Osiguranik>
<Filijala><![CDATA[ *******]]></Filijala>
<Ispostava><![CDATA[ *******]]></Ispostava>
<LBO><![CDATA[*******]]></LBO>
<BrojKnjizice><![CDATA[*******]]></BrojKnjizice>
<JMBG><![CDATA[*******]]></JMBG>
<Prezime><![CDATA[*******]]></Prezime>
<Ime><![CDATA[*******]]></Ime>
<OsnovOsiguranja><![CDATA[*******]]></OsnovOsiguranja>
</Osiguranik>
<Osiguranik>
<Filijala><![CDATA[ *******]]></Filijala>
<Ispostava><![CDATA[ *******]]></Ispostava>
<LBO><![CDATA[*******]]></LBO>
<BrojKnjizice><![CDATA[*******]]></BrojKnjizice>
<JMBG><![CDATA[*******]]></JMBG>
<Prezime><![CDATA[*******]]></Prezime>
<Ime><![CDATA[*******]]></Ime>
<OsnovOsiguranja><![CDATA[*******]]></OsnovOsiguranja>
</Osiguranik>
... i tako dalje...
</Osiguranici>
<?xml version="1.0" encoding="windows-1250"?>
<Osiguranici>
<Osiguranik>
<Filijala><![CDATA[ *******]]></Filijala>
<Ispostava><![CDATA[ *******]]></Ispostava>
<LBO><![CDATA[*******]]></LBO>
<BrojKnjizice><![CDATA[*******]]></BrojKnjizice>
<JMBG><![CDATA[*******]]></JMBG>
<Prezime><![CDATA[*******]]></Prezime>
<Ime><![CDATA[*******]]></Ime>
<OsnovOsiguranja><![CDATA[*******]]></OsnovOsiguranja>
</Osiguranik>
<Osiguranik>
<Filijala><![CDATA[ *******]]></Filijala>
<Ispostava><![CDATA[ *******]]></Ispostava>
<LBO><![CDATA[*******]]></LBO>
<BrojKnjizice><![CDATA[*******]]></BrojKnjizice>
<JMBG><![CDATA[*******]]></JMBG>
<Prezime><![CDATA[*******]]></Prezime>
<Ime><![CDATA[*******]]></Ime>
<OsnovOsiguranja><![CDATA[*******]]></OsnovOsiguranja>
</Osiguranik>
... i tako dalje...
</Osiguranici>
(Zvezdice su naravno umesto pravih podataka osiguranika).
Pokušao sam ovo da rešim na dva načina - prvi je uz pomoć samog MySQL-a, to jest komande LOAD XML INFILE ... ali to neće da radi zbog ovih CDATA gluposti.
Drugi način koji radi bez problema je preko simplexml_load_file, ali tu sad nastaje frka.
Nisam hteo da čitam slog po slog pa da ga upisujem u bazu, jer bi to za 300000 slogova bilo isto toliko INSERT INTO komandi, pa sam pokušao da pravim jedan string, nešto ovako:
Code:
$sql = 'INSERT INTO insured (branch, substation, insurance_number, insurance_card, citizen_number, name, surname, insurance_basis) VALUES ';
$xml=simplexml_load_file('KR.xml');
foreach ($xml->children() as $osiguranik)
{
$sql .= '(';
foreach($osiguranik as $row)
{
$sql .= "'$row', ";
}
$sql = substr($sql,0,-2) . '), ';
}
$sql = substr($sql,0,-2);
$db->sql = $sql;
$db->exec();
$sql = 'INSERT INTO insured (branch, substation, insurance_number, insurance_card, citizen_number, name, surname, insurance_basis) VALUES ';
$xml=simplexml_load_file('KR.xml');
foreach ($xml->children() as $osiguranik)
{
$sql .= '(';
foreach($osiguranik as $row)
{
$sql .= "'$row', ";
}
$sql = substr($sql,0,-2) . '), ';
}
$sql = substr($sql,0,-2);
$db->sql = $sql;
$db->exec();
Mislim da ovo radi - ne mogu sa sigurnošću da tvrdim jer sam ga pustio pre otprilike 50 minuta i još uvek nije završio. :D
Ima li neko ideju kako ovo može da se odradi brže?