| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |
|

13-06-2010, 09:39
|
|
Nappi
Registrierter Benutzer
|
|
Registriert seit: Apr 2004
Beiträge: 14
|
|
Mit PHP -> html teilweise ersetzen
Hallo zusammen
Gibt es eine Möglichkeit nur einen Teil in einem mit PHP erstellten HTML File zu ersetzen wenn dieser Eintrag geändert wurde, ihn jedoch anhängen wenn er noch nicht vorhanden ist?
Das mit dem Anhängen klappt ja ganz problemlos damit
PHP-Code:
<?php
// Sichergehen, dass die Datei existiert und beschreibbar ist
if (is_writable($filename)) {
// Wir öffnen $filename im "Anhänge" - Modus.
// Der Dateizeiger befindet sich am Ende der Datei, und
// dort wird $somecontent später mit fwrite() geschrieben.
if (!$handle = fopen($filename, "a")) {
print "Kann die Datei $filename nicht öffnen";
exit;
}
// Schreibe $somecontent in die geöffnete Datei.
if (!fwrite($handle, $somecontent)) {
print "Kann in die Datei $filename nicht schreiben";
exit;
}
print "Fertig, in Datei $filename wurde $somecontent geschrieben";
fclose($handle);
} else {
print "Die Datei $filename ist nicht schreibbar";
}
?>
Nun sollte aber abgefragt werden ob im HTML <div id="Pferd"> schon vorhanden ist - wenn ja soll dieser Eintrag durch den neuen ersetzt werden wenn nicht soll er angehangen werden.
Danke für eure Hilfe
Nappi
|

13-06-2010, 10:34
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Hallo,
für solche Dinge kann ich nur dazu raten, das DOM zu benutzen und speziell für die Prüfung, ob etwas enthalten ist oder nicht, gibt es XPath.
Gruß,
Amica
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

13-06-2010, 10:48
|
|
Nappi
Registrierter Benutzer
|
|
Registriert seit: Apr 2004
Beiträge: 14
|
|
vielen dank
xPath war genau das was ich gesucht habe
danke nochmal
Nappi
|

14-06-2010, 12:19
|
|
Nappi
Registrierter Benutzer
|
|
Registriert seit: Apr 2004
Beiträge: 14
|
|
Das mit xpath ist zwar eine sehr gute Idee nur bin ich anscheinend nicht gut genug um es richtig ein zu setzen!
Ich habe es so versucht
PHP-Code:
<?php $name = $_POST['name']; $text = $_POST['text']; $image = $_POST['image']; $file = $DOCUMENT_ROOT. 'member.html';
$htmleintrag = ' <div id="'.$name.'"> <h3>'.$name.'</h3> <p><div> <img style="float: left; padding: 5px; margin: 5px 5px 5px 5px; border: 2px solid black" src="'.$image.'" alt="'.$name.'" width="400px" /> </div> <p>'.$text.'</p> </div>';
$doc = new DOMDocument(); $doc->loadHTMLFile($file);
$xpath = new DOMXpath($doc);
$elements = $xpath->query('*/div[@id="'.$name.'"]');
if (!is_null($elements)) { foreach ($elements as $element) {
PHP-Code:
if (is_writable($file)) { if (!$handle = fopen($file, 'a')) { print 'Kann die Datei '.$file.' nicht öffnen'; exit; } if (!fwrite($handle, $htmleintrag)) { print 'Kann in die Datei '.$file.' nicht schreiben'; exit; } print 'Fertig, der Member '.$name.' wurde angelegt'; fclose($handle); } else { print 'Die Datei '.$file.' ist nicht schreibbar'; }
$nodes = $element->childNodes; foreach ($nodes as $node) {
$htmleintrag = preg_replace ('<div id="'.$name.'">', '</div>' , $htmleintrag); } } } ?>
Was passiert - > wenn das DIV vorhanden ist wird es neu geschriben das alte aber nicht überschrieben, wenn ich jetzt das ganze noch zwei weitere male machte kommt diese Fehlermeldung.
Zitat:
Warning: DOMDocument::loadHTMLFile() [domdocument.loadhtmlfile]: htmlParseStartTag: invalid element name in member.html, line: 45 in E:\xampp\htdocs\test\html.php on line 19
Warning: DOMDocument::loadHTMLFile() [domdocument.loadhtmlfile]: Unexpected end tag : div in member.html, line: 51 in E:\xampp\htdocs\test\html.php on line 19
|
Ist das DIV noch nirgens im HTML file vorhanden macht das Script garnichts.
Wo liegt mein Fehler?
Danke für Eure Hilfe
Nappi
Geändert von Nappi (14-06-2010 um 13:13 Uhr)
|

