добавить несколько данных в XML-файл, используя PHP xmlwriter

Мне нужно добавить статью за каждый месяц вxml файл с использованием PHPxmlwriter:

$sql = "SELECT *,YEAR(FROM_UNIXTIME(timestamp)) AS YEAR, 
                MONTH(FROM_UNIXTIME(timestamp)) AS MONTH 
         FROM ".NEWS_ARTICLES." GROUP BY YEAR, MONTH ORDER BY YEAR DESC, MONTH ";
$newsdata = DataAccess::Fetch($sql);

foreach($newsdata AS $news){
    $writer->openURI('./cache/xmls/posts-'.$news['MONTH'].'-'.$news['YEAR'].'.xml');  
    $writer->startDocument('1.0','UTF-8');  
    $writer->setIndent(4);
    $writer->startElement('urlset');
    $writer->writeAttribute('xmlns', $xmlns);
    $writer->startElement('url');   
    $writer->writeElement('loc',$news['title']);  
    $writer->endElement();  
    $writer->endElement(); 
    $writer->endDocument();   
    $writer->flush();
}

Это сработало для меня и создать.xml файл для каждого месяца, но не добавить все заголовки статей для каждого месяца, и я вижу толькоone заголовок в файле каждого месяца !! Как я могу добавить все статьи за каждый месяц в XML-файлы?

Я думаю, что моя проблема с петлей !!!

результат:posts-5-2015.xml

<url>
  <loc>title</loc>
</url>

В самом деле у меня есть 5 статей, и мне нужно:

результат:posts-5-2015.xml

<url>
  <loc>title</loc>
</url>
<url>
  <loc>title2</loc>
</url>
<url>
  <loc>title3</loc>
</url>
<url>
  <loc>title4</loc>
</url>
<url>
  <loc>title5</loc>
</url>

print_r($newsdata) результат: ПРИМЕЧАНИЕ: это просто для больших БД и только для схемы

Array
(
    [0] => Array
        (
            [id] => 243
            [title] => test2
            [story] => desc2
            [timestamp] => 1442389680
            [update_time] => 1442389522
            [YEAR] => 2015
            [MONTH] => 9
        )

    [1] => Array
        (
            [id] => 242
            [title] => test1
            [story] => desc
            [timestamp] => 1421230680
            [update_time] => 1441026399
            [YEAR] => 2015
            [MONTH] => 1
        )
    [2] => Array
        (
            [id] => 244
            [title] => test3
            [story] => desc3
            [timestamp] => 1421230680
            [update_time] => 1441026399
            [YEAR] => 2015
            [MONTH] => 5
        )
    [3] => Array
        (
            [id] => 245
            [title] => test4
            [story] => desc4
            [timestamp] => 1421230680
            [update_time] => 1441026399
            [YEAR] => 2015
            [MONTH] => 5
        )
    [4] => Array
        (
            [id] => 246
            [title] => test5
            [story] => desc5
            [timestamp] => 1421230680
            [update_time] => 1441026399
            [YEAR] => 2015
            [MONTH] => 5
        )
    [5] => Array
        (
            [id] => 247
            [title] => test6
            [story] => desc6
            [timestamp] => 1421230680
            [update_time] => 1441026399
            [YEAR] => 2015
            [MONTH] => 5
        )
    [6] => Array
        (
            [id] => 248
            [title] => test7
            [story] => desc7
            [timestamp] => 1421230680
            [update_time] => 1441026399
            [YEAR] => 2015
            [MONTH] => 5
        )
)
 J. Zend04 июл. 2016 г., 11:16
Ваш код, сэр, показываяgroup by Month,,, конечно, он покажет вам только 1 заголовок в месяц ..
 NewCod3r05 июл. 2016 г., 13:11
@ J.Zend: я вижу тот же результат: один заголовок для каждого файла
 J. Zend05 июл. 2016 г., 03:31
Вы хотите видеть все названия каждый месяц правильно .... так что удалитеmonth отgroup by код...
 NewCod3r04 июл. 2016 г., 16:47
@ J.Zend: ты можешь сказать мне лучший способ ?!

Ответы на вопрос(2)

Ваша проблема в запросе:

$sql = "SELECT *,YEAR(FROM_UNIXTIME(timestamp)) AS YEAR, 
                MONTH(FROM_UNIXTIME(timestamp)) AS MONTH 
         FROM ".NEWS_ARTICLES." GROUP BY YEAR, MONTH ORDER BY YEAR DESC, MONTH ";  

Большинство баз данных, кроме MySQL, отклонят этот запрос, потому что вы группируете по 2 полям, выбирая много полей.
group by year, month будет отображать только одну (случайную) строку из месяца и скрывать все остальные.

Решение состоит в том, чтобы броситьgroup by пункт полностью и перепишите запрос следующим образом:

$sql = "SELECT *,YEAR(FROM_UNIXTIME(timestamp)) AS YEAR, 
                MONTH(FROM_UNIXTIME(timestamp)) AS MONTH 
         FROM ".NEWS_ARTICLES." ORDER BY YEAR DESC, MONTH ASC";

замечание
Странно, что у тебя нетWHERE пункт. Вы действительно хотите выбратьвсе статьи каждый раз?
Лучшим подходом было бы ограничить количество статей, выбранных в запросе, с помощью некоторого фильтра.
Это всегда быстрее фильтровать в базе данных, чем в php.

документа с корневым и закрытием документаforeach цикл:

$writer->openURI('./cache/xmls/posts-'.$news['MONTH'].'-'.$news['YEAR'].'.xml');
$writer->startDocument('1.0','UTF-8'); 
$writer->setIndent(4); 
$writer->startElement('urlset');

foreach ($newsdata as $news){    
  $writer->startElement('url'); 
  $writer->writeElement('loc',$news['title']); 
  $writer->endElement();
}

$writer->endElement(); 
$writer->endDocument(); 
$writer->flush();

Ваш ответ на вопрос