2012-08-13 58 views
8

Bir HTML formundaki girdinin değerini çıkarırken küçük bir sorunum var. Bildiğim gibi, kodumda yanlış bir şey yok, ama sorunun ne olduğunu bulamıyorum. Bana bir hata gösterirDOM getElementbyId düzgün çalışmıyor

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


?> 

:

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

Ben pencerelerde 7 XAMPP 1.7.3 kullanıyorum. Sunucumda test ettim ve bana hata göstermedi. Herhangi bir yardım mutluluk duyacaktır. DOMDocument::getElementById() docs itibaren

+0

Hata doğruladı: http://codepad.org/ RAknUJ5a –

+0

Aynı şeyi codepad'de aldım, ancak sunucumda düzgün çalışıyor. Codepad <5.3, IIRC .... @Death, hangi PHP sürümüyle çalışıyorsunuz? –

+0

@Chris php 5.3.1 --- – undone

cevap

4

, sen belgelere Başına

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

...code continues ... 

beklendiği gibi gerçekleştirmek getElementById için Doctype'ı ilan etmeli, bir DTD için belirtilmelidir Bir öğenin hangi özelliğinin benzersiz tanımlayıcı olarak kullanıldığını anlamak için getElementById. Bir doktrinin bildirilmesi bunu gerçekleştirir. Ayrıca, açıkça

Belgeler, setIdAttribute kullanarak (DTD vermeden) bu ayarlayabilirsiniz

+0

kullanmıyorsa, kodum çalışır. Kodumun neden sunucuda çalıştığını açıklayabilir misiniz? – undone

+0

Hayır, neden sunucumda (PHP 5.4 ile) hesaplayamıyorum, doctype gerekli değildir. Bulmaya çalışıyorum, çünkü bence ** bir doktrin beyan etmek zorunda değilim. 'LoadHTML 'çağrıldığında sunucumun PHP örneği DTD'yi nereden alıyor? Tahmin? –

+0

sunucum php 5.2 ve başka bir php 5.3 ile test ettim ve tüm çalışmalar !!! – undone

6

: HTML sadece bir fragmanı olduğundan size kimlik kendiniz nitelikleri dikte kalır böylece

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.


, o bir DTD belirtmez. gibi temel bir örnek görünecektir:

doc page üzerine açıklamalarda belirtildiği gibi
$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