使用PHP xmlwriter在xml文件中添加多个数据

使用PHP xmlwriter在xml文件中添加多个数据,php,mysql,xml,Php,Mysql,Xml,我需要使用PHPxmlwriter在xml文件中添加每月的文章: $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 = DataAcc

我需要使用PHP
xmlwriter
xml
文件中添加每月的文章:

$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
文件,但没有添加每个月的所有文章标题,我在每个月的文件中只看到一个
标题!!如何在xml文件中添加每个月的所有文章

我想我的问题是循环

结果:
posts-5-2015.xml

<url>
  <loc>title</loc>
</url>
<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)
result:注意:这对于大型数据库来说很简单,并且只适用于模式

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
        )
)

您的问题在查询中:

$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之外的大多数数据库都会拒绝此查询,因为您在选择多个字段的同时,正在对两个字段进行分组。
“按年份、月份分组”将只显示月份中的一行(随机),并隐藏所有其他行

解决方案是完全删除
GROUPBY
子句,并重写查询,如下所示:

$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中过滤更快

您正在用每个循环覆盖XML。考虑启动文件并在“代码”> Oracle < /COD>循环:

以外的根文件和关闭文档
$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();

您的代码,先生,按月显示
,,,当然,它一个月只会显示一个标题…@J.Zend:您能告诉我更好的方法吗?!您希望每个月都能正确查看所有标题……因此,请从
groupby
code..中删除
month
。@J.Zend:我看到了相同的结果:每个文件都有一个标题