web-dev-qa-db-ja.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]:C:\ wamp\www\rabwah\core.phpの40行目の未終了のエンティティ参照_Coke.jpg

エラーは'$row[imag_url]'の行にあります。

37
mega6382

これにより、& < >および"" ''

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

SimpleXMLElementは、実際にはオブジェクトのように動作するシステムリソースです。これにより、ループの操作が難しくなります。したがって、これの代わりに新しい子要素を追加しようとすると:

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

これを行う:

_$product->element = $value;
_

または、htmlspecialchars()を使用して、html文字をエスケープできます。

注:

_mysql_*_は php-5.5 で廃止され、 php-7 で削除されました。したがって、代わりに_mysqli_*_またはPDOを使用してください。
PHPでmysql_ *関数を使用しないのはなぜですか?

38
mega6382

これに対する私の解決策は、特にテキストノードを作成することです。これにより、すべてが適切にエスケープされるようになります。

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

変更してみてください-

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

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

OR

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

[〜#〜] edit [〜#〜]image_urlの周りの引用符をラップしすぎる、礼儀 Barrmar

0
swapnesh

新しく作成されたノードを使用する場合、{0}プロパティにアクセスして値を設定できます。これにより、特殊文字がエスケープされます。

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

古い質問を復活させてすみませんが、これに対する別の解決策があります。次のコードが「未終了のエンティティ参照」エラーを引き起こすと仮定します。

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

@ Joel-Daveyのソリューションは非常にうまく機能します。

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

ただし、何らかの理由で上記のhtmlspecialchars関数を使用したくない場合は、次のこともできます(基本的に、1つのステップを2つのステップに分割します)。

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

どっちが速く実行されるかわからない。私はそれが大きな違いを生むとは思いませんが、これは機能し、言及するべきだと思いました

PS: 個人的なプロジェクト

0
Peter

正しい形式は次のとおりです。

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