2012-08-13 27 views
8

Tengo un pequeño problema para extraer el valor de entrada de un formulario HTML. Como sé, no hay nada de malo en mi código, pero no puedo encontrar cuál es el problema.DOM getElementbyId no funciona correctamente

<?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'); 


?> 

Me muestra un error:

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

estoy usando XAMPP 1.7.3 en Windows 7. Lo probé en mi servidor y no me mostró errores. Cualquier ayuda sería apreciada.

+0

error confirmó: http://codepad.org/ RAknUJ5a –

+0

Obtuve el mismo mensaje en el teclado, pero en mi servidor funciona correctamente. Codepad es <5.3, IIRC .... @Death, ¿con qué versión de PHP estás trabajando? –

+0

@Chris php 5.3.1 --- – undone

Respuesta

4

Como se señaló en los comentarios sobre el doc page, debe declarar un tipo de documento para getElementById para llevar a cabo como se esperaba

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

...code continues ... 

por la documentación, un DTD se debe especificar para getElementById para comprender qué atributo de un elemento se usa como el identificador único. Declarar un doctype logra esto. También puede establecer explícitamente esta (sin dar una DTD) mediante el uso de setIdAttribute,

Documentación

+0

¿Puede explicar por qué mi código funciona en el servidor? – undone

+0

No, no puedo explicar por qué en mi servidor (con PHP 5.4), el doctype no es obligatorio. He estado tratando de averiguarlo, porque creo que es extraño que ** no ** tenga que declarar un doctype. ¿Dónde está la instancia de PHP de mi servidor obteniendo el DTD cuando se llama a 'loadHTML'? ¿Adivinación? –

+0

mi servidor es php 5.2 y probé con otro php 5.3 y todo funciona !!! – undone

6

Desde el 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.


Desde su HTML es sólo un fragmento, que no especifica un DTD, por lo que se quedan con los atributos que dicta el ID de sí mismo. Un ejemplo básico sería el resultado:

$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 
Cuestiones relacionadas