Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> XML-->PHP-->MySQL, Jak skutecznie umieścić dane z XML w MySQL
TomaszPawel
post 9.03.2011, 12:06:08
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 8.03.2011
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Zyx
post 9.03.2011, 13:07:19
Post #2





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

Ostrzeżenie: (0%)
-----


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.


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
Go to the top of the page
+Quote Post
wizu
post 9.03.2011, 17:45:12
Post #3





Grupa: Zarejestrowani
Postów: 127
Pomógł: 15
Dołączył: 16.02.2008
Skąd: Sanok

Ostrzeżenie: (0%)
-----


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 );
Go to the top of the page
+Quote Post
zend
post 10.03.2011, 11:29:31
Post #4





Grupa: Zarejestrowani
Postów: 580
Pomógł: 85
Dołączył: 25.03.2010
Skąd: Skrzyszów :)

Ostrzeżenie: (0%)
-----


google pdo, google mysql, mysql insert, a o "update" poszukaj sobie w ramach zadania domowego tongue.gif
Go to the top of the page
+Quote Post
TomaszPawel
post 11.03.2011, 22:54:31
Post #5





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 8.03.2011
Skąd: Lublin

Ostrzeżenie: (0%)
-----


Dzięki za wszystkie podpowiedzi.

Import zakończony sukcesem!

Teraz zabawa jak robić update...
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 09:20