Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [XML][SQL][PHP]Problem z czytaniem
Trecco
post 22.08.2009, 11:55:17
Post #1





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 11.08.2009

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


Witam, chciałbym napisać skrypt który pobierał by dane z takich plików xml http://clodogame.fr/dev/api/user.97.xml pobierając id (np.97) z pliku tekstowego. Następnie wrzucało dane do sql. Wyskakuje mi błąd:

  1. Warning: simplexml_load_file(http://clodogame.fr/dev/api/user.70%0D%0A.xml) [function.simplexml-load-file]: failed to open stream: HTTP request failed! HTTP/1.1 500 Internal Server Error in C:\Strony\sql.php on line 15
  2.  
  3. Warning: simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external entity "http://clodogame.fr/dev/api/user.70%0D%0A.xml" in C:\Strony\sql.php on line 15
  4. Nie mozna przeniesc gracza ! Table 'myhighscore.gracze' doesn't exist


Skrypt wygląda tak:
  1. <?
  2. $sql['server'] = "db4free.net:3306";
  3. $sql['username'] = "trecco";
  4. $sql['password'] = "********";
  5. $sql['database'] = "myhighscore";
  6.  
  7. mysql_connect($sql['server'],$sql['username'],$sql['password']) or die("Nie mozna polaczyc sie z serwerem! Blad: ".mysql_error());
  8. mysql_select_db($sql['database']) or die("Nie znaleziono bazy danych! Blad: ".mysql_error());
  9.  
  10. $plik = file("id.txt");
  11. array_shift($plik);
  12.  
  13. foreach($plik as $p)
  14. {
  15. $xml = simplexml_load_file("http://clodogame.fr/dev/api/user.".$p.".xml");
  16.  
  17. $id = $xml['id'];
  18. $name = $xml['name'];
  19. $points = $xml['points'];
  20. $position = $xml['position'];
  21. $gangname = $xml->gang['name'];
  22.  
  23. $query = mysql_query("INSERT INTO `gracze` (`id`,`name`,`points`,`position`,`gangname`) VALUES('NULL','$id','$name','$points','$position','$gangname')") or die("Nie mozna przeniesc gracza $name! ".mysql_error());
  24. echo "<p>Gracz $name zostal przeniesiony poprawnie!</p>";
  25. }
  26. ?>


Plik tekstowy:
  1. 70
  2. 117
  3. 97
  4. 89
  5. 575
  6. 28
  7. 95
  8. 528
  9. 489
  10. 263
  11. 130
  12. 568
  13. 96
  14. 645
  15. 341
  16. 608
  17. 262
  18. 42
  19. 381
  20. 91


Strasznie byłbym wdzięczny za pomoc.

Ten post edytował Trecco 22.08.2009, 12:06:39
Go to the top of the page
+Quote Post
emp
post 22.08.2009, 13:18:27
Post #2





Grupa: Zarejestrowani
Postów: 195
Pomógł: 14
Dołączył: 12.01.2006
Skąd: Gotham City

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


Ładujesz zewnętrzny zasób w takim wypadku może się zdarzyć że nie zawsze będzie on dostępny.
Serwer będzie za bardzo obciążony i zapytanie do niego się nie powiedzie lub inna przykra dla twojego skryptu sytuacja.

Musisz coś zaradzić na taką sytuacje:
1) wyłączasz warningi w php.ini i olewasz winksmiley.jpg
2) dodajesz małpe przed simplexml_load_file() gdzie się da i olewasz winksmiley.jpg
3) obsługujesz tą sytuacje zwyczajnie sprawdzając czy połączenie się powiodło i inne testy wykonujesz
4) obsługujesz tą sytuacje profesjonalnie robisz blok try cach rzucasz wyjątkami i je łapiesz ( obsługujesz )


