Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [XML][SQL][PHP]Problem z czytaniem
Forum PHP.pl > Forum > Przedszkole
Trecco
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.
emp
Ł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.
Trecco
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. ?>
emp
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 !' ;
Pawel_W
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)
Trecco
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;
Pawel_W
tak, skoro zakomentowałeś to foreach, to co tam robią te { i } ?
Trecco
  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.
Pawel_W
zdecyduj się, czy robisz z tym foreach czy nie, jak dajesz to nie usuwaj tych { } winksmiley.jpg
Trecco
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. ?>
Pawel_W
  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");
Trecco
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
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.