2008-10-11 4 views
6

Próbowałem wstawić nowe dane do istniejącego pliku XML, ale to nie działa. Oto mój plik xml:Wstawianie danych w pliku XML z PHP DOM

<list> 
    <activity>swimming</activity> 
    <activity>running</activity> 
<list> 

Teraz mój pomysł robił dwa pliki: stronę indeksu, gdzie wyświetla co jest w pliku i daje pole do wstawiania nowych elementów, a strona php który będzie wstawić dane do pliku XML. Oto kod do index.php:

<html> 
<head><title>test</title></head> 
</head> 

<?php 
    $xmldoc = new DOMDocument(); 
    $xmldoc->load('sample.xml', LIBXML_NOBLANKS); 

    $activities = = $xmldoc->firstChild->firstChild; 
    if($activities!=null){ 
     while(activities!=null){ 
      echo $activities->textContent.'<br/>'; 
      activities = activities->nextSibling. 
     } 
    } 
?> 

<form name='input' action='insert.php' method='post'> 
    insert activity: 
    <input type='text' name='activity'/> 
    <input type='submit' value='send'/> 
</form> 
</body> 
</html 

i oto kod dla insert.php:

<?php 
    header('Location:index.php'); 
    $xmldoc = new DOMDocument(); 
    $xmldoc->load('sample.xml'); 

    $newAct = $_POST['activity']; 

    $root = $xmldoc->firstChild; 

    $newElement = $xmldoc->createElement('activity'); 
    $root->appendChild($newElement); 
    $newText = $xmldoc->createTextNode($newAct); 
    $newElement->appendChild($newText); 

    $xmldoc->save('sample.xml'); 
?> 

Użytkownik ma dostęp do index.php, gdzie mógł zobaczyć listę bieżących działań obecny w pliku XML oraz pole tekstowe poniżej, w którym można wstawić nowe działania. Po kliknięciu przycisku wysyłania strona wywołałaby insert.php, która zawiera kod otwierający plik XML w drzewie DOM, wstawia nowy węzeł pod węzeł główny i wywołuje stronę index.php, gdzie użytkownik powinien być mógł zobaczyć listę działań, swoją nową aktywność tam pod innymi. To nie działa. Kiedy klikam przycisk, aby przesłać nowy wpis, strony się odświeżają i najwyraźniej nic się nie dzieje, XML jest taki sam jak poprzednio. Co zrobiłem źle? Chciałbym też wiedzieć, czy jest lepszy sposób na zrobienie tego.

Odpowiedz

8

to twoja blokada kodu i wklejona z istniejących plików? jeśli tak, widzę dwa potencjalne problemy:

<form name='input' action'insert.php' method='post'> // should be: 
<form name="input" action="insert.php" method="post"> 

UWAGA: tracisz action="insert.php", który spowoduje, że postać po prostu przeładować się bez składania, która jest zachowanie można opisać.

Po drugie, upewnij się, że masz uprawnienia do zapisu "sample.xml". można sprawdzić, czy jesteś rzeczywiście pisanie czegokolwiek:

print 'I wrote '.$xmldoc->save('sample.xml').' bytes of data'; 
+0

sprawa była rzeczywiście coś tak głupie, jak pozwolenie plików ... im taką idiotkę. the missing = to literówka, więc nie stanowiło to problemu. bardzo dziękuję –

+0

ha to się dzieje :) – Owen

2

$ newText = $ xmldoc-> createTextNode ($ newActv);

Zmiana ta linia do

$ newText = $ xmldoc-> createTextNode ($ newAct);

+0

zrobione, dziękuję za wskazanie go –

2

Właściwie popełniłeś błędy w dwóch miejscach.

Ta linia powinna być Myślę, że z powodu literówki, przegapiłeś znak równości. Również

Linie te powinny być

Spróbuj teraz, to powinno działać, Hop to byłby jakiś sens

+0

właśnie naprawiłem literówkę. zabrał mnie wystarczająco długo! dzięki –

1

Chyba wiem, na czym polega problem z kodem. Nie powinno się pisać tak: <?xml-stylesheet type="text/xsl" href="sample.xsl" ?> Prawo kod jest:

<?xml:stylesheet type="text/xsl" href="sample.xsl" ?> 
1

jest to kod pracuję dla mnie.

indeks.php

<html> 
<head><title>test</title></head> 
</head> 

<?php 
    $xmldoc = new DOMDocument(); 
    $xmldoc->load('sample.xml', LIBXML_NOBLANKS); 

    $activities = $xmldoc->firstChild->firstChild; 
    if($activities!=null){ 
     while($activities!=null){ 
      echo $activities->textContent.'<br/>'; 
      $activities = $activities->nextSibling; 
     } 
    } 
?> 

<form name='input' action='insert.php' method='post'> 
    insert activity: 
    <input type='text' name='activity'/> 
    <input type='submit' value='send'/> 
</form> 
</body> 
</html> 




insert.php 


<?php 
    header('Location:index.php'); 
    $xmldoc = new DOMDocument(); 
    $xmldoc->load('sample.xml'); 

    $newAct = $_POST['activity']; 

    $root = $xmldoc->firstChild; 

    $newElement = $xmldoc->createElement('activity'); 
    $root->appendChild($newElement); 
    $newText = $xmldoc->createTextNode($newAct); 
    $newElement->appendChild($newText); 

    $xmldoc->save('sample.xml'); 
?> 

sample.xml

<list> 
    <activity>swimming</activity> 
    <activity>running</activity> 
</list> 
3

Ostateczne rozwiązanie

sample.xml

<list> 
    <activity>swimming</activity> 
    <activity>running</activity> 
    <activity>Jogging</activity> 
    <activity>Theatre</activity> 
    <activity>Programming</activity> 
</list> 

index.php

<html> 
<head><title>test</title></head> 
</head> 

<?php 
    $xmldoc = new DOMDocument(); 
    $xmldoc->load("sample.xml", LIBXML_NOBLANKS); 

    $activities = $xmldoc->firstChild->firstChild; 
    if($activities!=null){ 
     while($activities!=null){ 
      echo $activities->textContent."<br/>"; 
      $activities = $activities->nextSibling; 
     } 
    } 
?> 

<form name="input" action="insert.php" method="post"> 
    insert activity: 
    <input type="text" name="activity"/> 
    <input type="submit" value="send"/> 
</form> 
</body> 
</html> 

insert.php

<?php 
    header('Location:index.php'); 
    $xmldoc = new DOMDocument(); 
    $xmldoc->load('sample.xml'); 

    $newAct = $_POST['activity']; 

    $root = $xmldoc->firstChild; 

    $newElement = $xmldoc->createElement('activity'); 
    $root->appendChild($newElement); 
    $newText = $xmldoc->createTextNode($newAct); 
    $newElement->appendChild($newText); 

    $xmldoc->save('sample.xml'); 
?>