Witam, zadanie polega na zaimportowaniu danych z pliku xml do bazy danych. Chodzi o produkty.
Plik XML wygląda mniej więcej tak :
<produkt id="ARTFELBIN0007" nazwa="BINDOWNICA GRZEBIENIOWA FELLOWES PULSAR 300" producent="FEL" grupa="ART-BIN" gwarancja="F024M" cena_netto="468.00" vat="23" magazyn_zewnetrzny="N" dostepny="4" data="2009-02-13" na_zamowienie="T" oferta_specjalna="N" mala_paleta="N" large="N" raportowany="T">
<zdjecia>
<zdjecie plik="/Pictures/ART/BIN/ARTFELBIN0007/1.jpg" domyslne="1" data="2011-03-08" />
</zdjecia>
<technika>
<parametr nazwa="Kod Producenta" opis="5620001" jm="" typ="varchar" />
<parametr nazwa="Rodzaj" opis="Grzebieniowa" jm="" typ="varchar" />
<parametr nazwa="Model" opis="Pulsar 300" jm="" typ="varchar" />
<parametr nazwa="Ilość dziurkowanych kartek na raz" opis="15" jm="szt." typ="int" />
<parametr nazwa="Ilość oprawianych kartek" opis="300" jm="szt." typ="int" />
<parametr nazwa="Rodzaj grzbietów" opis="Grzebień plastikowy" jm="" typ="varchar" />
<parametr nazwa="Opis" opis="Bindownica posiada wytrzymaly metalowy mechanizm, posiada specialna szuflade do przechowywania grzbietow z opatentowanym systemem mierzenia grubości dokumentów i doboru odpowiedniego grzbietu. W zestawie pakiet okładek i grzbietów na 10 opraw." jm="" typ="varchar" />
<parametr nazwa="Orientacyjna waga brutto" opis="9220" jm="g" typ="int" />
<parametr nazwa="Orientacyjna waga brutto opak. zbior." opis="9220" jm="g" typ="int" />
<parametr nazwa="Ilość w opakowaniu zbiorczym - orientacyjnie" opis="1" jm="szt." typ="int" />
</technika>
</produkt>
Produktów jest dużo.
Kod php
<?php
set_time_limit(0); //jest to konieczne w związku z potężną ilością danych zawartych w pliku. Bynajmniej na moim komputerze, który nie jest bardzo szybki
$PlikXML = simplexml_load_file('action.xml');
$BazaDanych = mysqli_connect(); //dane utajnione
if(!$BazaDanych)
die('Podczas połączenia z bazą danych powstał błąd'); //sprawdzam połączenie z bazą danych. jeżeli jest błąd to wyświetlam informację
$BazaDanych->Query("SET CHARSET utf8");
$BazaDanych->Query("SET NAMES `utf8` COLLATE `utf8_polish_ci`");
$Tabelka = $BazaDanych->Query('SHOW TABLES LIKE "Produkty"'); //sprawdzenie czy tabelka produktów istnieje
if(!$Tabelka->fetch_assoc()) //jeśli tabelka nie istnieje to utwórz
{
$KodSQLTabelki = "CREATE TABLE Produkty (id TINYTEXT , nazwa TINYTEXT , producent TINYTEXT , netto DOUBLE(6,2) UNSIGNED , vat TINYINT(1) UNSIGNED , na_zamowienie TINYINT(1) , dostepny TINYINT(2) , magazyn_zewnetrzny TINYINT(1) , gwarancja TINYTEXT, data DATE, oferta_specjalna TINYINT(1), mala_paleta TINYINT(1), duzy TINYINT(1), raportowany TINYINT(1), grupa TINYTEXT, cena_sugerowana DOUBLE(6,2))";
$BazaDanych->Query($KodSQLTabelki);
}
$Tabelka = $BazaDanych->Query('SHOW TABLES LIKE "Parametry"'); //sprawdzenie czy istnieje tabelka parametrów
if(!$Tabelka->fetch_assoc()) //w wypadku gdy nie istnieje tworzę
$BazaDanych->Query('CREATE TABLE Parametry (id TINYTEXT, nazwa TINYTEXT, opis TEXT, jednostka TINYTEXT, typ TINYTEXT)');
foreach($PlikXML->produkty->produkt as $InformacjeOProdukcie) //wydobywanie informacji z pliku xml, zapis do bazy danych i wyświetlenie informacji w tabelce
{
$atr = $InformacjeOProdukcie->attributes();
$Vat = $atr['vat'];
$Netto = $atr['cena_netto'];
$NaZamowienie = strcmp($atr['na_zamowienie'],'T') ? 1 : 0; //w bazie będzie 1 jeżeli jest na zamówienie i 0 jeżeli nie będzie
$Producent = str_replace("'","\'",$atr['producent']); //w kilkunastu pozycjach są cudzysłowy, których występowanie uniemożliwia poprawne wykonie zapytania
$Dostepnych = is_numeric($atr['dostepny']) ? $atr['dostepny'] : 31; //w pliku xml możemy napotkać się na zapis "ponad 30" w takim wypadku w bazie będzie 31
$Nazwa = str_replace("'","\'",$atr['nazwa']);
$ID = $atr['id'];
$Grupa = $atr['grupa'];
$Gwarancja = $atr['gwarancja'];
$MagazynZewnetrzny = strcmp($atr['magazyn_zewnetrzny'],'T') ? 1 : 0;
$CenaSugerowana = isset($atr['cena_sugerowana']) ? $atr['cena_sugerowana'] : 'NULL';
$Data = $atr['data'];
$OfertaSpecjalna = strcmp($atr['oferta_specjalna'],'T') ? 1 : 0; //podobnie jak wcześniej, zamieniam T na 1 i N na 0
$MalaPaleta = strcmp($atr['mala_paleta'],'T') ? 1 : 0;
$Raportowany = strcmp($atr['raportowany'],'T') ? 1 : 0;
$Duzy = strcmp($atr['large'],'T') ? 1 : 0;
$Wartosci = "($Vat, $Netto, $NaZamowienie, '$Producent', $Dostepnych, '$Nazwa', '$ID', '$Grupa', '$Gwarancja', $MagazynZewnetrzny, $CenaSugerowana, '$Data', $OfertaSpecjalna, $MalaPaleta, $Raportowany, $Duzy )";
$Zapytanie = "INSERT INTO Produkty (vat, netto, na_zamowienie, producent, dostepny, nazwa, id, grupa, gwarancja, magazyn_zewnetrzny, cena_sugerowana, data, oferta_specjalna, mala_paleta, raportowany, duzy) VALUES ";
$BazaDanych->Query($Zapytanie.$Wartosci);
foreach($InformacjeOProdukcie->technika->parametr as $parametry)
{
$atr = $parametry->attributes();
$Nazwa = $atr['nazwa'];
$Opis = $atr['opis'];
$Jednostka = $atr['jm'];
$Typ = $atr['typ'];
$BazaDanych->Query("INSERT INTO Parametry (id, opis, nazwa, jednostka, typ) VALUES ('$ID', '$Opis', '$Nazwa','$Jednostka','$Typ')")
}
}
?>
Będzie dobrze?