2017-01-21 5 views
0

Этот файл должен вывести ряд сцепленных строк вроде следующего:file_get_contents Loop XML Еогеасп не работает

"id number" "name of the fruit" "color of the fruit" 

Но когда я проверить это он просто дает мне пустой экран, если я использую var_dump() эхо из информации. Эта информация поступает из базы данных и собирается в файле с именем fruitxml.php. Это файл, откуда приходит переменная my $contents.

Даже echo $xml ничего не делает. Это должно хотя бы работать. Но это не так. Что я делаю неправильно, что дает мне пустой экран?

<?php 

    $contents = file_get_contents("http://localhost:8888/SSL/Week3/Activity%203-3/fruitxml.php"); 

    $xml = new SimpleXMLElement($contents); 

    echo $xml; 

    foreach($xml->fruits as $fruit) { 
     echo $fruit->fruitid . $fruit->fruitcolor . $fruit->fruitname . '.<br />'; 
    } ?> 

    <pre><?php var_dump($xml) ?></pre> 

Когда я использую var_dump(), как я уже сказал, я получаю всю информацию, но в JSON массивов, а не в строках, как я хотел.

object(SimpleXMLElement)#1 (3) { 
    ["fruitid"]=> 
    array(5) { 
    [0]=> 
    object(SimpleXMLElement)#3 (1) { 
     ["id"]=> 
     string(1) "1" 
    } 
    [1]=> 
    object(SimpleXMLElement)#5 (1) { 
     ["id"]=> 
     string(1) "4" 
    } 
    [2]=> 
    object(SimpleXMLElement)#8 (1) { 
     ["id"]=> 
     string(1) "6" 
    } 
    [3]=> 
    object(SimpleXMLElement)#11 (1) { 
     ["id"]=> 
     string(1) "8" 
    } 
    [4]=> 
    object(SimpleXMLElement)#14 (1) { 
     ["id"]=> 
     string(1) "9" 
    } 
    } 
    ["fruitname"]=> 
    array(5) { 
    [0]=> 
    object(SimpleXMLElement)#2 (1) { 
     ["name"]=> 
     string(6) "Orange" 
    } 
    [1]=> 
    object(SimpleXMLElement)#6 (1) { 
     ["name"]=> 
     string(6) "Grapes" 
    } 
    [2]=> 
    object(SimpleXMLElement)#9 (1) { 
     ["name"]=> 
     string(5) "Apple" 
    } 
    [3]=> 
    object(SimpleXMLElement)#12 (1) { 
     ["name"]=> 
     string(10) "Grapefruit" 
    } 
    [4]=> 
    object(SimpleXMLElement)#15 (1) { 
     ["name"]=> 
     string(4) "Lime" 
    } 
    } 
    ["fruitcolor"]=> 
    array(5) { 
    [0]=> 
    object(SimpleXMLElement)#4 (1) { 
     ["color"]=> 
     string(6) "Orange" 
    } 
    [1]=> 
    object(SimpleXMLElement)#7 (1) { 
     ["color"]=> 
     string(6) "Purple" 
    } 
    [2]=> 
    object(SimpleXMLElement)#10 (1) { 
     ["color"]=> 
     string(3) "Red" 
    } 
    [3]=> 
    object(SimpleXMLElement)#13 (1) { 
     ["color"]=> 
     string(14) "Pinkish Orange" 
    } 
    [4]=> 
    object(SimpleXMLElement)#16 (1) { 
     ["color"]=> 
     string(5) "Green" 
    } 
    } 
} 

И вот файл с XML, который берет информацию из базы данных.

<?php 

$dbh = new PDO("mysql:host=localhost;port=8889;dbname=ssl", "root", "root"); 

$sth = $dbh->prepare('SELECT fruitid, fruitname, fruitcolor FROM fruitapp'); 
$sth->execute(); 
$result = $sth->fetchall(); 

header("Content-type: application/xml"); 
$xmlfile = '<?xml version="1.0" encoding="UTF-8"?>'; 
$xmlfile .= "<fruits>"; 

