Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PHP>XML
Forum PHP.pl > Forum > PHP
playdewu
Witam.
Mam problem, a głowię się już z nim parę godzin i nie mogę skonstruować najprostszej formy SimpleXML ;|
Mam plik acl.XML, który wyglądaj następująco:
  1.  
  2. <acl>
  3. <group name="Skin1">
  4. <acl name="Default"></acl>
  5. <object name="user.playdewu"></object>
  6. </group>
  7. </acl>

przy użyciu SimpleXML z pozycji skryptu PHP chciałbym do tego pliku dodać następującą linijkę:
  1. <object name="user.twoj_nick"></object>


Kiedyś robiłem coś podobnego i znalazłem taki skrypt, ale za żadne skarby nie mogę go dobrze przerobić:
  1. <?php
  2. $players_folder = 'D:\\WebServ\\httpd\\acc2\\';
  3. {
  4. $nick = $_POST['nick'];
  5. $group = 'group name';
  6. $loc = 'acl';
  7.  
  8. $file = $players_folder .$loc.'.xml';
  9. if (file_exists($file)) {
  10. $xml = simplexml_load_file($file);
  11.  
  12. $character = $xml->$group->Skin1->addChild('object');
  13. $character->addAttribute('name', user.$nick);
  14.  
  15. $newplayerFile = $xml->asXML();
  16. $open_file = fopen($file, 'w');
  17. fwrite($open_file, $newplayerFile);
  18. fclose($open_file);
  19. $message = "<b>$nick</b> mianowany na Raikage.";
  20. }
  21.  
  22. echo $message;
  23. }
  24. echo "<br><br><br><p align='right'><span style='font-size: 9px'><b><i>Skrypt stworzony przez dewu</i></b></span></p>";
  25. ?>

Niestety, wywala mi błędy:
Kod
Warning: SimpleXMLElement::addChild() [simplexmlelement.addchild]: Cannot add child. Parent is not a permanent member of the XML tree in D:\WebServ\httpd\acc2\mta.php on line 12

Fatal error: Call to a member function addAttribute() on a non-object in D:\WebServ\httpd\acc2\mta.php on line 13


Mimo nie łatwego zadania proszę kogokolwiek o poświęcenie mi chwili.
Pozdrawiam.
vonski
Ten element

  1. <object name="user.twoj_nick"></object>


chcesz dodać do elementu

  1. <group name="Skin1">


?

Można to chyba zrobić trochę prościej niż w Twoim skrypcie:

  1. $sxe = simplexml_load_file('acl.xml');
  2.  
  3. $skin1 = $sxe->xpath("//group[@name='Skin1']");
  4.  
  5. $newEl = $skin1[0]->addChild('object');
  6. $newEl->addAttribute('name', 'user.twoj_nick');
  7.  
  8. $sxe->asXML('plik_wynikowy.xml');
playdewu
Okej, troszkę Twój kod sobie przerobiłem dodając pole z nickiem, używając funkcji foreach:
  1. <?php if(!isset($_POST['submit'])) { ?>
  2.  
  3. <form action="" method="post">
  4. Nick: <input type="text" name="word[]"><br>
  5. <input type="submit" name="submit">
  6. </form>
  7.  
  8. <?php
  9. }
  10. else
  11. {
  12. $nick = $_POST['nick'];
  13. $sxe = simplexml_load_file('acl.xml');
  14. $loc = 'acl';
  15.  
  16. $players_folder = 'D:\\WebServ\\httpd\\acc2\\';
  17. $file = $players_folder .$loc.'.xml';
  18. $skin1 = $sxe->xpath("//group[@name='Skin1']");
  19.  
  20. foreach ($_POST['word'] as $nicky)
  21. {
  22. $newEl = $skin1[0]->addChild('object');
  23. $newEl->addAttribute('name', 'user.$nicky');
  24. $sxe->asXML($file);
  25. }
  26. echo("Jutsu przyznane <b>".$nick."</b> !");
  27. }
  28. ?>


Nie wiem gdzie popełniłem błąd ale funkcja $nicky nie pobiera mi nicku wpisanego wcześniej w pole i zamiast
  1. <object name="user.wpisany_w_pole_nick"/>

otrzymuję
  1. <object name="user.$nicky"/>
vonski
Dlatego, że używasz pojedynczych cudzysłowów, więc to:

'user.$nicky'

jest traktowane dosłownie.

Zamiast tego użyj podwójnych cudzysłowów:

"user.$nicky"

albo konkatenacji:

'user.' . $nicky
playdewu
Głupi ja biggrin.gif
Dziękuję ślicznie za pomoc, już byłem pewien, że nikt nie zechce mi dzisiaj pomóc wink.gif
Pozdrawiam i życzę miłego wieczoru.

Wie ktoś może dlaczego to niedziała? ;/
  1. <?php if(!isset($_POST['submit'])) { ?>
  2.  
  3. <form action="" method="post">
  4. Nick: <input type="text" name="word[]"><br>
  5. Skin: <select name="skin[]" multiple>
  6. <option title="Wybierz skin"</option>
  7. <option value="Skin1">Alliance Clothing</option>
  8. <option value="Skin2">Military Clothing</option>
  9. <option value="Skin3">Arctic Suit</option>
  10. <option value="Skin4">SSC Clothing</option>
  11. <option value="Skin5">Armeec Clothing</option>
  12. <option value="Skin6">Fahrenheit[F] Suit</option>
  13. <option value="Skin7">Tourist Clothing</option>
  14. </select>
  15. <input type="submit" name="submit">
  16. </form>
  17.  
  18. <?php
  19. }
  20. else
  21. {
  22. $nick = $_POST['nick'];
  23. $sxe = simplexml_load_file('acl.xml');
  24. $loc = 'acl';
  25.  
  26. foreach ($_POST['skin'] as $skiny)
  27. $players_folder = 'D:\\WebServ\\httpd\\acc2\\';
  28. $file = $players_folder .$loc.'.xml';
  29. $skin1 = $sxe->xpath("//group[@name="$skiny"]");
  30.  
  31. foreach ($_POST['word'] as $nicky)
  32. {
  33. $newEl = $skin1[0]->addChild('object');
  34. $newEl->addAttribute('name', "user.$nicky");
  35. $sxe->asXML($file);
  36. }
  37. echo("Jutsu przyznane <b>".$nick."</b> !");
  38. }
  39. ?>
vonski
Znowu problem z cudzysłowami? wink.gif

Zamiast tego:

  1. $skin1 = $sxe->xpath("//group[@name="$skiny"]");


daj to:

  1. $skin1 = $sxe->xpath("//group[@name='$skiny']");
playdewu
No i znów wyłożyłem się na tym samym.
A byłem pewnien, że próbowałem i z takimi cudzysłowami wink.gif

Jeszcze jedno pytanko: W jaki sposób wywołać pojawienie się obrazka obok po kliknięciu w którąś z opcji?
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.