Warning: simplexml_load_file(http://clodogame.fr/dev/api/user.70%0D%0A.xml) [function.simplexml-load-file]: failed to open stream: HTTP request failed! HTTP/1.1 500 Internal Server Error in C:\Strony\sql.php on line 15

To oznacza że metoda simplexml_load_file() nie mogła załadować zewnętrznego zasobu.
Zrób kilka testów z jednym xml-em. Mi na 10 prób jednego nie załadował.
Wpisz adresy z palucha do metody simplexml_load_file() sprawdź czy działa.

Nie mozna przeniesc gracza ! Table 'myhighscore.gracze' doesn't exist
Po prostu nie możesz dodać danych do nieistniejącej tablicy w bazie danych. Jakby nie było taka tablica nie istnieje.

Sprawdziłem wszystkie te xml-e są dostępne przez web i są poprawne.

Ten post edytował emp 22.08.2009, 13:19:08


--------------------
Temat zamykam i przenoszę do Bangladeszu.
To jest wiadomość śmierci jeśli ją czytasz to znaczy że pozostało ci 30 sekund życia, więc lepiej zacznij się modlić.
Go to the top of the page
+Quote Post
Trecco
post 22.08.2009, 14:12:45
Post #3





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 11.08.2009

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


Już wszystko poprawiłem, okazało się, że źle było skonfigurowanie zapytanie dodania. Usunąłem też wszystkie "or die" tak jak mówiłeś, @ przed simplexml_load_file nie jest konieczna, nic nie wywala. Teraz kolejny błąd, skrypt dodaje czyste zapytanie, pod koniec nie pokazuje poprawnej zmiennej "$name", może to dlatego, że skrypt w ogóle nie czyta xml? Kod poprawiony:

  1. <?
  2. $sql['server'] = "db4free.net:3306";
  3. $sql['username'] = "trecco";
  4. $sql['password'] = "*********";
  5. $sql['database'] = "myhighscore";
  6.  
  7. mysql_connect($sql['server'],$sql['username'],$sql['password']);
  8. mysql_select_db($sql['database']);
  9.  
  10.  
  11.  
  12. //$plik = file("id.txt");
  13. //array_shift($plik);
  14.  
  15. //foreach($plik as $p)
  16. {
  17. $xml = simplexml_load_file("http://clodogame.fr/dev/api/user.97.xml");
  18.  
  19. $id = $xml['id'];
  20. $name = $xml['name'];
  21. $points = $xml['points'];
  22. $position = $xml['position'];
  23. $gangname = $xml->gang['name'];
  24.  
  25. $query = mysql_query("INSERT INTO `myhighscore`.`gracze` (`id`, `name`, `points`, `position`, `gangname`) VALUES ('$id', '$name', '$points', '$position', '$gangname')");
  26. echo "Gracz $name zostal przeniesiony poprawnie!";
  27. }
  28. ?>


Ten post edytował Trecco 22.08.2009, 18:17:37
Go to the top of the page
+Quote Post
emp
post 23.08.2009, 12:49:44
Post #4





Grupa: Zarejestrowani
Postów: 195
Pomógł: 14
Dołączył: 12.01.2006
Skąd: Gotham City

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


W $xml masz obiekt nie tablice simplexml poczytaj komentarze.
Nie powinno być tak
  1.  
  2. $id = $xml->id;
  3. $name = $xml->name;
  4. $points = $xml->points;
  5. $position = $xml->position;
  6. $gangname = $xml->gang->name;


Przed zapisaniem do bazy daj echo i sprawdź czy dane w zmiennej $xml są takie jak w pliku.
echo $xml->name; itd
Będziesz wiedział gdzie masz błąd przed zapisaniem do bazy czy w trakcie zapisywania do bazy.

Zrób jakieś testy np:
if( $xml == false ) echo 'Wystapił bład !' ;


Ten post edytował emp 23.08.2009, 13:02:30


--------------------
Temat zamykam i przenoszę do Bangladeszu.
To jest wiadomość śmierci jeśli ją czytasz to znaczy że pozostało ci 30 sekund życia, więc lepiej zacznij się modlić.
Go to the top of the page
+Quote Post
Pawel_W
post 23.08.2009, 12:58:27
Post #5





Grupa: Zarejestrowani
Postów: 1 675
Pomógł: 286
Dołączył: 15.06.2009
Skąd: Wieliczka

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


Cytat(emp @ 23.08.2009, 13:49:44 ) *
W $xml masz obiekt nie tablice simplexml
Nie powinno być tak
  1.  
  2. $id = $xml->id;
  3. $name = $xml->name;
  4. $points = $xml->points;
  5. $position = $xml->position;
  6. $gangname = $xml->gang->name;


jego przykład też zadziała winksmiley.jpg ale przy zapisie warto dodać prefix (String)
Go to the top of the page
+Quote Post
Trecco
post 23.08.2009, 19:57:26
Post #6





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 11.08.2009

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


Cytat(emp @ 23.08.2009, 13:49:44 ) *
W $xml masz obiekt nie tablice simplexml poczytaj komentarze.
Nie powinno być tak
  1.  
  2. $id = $xml->id;
  3. $name = $xml->name;
  4. $points = $xml->points;
  5. $position = $xml->position;
  6. $gangname = $xml->gang->name;


Przed zapisaniem do bazy daj echo i sprawdź czy dane w zmiennej $xml są takie jak w pliku.
echo $xml->name; itd
Będziesz wiedział gdzie masz błąd przed zapisaniem do bazy czy w trakcie zapisywania do bazy.


Zmieniłem na obiekty, dodałem
  1. echo $xml->id;
  2. echo $xml->name;
  3. echo $xml->points;
  4. echo $xml->position;
  5. echo $xml->gang->name;


Po
  1. $xml = simplexml_load_file("http://clodogame.fr/dev/api/user.91.xml");

Ale nic nie wyświetliło. Jakiś sugestie?

@EDIT
Zrobiłem dziecinny błąd, zauważyłem, że w pliku xml istnieje jeszcze <user>
  1. $id = $xml->user->id;
  2. $name = $xml->user->name;
  3. $points = $xml->user->points;
  4. $position = $xml->user->position;
  5. $gangname = $xml->user->gang->name;

Dodało do bazy danych.

Do wyświetlenia wystarczy
  1. SELECT position, name, gangname, points FROM gracze ORDER BY points DESC;


Ten post edytował Trecco 23.08.2009, 20:15:26
Go to the top of the page
+Quote Post
Pawel_W
post 23.08.2009, 20:06:28
Post #7





Grupa: Zarejestrowani
Postów: 1 675
Pomógł: 286
Dołączył: 15.06.2009
Skąd: Wieliczka

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


tak, skoro zakomentowałeś to foreach, to co tam robią te { i } ?
Go to the top of the page
+Quote Post
Trecco
post 23.08.2009, 20:16:54
Post #8





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 11.08.2009

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


  1. <?
  2. $sql['server'] = "db4free.net:3306";
  3. $sql['username'] = "trecco";
  4. $sql['password'] = "*****";
  5. $sql['database'] = "myhighscore";
  6.  
  7. mysql_connect($sql['server'],$sql['username'],$sql['password']);
  8. mysql_select_db($sql['database']);
  9.  
  10.  
  11.  
  12. $plik = file("id.txt");
  13. array_shift($plik);
  14.  
  15. foreach($plik as $p)
  16.  
  17. $xml = simplexml_load_file("http://clodogame.fr/dev/api/user.".$p.".xml");
  18.  
  19. $id = $xml->user->id;
  20. $name = $xml->user->name;
  21. $points = $xml->user->points;
  22. $position = $xml->user->position;
  23. $gangname = $xml->user->gang->name;
  24.  
  25. $query = mysql_query("INSERT INTO `myhighscore`.`gracze` (`id`, `name`, `points`, `position`, `gangname`) VALUES ('$id', '$name', '$points', '$position', '$gangname')");
  26. echo "$name zostal poprawnie przeniesiony!";
  27. ?>


Błąd:
  1. Warning: simplexml_load_file(http://clodogame.fr/dev/api/user.489%0D%0A.xml) [function.simplexml-load-file]: failed to open stream: HTTP request failed! HTTP/1.1 500 Internal Server Error in C:\Strony\sqltest.php on line 17


Da coś to, że w plikach tekstowych będę miał linki a nie id? Dla mnie ta sama droga, ale czy to pomoże.


@EDIT:
Zmieniłem co nieco w zapytaniach, teraz będzie się aktualizowało, a nie dodawało nowe:
  1. $query1 = mysql_query("DELETE FROM `myhighscore`.`gracze` WHERE `gracze`.`id` = '$id' AND `gracze`.`name` = '$name' AND `gracze`.`points` = '$points' AND `gracze`.`position` = '$position' AND `gracze`.`gangname` = '$gangname' LIMIT 1");
  2. $query2 = mysql_query("INSERT INTO `myhighscore`.`gracze` (`id`, `name`, `points`, `position`, `gangname`) VALUES ('$id', '$name', '$points', '$position', '$gangname')");

Tak, że 1 krok do przodu.

Ten post edytował Trecco 23.08.2009, 20:41:46
Go to the top of the page
+Quote Post
Pawel_W
post 23.08.2009, 20:50:16
Post #9





Grupa: Zarejestrowani
Postów: 1 675
Pomógł: 286
Dołączył: 15.06.2009
Skąd: Wieliczka

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


zdecyduj się, czy robisz z tym foreach czy nie, jak dajesz to nie usuwaj tych { } winksmiley.jpg
Go to the top of the page
+Quote Post
Trecco
post 23.08.2009, 20:56:42
Post #10





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 11.08.2009

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


Cytat(Pawel_W @ 23.08.2009, 21:50:16 ) *
zdecyduj się, czy robisz z tym foreach czy nie, jak dajesz to nie usuwaj tych { } winksmiley.jpg


Dodałem { } ale i tak jest błąd, tzn pobiera z pliku, ale tylko ostatnią.
Błąd:
  1. Warning: simplexml_load_file(http://clodogame.fr/dev/api/user.70%0D%0A.xml) [function.simplexml-load-file]: failed to open stream: HTTP request failed! HTTP/1.1 500 Internal Server Error in C:\Strony\sqltest.php on line 15
  2.  
  3. Warning: simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external entity "http://clodogame.fr/dev/api/user.70%0D%0A.xml" in C:\Strony\sqltest.php on line 15
  4. zostal poprawnie przeniesiony!
  5. Warning: simplexml_load_file(http://clodogame.fr/dev/api/user.117%0D%0A.xml) [function.simplexml-load-file]: failed to open stream: HTTP request failed! HTTP/1.1 500 Internal Server Error in C:\Strony\sqltest.php on line 15
  6.  
  7. Warning: simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external entity "http://clodogame.fr/dev/api/user.117%0D%0A.xml" in C:\Strony\sqltest.php on line 15
  8. zostal poprawnie przeniesiony!
  9. Warning: simplexml_load_file(http://clodogame.fr/dev/api/user.97%0D%0A.xml) [function.simplexml-load-file]: failed to open stream: HTTP request failed! HTTP/1.1 500 Internal Server Error in C:\Strony\sqltest.php on line 15
  10.  
  11. Warning: simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external entity "http://clodogame.fr/dev/api/user.97%0D%0A.xml" in C:\Strony\sqltest.php on line 15
  12. zostal poprawnie przeniesiony!mieze zostal poprawnie przeniesiony!


Kod:
  1. <?
  2. $sql['server'] = "db4free.net:3306";
  3. $sql['username'] = "trecco";
  4. $sql['password'] = "***";
  5. $sql['database'] = "myhighscore";
  6.  
  7. mysql_connect($sql['server'],$sql['username'],$sql['password']);
  8. mysql_select_db($sql['database']);
  9.  
  10. $plik = file("id.txt");
  11. array_shift($plik);
  12.  
  13. foreach($plik as $p)
  14. {
  15. $xml = simplexml_load_file("http://clodogame.fr/dev/api/user.".$p.".xml");
  16.  
  17. $id = $xml->user->id;
  18. $name = $xml->user->name;
  19. $points = $xml->user->points;
  20. $position = $xml->user->position;
  21. $gangname = $xml->user->gang->name;
  22.  
  23. $query1 = mysql_query("DELETE FROM `myhighscore`.`gracze` WHERE `gracze`.`id` = '$id' AND `gracze`.`name` = '$name' AND `gracze`.`points` = '$points' AND `gracze`.`position` = '$position' AND `gracze`.`gangname` = '$gangname' LIMIT 1");
  24. $query2 = mysql_query("INSERT INTO `myhighscore`.`gracze` (`id`, `name`, `points`, `position`, `gangname`) VALUES ('$id', '$name', '$points', '$position', '$gangname')");
  25. echo "$name zostal poprawnie przeniesiony!";
  26. }
  27. ?>
Go to the top of the page
+Quote Post
Pawel_W
post 23.08.2009, 21:04:13
Post #11





Grupa: Zarejestrowani
Postów: 1 675
Pomógł: 286
Dołączył: 15.06.2009
Skąd: Wieliczka

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


  1. $xml = simplexml_load_file("http://clodogame.fr/dev/api/user.".$p.".xml");

zamień na
  1. $xml = simplexml_load_file("http://clodogame.fr/dev/api/user.".trim($p).".xml");
Go to the top of the page
+Quote Post
Trecco
post 23.08.2009, 21:08:33
Post #12





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 11.08.2009

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


Cytat(Pawel_W @ 23.08.2009, 22:04:13 ) *
  1. $xml = simplexml_load_file("http://clodogame.fr/dev/api/user.".$p.".xml");

zamień na
  1. $xml = simplexml_load_file("http://clodogame.fr/dev/api/user.".trim($p).".xml");


Thx działa wszystko
Teraz powiedźcie jak mam użyć
SELECT position, name, gangname, points FROM gracze ORDER BY points DESC
;x

Ten post edytował Trecco 23.08.2009, 21:16:25
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: 27.04.2024 - 07:43