Witam!
To mój pierwszy post na forum zatem proszę o wyrozumiałość. Niedawno rozpocząłem naukę z php i mysql. Przygoda ma charakter hobbystyczny a nie zawodowy (IMG:
style_emoticons/default/smile.gif)
Po przeczytaniu paru poradników, oraz kilku tematów na forum dotarłem do ściany, której nie mogę przeskoczyć zapewne z braku wiedzy...
Mam plik XML o następującej strukturze:
<?xml version="1.0" encoding="iso-8859-1"?>
<users>
<user>
<id>1</id>
<name>OxyOne</name>
<country>Poland</country>
<create_time>1269214668</create_time>
<total_credit>36565783.913079</total_credit>
<expavg_credit>0.073896</expavg_credit>
<expavg_time>1296112503.116560</expavg_time>
<cpid>85a8d8d9e7777d7767f7533b57c21976</cpid>
<url>www.dow-dom.pl</url>
<teamid>1</teamid>
<has_profile/>
</user>
<user>
<id>2</id>
<name>Sesef</name>
<country>Poland</country>
<create_time>1269214790</create_time>
<total_credit>1250412.600000</total_credit>
<expavg_credit>0.087206</expavg_credit>
<expavg_time>1297016103.293520</expavg_time>
<cpid>335e120fa8cffa5962d74116794a6238</cpid>
<teamid>1</teamid>
<has_profile/>
</user>
<user>
<id>3</id>
<name>TJM</name>
<country>Poland</country>
<create_time>1269267344</create_time>
<total_credit>375206.266922</total_credit>
<expavg_credit>917.385636</expavg_credit>
<expavg_time>1299414219.395720</expavg_time>
<cpid>607b0336728f973583ac7347ce9eddb7</cpid>
<teamid>2</teamid>
</user>
plik jest obszerny, jego ostatni węzeł to:
<user>
<id>7361</id>
<name>Looom</name>
<country>Germany</country>
<create_time>1299411884</create_time>
<total_credit>169.050000</total_credit>
<expavg_credit>16.718423</expavg_credit>
<expavg_time>1299418493.075990</expavg_time>
<cpid>0cd9d2895bcb406b153ccd944a2b54f4</cpid>
</user>
</users>
łącznie od 0..4414 i będzie rosło w przyszłości...
Ten kod:
<?php
$reader = new XMLReader();
$reader->open('user.xml');
$count=0;
while($reader->read())
{
if($reader->nodeType == XMLReader::ELEMENT)
{
$name = $reader->name;
if ($reader->name == 'user')
{
$notes[$count] = array(); }
}
if($reader->nodeType == XMLReader::TEXT || $reader->nodeType == XMLReader::CDATA)
{
$notes[$count][$name] = trim($reader->value); }
if($reader->nodeType == XMLReader::END_ELEMENT)
{
if ($reader->name == 'user')
{
$count++;
}
}
}
// Tutaj wyswietlam otrzymana tablicę
?>
Poprawnie wyłuskuje dane z pliku xml czego efektem jest wyświetlenie następujących danych:
Array
(
[0] => Array
(
[id] => 1
[name] => OxyOne
[country] => Poland
[create_time] => 1269214668
[total_credit] => 36565783.913079
[expavg_credit] => 0.073896
[expavg_time] => 1296112503.116560
[cpid] => 85a8d8d9e7777d7767f7533b57c21976
[url] => www.dow-dom.pl
[teamid] => 1
)
[1] => Array
(
[id] => 2
[name] => Sesef
[country] => Poland
[create_time] => 1269214790
[total_credit] => 1250412.600000
[expavg_credit] => 0.087206
[expavg_time] => 1297016103.293520
[cpid] => 335e120fa8cffa5962d74116794a6238
[teamid] => 1
)
[2] => Array
(
[id] => 3
[name] => TJM
[country] => Poland
[create_time] => 1269267344
[total_credit] => 375206.266922
[expavg_credit] => 917.385636
[expavg_time] => 1299414219.395720
[cpid] => 607b0336728f973583ac7347ce9eddb7
[teamid] => 2
)
[3] => Array
(
[id] => 4
[name] => Peciak
[country] => Poland
[create_time] => 1269278614
[total_credit] => 27244354.638341
[expavg_credit] => 158091.684059
[expavg_time] => 1299434600.133820
[cpid] => de177e5231a39320173762a59cad575e
[teamid] => 1
)
itd... aż do
[4414] => Array
(
[id] => 7361
[name] => Looom
[country] => Germany
[create_time] => 1299411884
[total_credit] => 169.050000
[expavg_credit] => 16.718423
[expavg_time] => 1299418493.075990
[cpid] => 0cd9d2895bcb406b153ccd944a2b54f4
)
)
i teraz moje pytanie:
W jaki sposób te dane mogę umieścić w tabelach w bazie MySQL poprzez odpowiednie polecenia PHP?Problem polega również na tym, że nie zawsze we wszystkich węzłach występują jednakowe pola... np. nie wszędzie występuje [teamid], [url].
Dodatkowo, czy jest możliwe aby zdefiniować jakie pola z listy wewnętrznej
[id]
[name]
[country]
[create_time]
[total_credit]
[expavg_credit]
[expavg_time]
[cpid]
[url]
[teamid]
będą wstawiane do danej tabeli w bazie danych.
Np. Chciałbym podzielić te dane do dwóch tabel:
Pierwsza - zawierająca [cpid jako PrimaryKey][name][country][teamid] z możliwością robienia updatów jeżeli dojdą nowi user
Druga - zawierająca [numer - jako primary key AI][date - wstawiana z automatu w momencie wpisu do wiersza][total_credit][cpid] z możliwością robienia codziennych nowych wpisów dla wszystkich user z bazy jako kolejnych wierszy czyli w efekcie np.:
1 2011-03-08 100 [cpid]
2 2011-03-09 200 [cpid] itd..
Codziennie będzie więc pobierany plik user.xml i będzie robiony update tabeli 1 i uzupełnienie tabeli 2.
Być może rozwiązanie jest banalne dla osób siedzących w temacie ale ja jak na razie nie znalazłem odpowiedzi...
Pewnie gotowego rozwiązania (kodu) nikt mi nie napisze (IMG:
style_emoticons/default/baaasmiley.gif) ale może chociaż jakieś podpowiedzi?
Tomek.