2012-08-13 5 views
8

Ich habe ein kleines Problem mit dem Extrahieren von Wert der Eingabe aus einem HTML-Formular. Wie ich weiß, ist an meinem Code nichts falsch, aber ich kann nicht herausfinden, wo das Problem liegt.DOM getElementbyId funktioniert nicht richtig

<?php 
error_reporting(E_ALL); 
    ini_set('display_errors', 1); 

$t =<<<D 
<form id="frm-send" method="post" action="index.php" > 
<input type="text" name="data[postusername]" id="postusername" value="user" />  
<input type="checkbox" name="data[save]" id="data[save]" value="1" /> 
<input type="hidden" name="secret" id="secret" value="0d35635c0cb11760789de6c4fe35e046311f724b" /> 
<input type="submit" name="btnSubmit" id="btnSubmit" value="Send" /> 
<input type="hidden" name="data[checkgetrequest]" value="true" id="data[checkgetrequest]" /> 
<input type="hidden" name="frm-id" value="13448477965028bfb44222d" id="frm-id" /> 
</form> 
<input type="text" id="getfocus_txt_13448477965028bfb44222d" name="getfocus_txt_13448477965028bfb44222d" /> 


D; 
    $dom = new domDocument; 
    $dom->loadHTML($t); 
    $dom->preserveWhiteSpace = true; 
    $frmid = $dom->getElementById('frm-id') ; 
    echo $frmid->getAttribute('value'); 


?> 

Es zeigt mir einen Fehler:

Fatal error: Call to a member function getAttribute() on a 
non-object in E:\Apache\msg.php on line 22 

ich XAMPP 1.7.3 auf Windows 7 verwenden. Ich habe es auf meinem Server getestet und es zeigte mir keine Fehler. Jede Hilfe wäre willkommen.

+0

Fehler bestätigt: http://codepad.org/ RAknUJ5a –

+0

Ich habe das gleiche auf Codepad, aber auf meinem Server funktioniert es richtig. Codepad ist <5.3, IIRC .... @Death, mit welcher PHP-Version arbeiten Sie? –

+0

@Chris php 5.3.1 --- – undone

Antwort

4

Wie auf der doc page in den Kommentaren erwähnt, Sie Doctype für getElementById erklären muss als

t =<<<D 
<!DOCTYPE html> 
<form id="frm-send" method="post" action="index.php" > 

...code continues ... 

Per Dokumentation erwartet auszuführen, muss eine DTD für angegeben werden getElementById zu verstehen, welches Attribut eines Elements als eindeutige Kennung verwendet wird. Durch die Deklaration eines Doctypes wird dies erreicht. Sie können dies auch explizit festgelegt (ohne eine DTD zu geben) von setIdAttribute Verwendung

Dokumentation

+0

Kannst du erklären, warum mein Code auf dem Server funktioniert? – undone

+0

Nein, ich kann nicht erklären, warum auf meinem Server (mit PHP 5.4) der Doctype nicht benötigt wird. Ich habe versucht, es herauszufinden, weil ich es seltsam finde, dass ich keinen Doctype deklarieren muss. Woher bezieht die PHP-Instanz meines Servers die DTD, wenn 'loadHTML' aufgerufen wird? Raten? –

+0

mein server ist php 5.2 und ich habe mit einem anderen php 5.3 getestet und alles funktioniert !!! – undone

6

Vom DOMDocument::getElementById() docs:

For this function to work, you will need either to set some ID attributes with DOMElement::setIdAttribute or a DTD which defines an attribute to be of type ID. In the later case, you will need to validate your document with DOMDocument::validate or DOMDocument::$validateOnParse before using this function.


Da Ihr HTML nur ein Fragment ist, ist es nicht eine DTD angeben, so dass Sie mit diktierte die ID selbst Attribute bleiben. Ein einfaches Beispiel würde wie folgt aussehen:

$html = '<div><p id="a">Para A</p><p id="b">Para B</p></div>'; 

$dom = new DOMDocument; 
$dom->loadHTML($html); 

// Set the ID attribute to be "id" for each (non-ns) element that has one. 
foreach ($dom->getElementsByTagName('*') as $element) { 
    if ($element->hasAttribute('id')) { 
     $element->setIdAttribute('id', true); 
    } 
} 

$p = $dom->getElementById('b'); 
echo $p->textContent; // Para B