foreach($result as $user) { 
    $xmlfile .= '<fruitid>'; 
    $xmlfile .= "<id>" . $user['fruitid'] . "</id>"; 
    $xmlfile .= '</fruitid>'; 
    $xmlfile .= '<fruitname>'; 
    $xmlfile .= "<name>" . $user['fruitname'] . "</name>"; 
    $xmlfile .= '</fruitname>'; 
    $xmlfile .= '<fruitcolor>'; 
    $xmlfile .= "<color>" . $user['fruitcolor'] . "</color>"; 
    $xmlfile .= '</fruitcolor>'; 
}; 

$xmlfile .= "</fruits>"; 

echo $xmlfile; 

$dom = new DOMDocument("1.0"); 
$dom->loadXML($xmlfile); 
$dom->save("myfruitxml.xml"); 

?> 
+0

A * пустой экран * означает, что что-то сломано. Добавьте эти строки 'ini_set ('display_errors', 1); error_reporting (E_ALL); 'в самом верху вашего PHP-скрипта и посмотреть, не приведет ли он к какой-либо ошибке или нет. –

+0

Пробовал. Нет ошибок. Просто пустой экран. –

+0

Пожалуйста, покажите нам результат var_dump ($ xml) – NineBerry

ответ

0

Генерирование XML, как это:

function escapeXml($input) 
{ 
    return htmlspecialchars($input, ENT_XML1, 'UTF-8'); 
} 

$xmlfile = '<?xml version="1.0" encoding="UTF-8"?>'; 
$xmlfile .= "<fruits>"; 

foreach($result as $user) { 
    $xmlfile .= '<fruit>'; 
    $xmlfile .= "<id>" . escapeXml($user['fruitid']) . "</id>"; 
    $xmlfile .= "<name>" . escapeXml($user['fruitname']) . "</name>"; 
    $xmlfile .= "<color>" . escapeXml($user['fruitcolor']) . "</color>"; 
    $xmlfile .= '</fruit>'; 
}; 

$xmlfile .= "</fruits>"; 

И выход так:

foreach($xml->fruit as $fruit) { 
    echo $fruit->id . $fruit->color . $fruit->name . '.<br />'; 
} 

Пояснения:

Корневой узел документа представлен самим элементом SimpleXmlElement. Поэтому вам не нужно использовать $xml->fruits. $xml уже представляет узел фруктов.

Для доступа к отдельным фруктам поместите их в узел <fruit>.

Ввод свойств плода в два вложенных узла не требуется. Используйте один узел для каждого свойства.

Используйте htmlspecialchars, чтобы избежать специальных символов, чтобы исключить синтаксические ошибки, например, если имя фрукта будет содержать < или &.

// Код не проверен

+0

Спасибо! Вы первый человек, который это понимает и действительно получил что-то в моем браузере. Кто знал, что мне нужно было сделать, это упростить мой XML. –

+0

Примечание: вместо создания xml в качестве строки лучше использовать библиотеку для этого, как описано здесь http://stackoverflow.com/q/143122/101087 – NineBerry

-1

Это связано с тем, что вы используете file_get_contents, url выглядит подозрительно (из-за используемого порта 8888).

Рассмотрите возможность использования CURL вместо и он должен работать:

<?php 
$curl = curl_init('http://localhost/SSL/Week3/Activity%203-3/fruitxml.php'); 
curl_setopt($curl, CURLOPT_PORT, 8888); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 8888); 
$contents = curl_exec($curl); 

$xml = new SimpleXMLElement($contents); 

echo $xml; 

foreach($xml->fruits as $fruit) { 
    echo $fruit->fruitid . $fruit->fruitcolor . $fruit->fruitname . '.<br />'; 
} ?> 

<pre><?php var_dump($xml) ?></pre> 
+0

Да, мой apache находится на порту 8888. Мой MySQL находится на 8889. Это никогда не было проблемой раньше. Также я использовал то, как вы это сделали, и это пустой экран. –