14-06-2010, 12:23
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
member.html enthält offenbar kaputte HTML-Code. Korrigiere diesen mit Hilfe von dem W3C-Validator.
|

14-06-2010, 12:39
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Bevor du loadHTMLFile aufrufst, solltest du
PHP-Code:
libxml_use_internal_errors(true);
setzen, damit die Fehlermeldungen nicht direkt ausgegeben werden.
Die ganze preg_replace- und fwrite-Geschichte ist schlecht. Du solltest stattdessen direkt das DOM bearbeiten:
PHP-Code:
$found = false; foreach ($xpath->query('//div[@id="'.$name.'"]') as $node) { $found = true; // ersetzen: $node->parentNode->replaceChild($neuesElement, $node); break; } if (!$found) { // einfügen: $irgendeinElternElement->appendChild($neuesElement); } // speichern $doc->save($file); // oder $doc->saveHTMLFile($file);
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

14-06-2010, 13:00
|
|
Nappi
Registrierter Benutzer
|
|
Registriert seit: Apr 2004
Beiträge: 14
|
|
Vielen dan für Eure Antworten
Ich habe das vorerst so übernommen und Arbeite mich da rein so das ich es auch wirklich verstehe
Es kommt diese Fehlermeldung
Zitat:
|
Fatal error: Call to a member function appendChild() on a non-object in E:\xampp\htdocs\test\html.php on line 33
|
Line 33 ist
Code:
$doc->save($file); // oder $doc->saveHTMLFile($file);
auch wenn ich
Code:
$doc->saveHTMLFile($file);
verwende kommt die selbe Fehlermeldung
warum kann er nicht speichern?
Nappi
Geändert von Nappi (14-06-2010 um 13:02 Uhr)
|

14-06-2010, 13:03
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Was steht denn auf Zeile 33? Hast du „$irgendeinElternElement“ auch durch was sinnvolles ersetzt?
Edit zu deinem Edit: Nein, Zeile 33 ist die, auf der appendChild aufgerufen wird, nur rufst du es von etwas falschem auf.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
Geändert von AmicaNoctis (14-06-2010 um 13:05 Uhr)
|

14-06-2010, 13:07
|
|
Nappi
Registrierter Benutzer
|
|
Registriert seit: Apr 2004
Beiträge: 14
|
|
Du bist zu schnell für mich
Ich habe meinen vorherigen Post nochmal geendert weil ich vergessen hatte zu schreiben was in line 33 steht  - da hattest du schon geantwortet.
Echt klasse
Ja ich verwende Statische werte für die Variablen zum testen
PHP-Code:
$name = 'Nappi';
$text = 'mal testen ob das geht';
$image = 'img1.png';
$file = $DOCUMENT_ROOT. 'member.html';
Nappi
|

14-06-2010, 13:12
|
|
Nappi
Registrierter Benutzer
|
|
Registriert seit: Apr 2004
Beiträge: 14
|
|
jetzt verstehe ich das erst! bzw nicht :/
$irgendeinElternElement wäre bie mir ja $htmleintrag oder ist das falsch?
Ich stehe total am schlauch und finde keinen weg runter
Nappi
|

14-06-2010, 13:24
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Ich kann aus deinem Code leider nicht rekonstruieren, was genau du eigentlich vorhast. Wenn ich mich nicht irre, gehst du ziemlich falsch an die Sache ran und hast in Sachen XML generell noch Nachholbedarf. Daher weiß ich nicht, wo ich anfangen soll, dir zu erklären, dass du das alles wegwerfen kannst, um nochmal sauber anzufangen.
Als erstes beschreibst du jetzt bitte, was für ein Dokument das ist, wo diese Einträge rein sollen und an welcher Stelle nicht vorhandene eingefügt werden sollen. So wie du es mit fwrite machen willst, geht es einfach nicht, denn dann kommt z. B. sowas raus und das ist kein gültiges HTML:
HTML-Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>...</title>
</head>
<body>
...
</body>
</html>
<div ...>...</div>
<div ...>...</div>
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

14-06-2010, 13:44
|
|
Nappi
Registrierter Benutzer
|
|
Registriert seit: Apr 2004
Beiträge: 14
|
|
Du hast absolt recht mit xml kenn ich mich wirklich sehr schlecht aus.
Also ich verwende eine ein HTML file so zu ändern das wenn ein Neues Bild mit beschreibung geladen wird dieses in das HTML file eingetragen wird. Ist es aber schon einmal vorhanden und soll lediglich erneuert werden bzw eine neue Beschreibung eingefügt werden dann soll die Alte überschrieben werden.
das ist das HTML
HTML-Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Galerie</title>
</head>
<body>
<div id="horse1">
<h3>Pferd im Galopp</h3><p><div >
<img style="float: left; padding: 5px; margin: 5px 5px 5px 5px; border: 2px solid black"
src="/images/horse1.jpg"
alt="Pferd im Galopp" width="400px" /></div>
<p>Beschreibung des Bildes.</p>
</div>
</body>
</html>
Die zwei äusseren DIV geben dan zu ändernden Rahmen.
Das ganze ist für eine Galerie.
Ich hoffe du kannst mir helfen denn bei allem probieren und lesen - suchen nach Tuorials und Manuels habe ich komplet den überblick verlohren.
Nappi
|

14-06-2010, 14:22
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
In diesem Fall ist $irgendeinElternElement also das body-Element und das erhältst du so (kannst es dann gerne auch überall(!) in $body umbenennen):
PHP-Code:
$irgendeinElternElement = null;
foreach ($xpath->query("/html/body") as $node) {
$irgendeinElternElement = $node;
break;
}
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

14-06-2010, 14:49
|
|
Nappi
Registrierter Benutzer
|
|
Registriert seit: Apr 2004
Beiträge: 14
|
|
Irgendwie klappt das leider auch nicht :/
Sorry das ich dir so viel mühe mache.
Ich bekomme da die Fehlermeldung
Zitat:
|
Fatal error: Call to a member function appendChild() on a non-object in E:\xampp\htdocs\test\html.php
|
Und ich glaube das es im weiteren verlauf mit body nicht gehen wird da ja mehrere DIV ID in der HTML stehen werden und dann ersetzt er mir ja immer alle - oder liege ich da schon wieder falsch.
Nochmals sorry - ich bin eben ziemlich blond
Selma
|

14-06-2010, 19:49
|
|
Nappi
Registrierter Benutzer
|
|
Registriert seit: Apr 2004
Beiträge: 14
|
|
Ich hab eine Positives resuldat - auch wenn es noch immer nicht das ist was es sein sollte aber zumindest tut sich etwas
Mein Momentanes Script - oder besser das von AmicaNoctis
PHP-Code:
<?php $name = $_POST['name']; $text = $_POST['text']; $image = $_POST['image']; $file = $DOCUMENT_ROOT. 'member.html'; $neuesElement = ' <div id="'.$name.'"> <h3>'.$name.'</h3> <p><div> <img style="float: left; padding: 5px; margin: 5px 5px 5px 5px; border: 2px solid black" src="'.$image.'" alt="'.$name.'" width="400px" /> </div> <p>'.$text.'</p> </div>';
libxml_use_internal_errors(false); $doc = new DOMDocument(); $doc->loadHTMLFile($file); $xpath = new DOMXpath($doc); $found = false; foreach ($xpath->query('/body/div[@id="'.$name.'"]') as $node) { $found = true; // ersetzen: $node->parentNode->replaceChild($neuesElement, $node); break; } if (!$found) { $bodyElement = null; foreach ($xpath->query("/body") as $node) { $bodyElement = $node; // einfügen: $bodyElement->appendChild($neuesElement); break; } }
// speichern $doc->save($file); // oder $doc->saveHTMLFile($file); ?>
Dabei kommt das raus
HTML-Code:
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<?xml version="1.0" standalone="yes"?>
<html><body>

<div id="horse">
<h3>Pferd im Galopp</h3><p/><div>
<img style="float: left; padding: 5px; margin: 5px 5px 5px 5px; border: 2px solid black" src="/images/horse1.jpg" alt="Pferd im Galopp" width="400px"/></div>
<p>Beschreibung des Bildes.</p>
</div>

</body></html>
leider übernimmt es mir nicht mein HTML und die komischen zeichen - 
 - ka wo die her kommen.
Da ist noch etwas - bei jedem erneuten aufruf kommt ein ? und eine Zeile bei
Zitat:
<?xml version="1.0" standalone="yes"?>
<?xml version="1.0" standalone="yes"??>
<?xml version="1.0" standalone="yes"???>
|
hinzu, nach 3 aufrufen sieht es so aus wie oben.
Wo liegt jetzt noch der Fehler?
Nappi
Geändert von Nappi (14-06-2010 um 19:55 Uhr)
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|