2013-06-10 32 views
20

Đây là mã của tôi:unterminated tham chiếu thực thể 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()); 
?> 

và đây là lỗi:

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

lỗi Th là trong dòng với '$row[imag_url]'.

+3

* bắt buộc: * Các Các hàm 'mysql_ *' sẽ không được chấp nhận trong PHP 5.5 (http://php.net/manual/en/faq.databases.php#faq.databases.mysql.deprecated). Bạn không nên viết mã mới vì mã sẽ bị xóa trong tương lai. Thay vào đó, cả [MySQLi] (http://php.net/manual/en/book.mysqli.php) hoặc [PDO] (http://php.net/manual/en/book.pdo.php) và [là một nhà phát triển PHP tốt hơn] (http://jason.pureconcepts.net/2012/08/better-php-developer/). –

+0

''$ row [imag_url]'' phải là '" $ row [imag_url] "'. Thay đổi dấu nháy đơn thành dấu ngoặc kép. Ngoài ra bạn đã quên '/>' trong '$ rss-> addChild ('

+0

Không biết liệu nó có liên quan ở đây hay không nhưng 'addChild' là phương thức không phải' addchild' cũng là dòng này '$ products = $ rss-> addChild (' Orangepill

Trả lời

58

này một cách chính xác mã hóa các & < >"" ''

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

Hãy thử bằng cách thay đổi -

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

Để

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

HOẶC

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

EDIT bọc trích image_url quá tròn, lịch sự Barrmar

36

SimpleXMLElement thực sự là một tài nguyên hệ thống hoạt động như một đối tượng. Mà làm cho làm việc với các vòng khó khăn. Vì vậy, khi cố gắng để thêm phần tử con mới thay vì điều này:

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

làm điều này:

$product->element = $value; 

hoặc bạn có thể sử dụng htmlspecialchars(), để thoát khỏi nhân vật html.

Lưu ý:

mysql_* bị phản đối như của và bị xóa do của . Vì vậy, thay vào đó hãy sử dụng mysqli_* hoặc PDO.
Why shouldn't I use mysql_* functions in PHP?

3

Giải pháp của tôi cho điều này là đặc biệt tạo nút văn bản, đảm bảo rằng mọi thứ đều được thoát đúng cách.

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

Đây không phải là SimpleXMLElement, đây là DOMDocument. – ermannob

+0

@ermannob DOMDocument thực sự có phương thức 'createTextNode': http://php.net/manual/en/domdocument.createtextnode.php –

0

Hình thức đúng là:

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

Xin lỗi vì làm sống lại một câu hỏi cũ, nhưng có một giải pháp khác để này .. Giả sử mã sau sẽ khiến cho các "thực thể tham khảo unterminated" lỗi:

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

@ giải pháp Joel-Davey của hoạt động rất tốt:

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

Nhưng bạn cũng có thể làm như sau nếu vì một lý do, bạn không muốn sử dụng hàm htmlspecialchars ở trên (về cơ bản, bạn chia một bước thành hai bước):

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

tôi không biết cái nào sẽ thực thi nhanh hơn; tôi nghi ngờ nó sẽ làm cho nhiều sự khác biệt, nhưng, công trình này, và tôi nghĩ rằng nó nên được đề cập

PS: tôi biết nó hoạt động, vì tôi đang sử dụng nó trên một personal project

+0

Tuyệt đối! trong các bài kiểm tra (rất cơ bản) của tôi, thứ hai sử dụng bộ nhớ ** siêu nhỏ ** ** nhiều hơn lần đầu tiên, nhưng có vẻ như thực hiện ** ** siêu nhỏ ** nhanh hơn – Peter

+0

@ mega6382: tôi đã thêm một liên kết vào một cá nhân dự án, bạn có thể thấy nó trong hành động 'trong tự nhiên' – Peter

Các vấn đề liên quan