Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: XML-->PHP-->MySQL
Forum PHP.pl > Forum > PHP
TomaszPawel
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 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:

  1. <?xml version="1.0" encoding="iso-8859-1"?>
  2. <users>
  3. <user>
  4. <id>1</id>
  5. <name>OxyOne</name>
  6. <country>Poland</country>
  7. <create_time>1269214668</create_time>
  8. <total_credit>36565783.913079</total_credit>
  9. <expavg_credit>0.073896</expavg_credit>
  10. <expavg_time>1296112503.116560</expavg_time>
  11. <cpid>85a8d8d9e7777d7767f7533b57c21976</cpid>
  12. <url>www.dow-dom.pl</url>
  13. <teamid>1</teamid>
  14. <has_profile/>
  15. </user>
  16. <user>
  17. <id>2</id>
  18. <name>Sesef</name>
  19. <country>Poland</country>
  20. <create_time>1269214790</create_time>
  21. <total_credit>1250412.600000</total_credit>
  22. <expavg_credit>0.087206</expavg_credit>
  23. <expavg_time>1297016103.293520</expavg_time>
  24. <cpid>335e120fa8cffa5962d74116794a6238</cpid>
  25. <teamid>1</teamid>
  26. <has_profile/>
  27. </user>
  28. <user>
  29. <id>3</id>
  30. <name>TJM</name>
  31. <country>Poland</country>
  32. <create_time>1269267344</create_time>
  33. <total_credit>375206.266922</total_credit>
  34. <expavg_credit>917.385636</expavg_credit>
  35. <expavg_time>1299414219.395720</expavg_time>
  36. <cpid>607b0336728f973583ac7347ce9eddb7</cpid>
  37. <teamid>2</teamid>
  38. </user>


plik jest obszerny, jego ostatni węzeł to:

  1. <user>
  2. <id>7361</id>
  3. <name>Looom</name>
  4. <country>Germany</country>
  5. <create_time>1299411884</create_time>
  6. <total_credit>169.050000</total_credit>
  7. <expavg_credit>16.718423</expavg_credit>
  8. <expavg_time>1299418493.075990</expavg_time>
  9. <cpid>0cd9d2895bcb406b153ccd944a2b54f4</cpid>
  10. </user>
  11. </users>


łącznie od 0..4414 i będzie rosło w przyszłości...

Ten kod:

  1. <?php
  2. $reader = new XMLReader();
  3.  
  4. $reader->open('user.xml');
  5.  
  6. $count=0;
  7.  
  8. while($reader->read())
  9. {
  10. if($reader->nodeType == XMLReader::ELEMENT)
  11. {
  12. $name = $reader->name;
  13.  
  14. if ($reader->name == 'user')
  15. {
  16. $notes[$count] = array();
  17. }
  18. }
  19.  
  20. if($reader->nodeType == XMLReader::TEXT || $reader->nodeType == XMLReader::CDATA)
  21. {
  22. $notes[$count][$name] = trim($reader->value);
  23. }
  24.  
  25. if($reader->nodeType == XMLReader::END_ELEMENT)
  26. {
  27. if ($reader->name == 'user')
  28. {
  29. $count++;
  30. }
  31. }
  32. }
  33.  
  34. // Tutaj wyswietlam otrzymana tablicę
  35. echo '<pre>';
  36. print_r($notes);
  37.  
  38. ?>


Poprawnie wyłuskuje dane z pliku xml czego efektem jest wyświetlenie następujących danych:

  1. Array
  2. (
  3. [0] => Array
  4. (
  5. [id] => 1
  6. [name] => OxyOne
  7. [country] => Poland
  8. [create_time] => 1269214668
  9. [total_credit] => 36565783.913079
  10. [expavg_credit] => 0.073896
  11. [expavg_time] => 1296112503.116560
  12. [cpid] => 85a8d8d9e7777d7767f7533b57c21976
  13. [url] => www.dow-dom.pl
  14. [teamid] => 1
  15. )
  16.  
  17. [1] => Array
  18. (
  19. [id] => 2
  20. [name] => Sesef
  21. [country] => Poland
  22. [create_time] => 1269214790
  23. [total_credit] => 1250412.600000
  24. [expavg_credit] => 0.087206
  25. [expavg_time] => 1297016103.293520
  26. [cpid] => 335e120fa8cffa5962d74116794a6238
  27. [teamid] => 1
  28. )
  29.  
  30. [2] => Array
  31. (
  32. [id] => 3
  33. [name] => TJM
  34. [country] => Poland
  35. [create_time] => 1269267344
  36. [total_credit] => 375206.266922
  37. [expavg_credit] => 917.385636
  38. [expavg_time] => 1299414219.395720
  39. [cpid] => 607b0336728f973583ac7347ce9eddb7
  40. [teamid] => 2
  41. )
  42.  
  43. [3] => Array
  44. (
  45. [id] => 4
  46. [name] => Peciak
  47. [country] => Poland
  48. [create_time] => 1269278614
  49. [total_credit] => 27244354.638341
  50. [expavg_credit] => 158091.684059
  51. [expavg_time] => 1299434600.133820
  52. [cpid] => de177e5231a39320173762a59cad575e
  53. [teamid] => 1
  54. )


itd... aż do

  1. [4414] => Array
  2. (
  3. [id] => 7361
  4. [name] => Looom
  5. [country] => Germany
  6. [create_time] => 1299411884
  7. [total_credit] => 169.050000
  8. [expavg_credit] => 16.718423
  9. [expavg_time] => 1299418493.075990
  10. [cpid] => 0cd9d2895bcb406b153ccd944a2b54f4
  11. )
  12.  
  13. )


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
  1. [id]
  2. [name]
  3. [country]
  4. [create_time]
  5. [total_credit]
  6. [expavg_credit]
  7. [expavg_time]
  8. [cpid]
  9. [url]
  10. [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 baaasmiley.gif ale może chociaż jakieś podpowiedzi?

Tomek.
Zyx
W tabelach bazodanowych możesz mieć kolumny z atrybutem NULL. Jeśli w jakimś elemencie nie masz wybranego klucza, po prostu wrzucasz do bazy NULL. A jak to zrobić... puść sobie pętlę foreach po Twojej tablicy elementów i w każdej iteracji wyślij do bazy zapytanie INSERT z odpowiednimi danymi.
wizu
Cytat(Zyx @ 9.03.2011, 13:07:19 ) *
A jak to zrobić... puść sobie pętlę foreach po Twojej tablicy elementów i w każdej iteracji wyślij do bazy zapytanie INSERT z odpowiednimi danymi.


Może nie w każdej iteracji wink.gif Lepszy będzie multi insert
  1. $sql = "INSERT INTO beautiful (name, age)
  2. VALUES
  3. ('Helen', 24),
  4. ('Katrina', 21),
  5. ('Samia', 22),
  6. ('Hui Ling', 25),
  7. ('Yumie', 29)";
  8.  
  9. mysql_query( $sql, $conn );
zend
google pdo, google mysql, mysql insert, a o "update" poszukaj sobie w ramach zadania domowego tongue.gif
TomaszPawel
Dzięki za wszystkie podpowiedzi.

Import zakończony sukcesem!

Teraz zabawa jak robić update...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.