PHP中未终止的实体引用

Posted

技术标签:

【中文标题】PHP中未终止的实体引用【英文标题】:Unterminated entity reference in PHP 【发布时间】:2013-06-06 07:05:27 【问题描述】:

这是我的代码:

<?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]'一致。

【问题讨论】:

强制:mysql_* 函数将是 deprecated in PHP 5.5。不建议编写新代码,因为它会在未来被删除。相反,MySQLi 或 PDO 和 be a better PHP Developer。 '$row[imag_url]' 应该是 "$row[imag_url]"。将单引号改为双引号。你也忘记了$rss-&gt;addChild('&lt;products');中的/&gt; 不知道这里是否相关,但addChild 是不是addchild 的方法,这行$products = $rss-&gt;addChild('&lt;products'); 似乎是错误的。 @RocketHazmat 和@jason McCreary 和@Orangepill `$rss->addChild('addChild('products') ;但问题仍然存在 【参考方案1】:

这会正确编码&amp; &lt; &gt;"" ''

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

【讨论】:

【参考方案2】:

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

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

这样做:

$product->element = $value;

或者你可以使用htmlspecialchars(),转义html字符。

注意:

mysql_* 自 php-5.5 起已弃用,自 php-7 起已删除。所以改为使用mysqli_*PDO。Why shouldn't I use mysql_* functions in PHP?

【讨论】:

【参考方案3】:

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

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

【讨论】:

这不是 SimpleXMLElement,这是 DOMDocument。 @ermannob DOMDocument 确实有 createTextNode 方法:php.net/manual/en/domdocument.createtextnode.php【参考方案4】:

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

$childNode = $parent->addChild($name);
$childNode0 = $value;

【讨论】:

【参考方案5】:

很抱歉重新提出一个老问题,但还有另一种解决方案。 假设以下代码导致“未终止的实体引用”错误:

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

@Joel-Davey 的解决方案效果很好:

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

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

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

我不知道哪个会执行得更快;我怀疑它会产生很大的不同,但是,这行得通,我认为应该提到它

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

【讨论】:

绝对!在我的(非常基本的)测试中,第二个使用 super-tiny 比第一个更多的内存,但似乎执行 super-tiny 更快 @mega6382:我添加了一个个人项目的链接,你可以在“野外”看到它【参考方案6】:

尝试改变 -

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

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

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

编辑 在 image_url 周围加上引号,礼貌Barrmar

【讨论】:

【参考方案7】:

正确的形式是:

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

【讨论】:

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

引用在 plsql 中未正确终止

sed中未终止的`s'命令[重复]

Xcode 中未终止的条件指令

正则表达式(C#)中未终止的[]集[重复]

由于 iOS 中未捕获的异常,架构 i386 和终止应用程序的未定义符号

在 IOS 中未收到 FCM 推送通知。而应用程序在后台或终止。我使用 FirebaseMessaging 6.0.9 Pub