2013-06-10 2 views
20

Hier ist mein Code:ungekündigten Entitätsverweis php

<?php 
// 27/01/2016 Edit: 
$result = mysql_query("A Long mysql query"); 
$rss = new SimpleXMLElement('<rss version="2.0" />'); 
$products = $rss->addChild('products'); 
/// 
while($row = mysql_fetch_array($result)){ 
$product = $products->addChild('category'); 
$product->addChild('product_id',"$row[product_id]"); 
$product->addChild('cat_id',"$row[cat_id]"); 
$product->addChild('cat_name',"$row[cat_name]"); 
$product->addchild('product_code',"$row[product_code]"); 
$product->addchild('product_name',"$row[product_name]"); 
$product->addChild('description','$row[description]'); 
$product->addchild('rating',"$row[rating]"); 
$product->addchild('image_url','$row[imag_url]'); 
$product->addchild('price',"$row[price]"); 
$product->addchild('discount',"$row[discount]"); 
$product->addchild('stock_status',"$row[stock_status]"); 
$product->addchild('stock_quantity',"$row[stock_quantity]"); 
$product->addchild('weight',"$row[weight]"); 
$product->addchild('length',"$row[length]"); 
$product->addchild('width',"$row[width]"); 
$product->addchild('height',"$row[height]"); 
$product->addchild('colour',"$row[colour]"); 
$product->addchild('size',"$row[size]"); 
$product->addchild('material',"$row[material]"); 
$product->addchild('pattern',"$row[pattern]"); 
}; 

Header('Content-type: text/xml'); 
print($rss->asXML()); 
?> 

und hier ist der Fehler:

Warning: SimpleXMLElement::addChild() [simplexmlelement.addchild]: unterminated entity reference _Coke.jpg in C:\wamp\www\rabwah\core.php on line 40

Th Fehler ist mit '$row[imag_url]' in der Leitung.

+3

* obligatorische bin mit: * Die 'mysql_ *' Funktionen werden [in PHP 5.5 veraltet] (http://php.net/manual/en/faq.databases.php#faq.databases.mysql.deprecated). Es wird nicht empfohlen, neuen Code zu schreiben, da dieser in Zukunft entfernt wird. Stattdessen entweder die [MySQLi] (http://php.net/manual/en/book.mysqli.php) oder [PDO] (http://php.net/manual/en/book.pdo.php) und [sei ein besserer PHP Entwickler] (http://jason.pureconcepts.net/2012/08/better-php-developer/). –

+0

''$ row [imag_url]'' sollte '" $ row [imag_url] "' sein. Ändern Sie einfache Anführungszeichen in doppelte Anführungszeichen. Außerdem haben Sie das '/>' in '$ rss-> addChild ('

+0

Weiß nicht ob es hier relevant ist oder nicht aber 'addChild' ist die Methode nicht' addchild' Auch diese Zeile '$ products = $ rss-> addChild (' Orangepill

Antwort

58

Dieses kodiert korrekt die & < > und "" ''

$parent->addChild($name, htmlspecialchars($value)); 
0

Versuchen durch Ändern -

$product->addchild('image_url','$row[imag_url]'); 

Um

$product->addchild('image_url',"$row[\"imag_url\"]"); 

ODER

$product->addchild('image_url',$row['imag_url']); 

EDIT Wrap zitiert zu rund image_url, mit freundlicher Genehmigung Barrmar

36

SimpleXMLElement ist eigentlich eine Systemressource, die sich wie ein Objekt verhält. Was das Arbeiten mit Loops schwierig macht. Also wenn man versucht, neue Kind-Elemente hinzuzufügen statt dessen:

$product->addchild('element', $value); 

dies tun:

$product->element = $value; 

oder Sie htmlspecialchars() verwenden können, html Zeichen zu entkommen.

Hinweis:

mysql_* als von veraltet und als von entfernt. Verwenden Sie stattdessen mysqli_* oder PDO.
Why shouldn't I use mysql_* functions in PHP?

3

Meine Lösung hierfür ist das Erstellen eines Textknotens, der sicherstellt, dass wirklich alles korrekt maskiert wird.

$cell = $dom->createElement('td'); 
$cell->appendChild($dom->createTextNode($value)); 
+2

Dies ist nicht SimpleXMLElement, das ist DOMDocument. – ermannob

+0

@ermannob DOMDocument hat tatsächlich die 'createTextNode' Methode: http://php.net/manual/en/domodocument.createtextnode.php –

0

Die richtige Form ist:

$product->addchild('image_url',htmlspecialchars($row['imag_url'])); 
1

Leider eine alte Frage für die Wiederbelebung, aber es gibt eine andere Lösung für dieses .. Unter der Annahme, der folgende Code die "ungekündigten Entity-Referenz" Fehler verursacht:

$xml->addChild($key,$value); 

@ Joel-Davey-Lösung funktioniert sehr gut:

$xml->addChild($key,htmlspecialchars($value)); 

Aber Sie können die folgenden, wenn aus irgendwelchen Gründen auch tun, Sie wollen nicht auf die oben htmlspecialchars Funktion verwenden (im Grunde, teilen Sie einen Schritt in zwei Stufen):

$xml->addChild($key); 
$xml->$key=$value; 

ich habe keine Ahnung, welche ausgeführt wird schneller; Ich bezweifle es einen großen Unterschied machen würde, aber das funktioniert, und ich dachte, es sollte

PS zu nennen: Ich weiß, es funktioniert, weil ich es auf einem personal project

+0

Absolut! in meinen (sehr einfachen) Tests verwendet der zweite einen ** super-winzigen ** Bit mehr Speicher als der erste, scheint aber ein ** super-winziges ** Bit schneller auszuführen – Peter

+0

@ mega6382: Ich habe einen Link zu einem persönlichen hinzugefügt Projekt, Sie können es in Aktion "in freier Wildbahn" sehen – Peter

Verwandte Themen