web-dev-qa-db-fra.com

Référence d'entité non terminée dans PHP

Voici mon code:

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

et voici l'erreur:

Avertissement: SimpleXMLElement :: addChild () [simplexmlelement.addchild]: référence d'entité non terminée _Coke.jpg dans C:\wamp\www\rabwah\core.php sur la ligne 40

L'erreur est dans la ligne avec '$row[imag_url]'.

37
mega6382

Cela code correctement le & < > et "" ''

$parent->addChild($name, htmlspecialchars($value));
98
Joel Davey

SimpleXMLElement est en fait une ressource système qui se comporte comme un objet. Ce qui rend le travail avec les boucles délicat. Ainsi, lorsque vous essayez d'ajouter de nouveaux éléments enfants au lieu de cela:

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

faites ceci:

$product->element = $value;

ou vous pouvez utiliser htmlspecialchars(), pour échapper les caractères html.

Remarque:

mysql_* Est obsolète depuis php-5.5 et supprimé depuis php-7 . Utilisez plutôt mysqli_* Ou PDO.
Pourquoi ne devrais-je pas utiliser les fonctions mysql_ * en PHP?

38
mega6382

Ma solution est de créer spécifiquement un nœud de texte, ce qui garantit que tout s'échappe correctement:

$cell = $dom->createElement('td');
$cell->appendChild($dom->createTextNode($value));
4
Kavi Siegel

Essayez en changeant -

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

À

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

OR

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

[~ # ~] modifier [~ # ~] envelopper les citations trop rondes image_url, courtoisie Barrmar

0
swapnesh

Si vous utilisez le nouveau nœud créé, vous pouvez définir la valeur en accédant à la propriété {0}. Cela devrait échapper à tout caractère spécial.

$childNode = $parent->addChild($name);
$childNode{0} = $value;
0
Ionut Cioflan

Désolé d'avoir relancé une ancienne question, mais il existe une autre solution à cela .. En supposant que le code suivant provoque l'erreur "référence d'entité non terminée":

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

@ La solution de Joel-Davey fonctionne très bien:

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

Mais vous pouvez également effectuer les opérations suivantes si, pour une raison quelconque, vous ne souhaitez pas utiliser la fonction htmlspecialchars ci-dessus (en gros, vous divisez une étape en deux étapes):

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

je n'ai aucune idée laquelle exécutera plus rapidement; je doute que cela ferait une grande différence, mais cela fonctionne, et je pensais que cela devrait être mentionné

PS: je sais que ça marche parce que je l'utilise sur un projet personnel

0
Peter

La forme correcte est:

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