Gå til innhold

Finne størrelsen på et resultatsett (dom & php)


Anbefalte innlegg

Jeg står helt fast og det er like før jeg river av mine lange, lyse lokker her.

 

I min add_user-modul skal jeg sjekke om et brukernavn er registrert fra før. Er det skal en feilmelding skrives ut, hvis ikke registreres brukeren.

 

Problemet er at jeg ikke finner ut hva hvordan jeg skal finne størrelsen på nodelisten som spørringen returnerer. Jeg har forsøkt med count, men uansett hva jeg skriver får jeg 1 - aldri noe annet.

 

Eksemplene er med en annen fil, article.xml, ikke brukerfilen min, så det er ikke derfor jeg får feil svar.

$query = 'count(//article[title= "Enda en artikkel"])';

$entries = $xpath->query($query);
var_dump($entries); // skriver ut object(DOMNodeList)#3 (0) { }

 

 

$query = '//article[title= "Enda en artikkel"]';

$entries = $xpath->query($query);
var_dump(count($entries)); // skriver alltid ut 1

 

what to do?

Edit - jeg har også forsøkt denne varianten:

 

$xpath_expr = "//user/username[.='$username']";
	print($xpath_expr);
	var_dump($this->xpath->query($xpath_expr)->length); // skriver alltid ut int(0), selv om sha015 finnes :(

Endret av CruellaDeVille
Lenke til kommentar
Videoannonse
Annonse

Strukturen på xml-filen er slik.

 

<users>
<user userlevel="1" user_id="1">
	<username>sivh</username>
	<password>skiftet_passord</password>
	<firstname>elling</firstname>
	<lastname>elling</lastname>
	<email>elli</email>
</user>
<user userlevel="1" user_id="2">
   ....
</user>
</users>

 

Jeg har løst det på en dum_dum måte, med å sammenligne nodeValue med $brukernavn, men jeg har lyst å lære xpath så derfor baler jeg litt til.

 

Funksjonen for å sammenligne brukernavn -alle mine forsøk er i kommentar:(

 

public function user_exists($username){
	$root = $this->dom->load_document_and_root(USERFILE, 'users');
	//$xpath_expr = "/users/user[username='".$username."']";
	//$xpath_expr = "//user/username[.='$username']";
	//print($xpath_expr);
	//var_dump($this->xpath->query($xpath_expr)->length);
	//die();
	//return $this->xpath->query($xpath_expr) !=0; // den er alltid 1
	$nodelist = $this->dom->getElementsByTagName('user');
	foreach($nodelist as $node){
		if(strcmp($node->getElementsByTagName('username')->item(0)->nodeValue, $username) ==0){
			return true;
		}
	}
	return false;		
}

 

Hvor har jeg tankefeil?

Lenke til kommentar

xml og xsl er litt dårlig dokumentert i PHP etter min mening, men på denne siden her:

http://us2.php.net/manual/en/ref.dom.php

er det en del spennende. Viktig å lese "properties"-tabellene, dvs. tabellene som tilsier hvilke attributer en klasse har.

 

Noen eksempler på bruk:

$doc = new DOMDocument();
$doc->load( 'text.xml' );
$xpath = new DOMXpath( $doc );

$nodes = $xpath->query( '/users/user' );

// antall noder i DOMNodeList
print_r( $nodes->length );

//spesifikk node
$node = $xpath->query( '/users/user[username ="sivh"]' )->item(0);

// antall attributer
print_r( $node->attributes->length );

// har barn
var_dump( $node->hasChildNodes() );

// barna
foreach( $node->childNodes as $subnodes )
{
 print_r($subnodes );
}

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...