PHP中未终止的实体引用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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());
?>

这是错误:

警告:SimpleXMLElement :: addChild()[simplexmlelement.addchild]:第40行的C: wamp www rabwah core.php中未终止的实体引用_Coke.jpg

该错误与'$row[imag_url]'一致。

答案

这正确地编码了& < >"" ''

$parent->addChild($name, htmlspecialchars($value));
另一答案

SimpleXMLElement实际上是一个行为类似于对象的系统资源。这使得使用循环变得棘手。因此,当尝试添加新的子元素而不是:

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

做这个:

$product->element = $value;

或者您可以使用htmlspecialchars()来逃避HTML字符。

注意:

mysql_*开始被弃用,并且从开始被删除。所以改为使用mysqli_*PDOWhy shouldn't I use mysql_* functions in PHP?

另一答案

我的解决方案是专门创建一个文本节点,确保所有内容都正确转义:

$cell = $dom->createElement('td');
$cell->appendChild($dom->createTextNode($value));
另一答案

尝试改变 -

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

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

要么

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

编辑报价太圆了image_url,礼貌Barrmar

另一答案

正确的形式是:

$product->addchild('image_url',htmlspecialchars($row['imag_url']));
另一答案

很抱歉恢复旧的问题,但还有另一个解决方案..假设以下代码导致“未终止的实体引用”错误:

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

@ Joel-Davey的解决方案非常有效:

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

但是,如果由于某种原因,您不想使用上述htmlspecialchars函数(基本上,您将一步拆分为两步),您也可以执行以下操作:

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

我不知道哪一个会执行得更快;我怀疑它会有多大的不同,但是,这是有效的,我认为应该提到它

PS:我知道它有效,因为我在personal project上使用它

另一答案

如果使用新创建的节点,则可以通过访问{0}属性来设置该值。这应该逃避任何特殊字符。

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

以上是关于PHP中未终止的实体引用的主要内容,如果未能解决你的问题,请参考以下文章

引用在 plsql 中未正确终止

getSupportFragmentManager() 在活动扩展片段中未定义

片段中未调用 onSaveInstanceState

片段android中未调用onActivityResult [重复]

php 用于预先填充实体引用字段的丑陋代码

片段着色器中未使用纹理数据 - OpenGL