2016-07-04 26 views
3

添加多個數據,我需要在xml文件中使用PHP xmlwriter添加文章每個月:在XML文件中使用PHP的XmlWriter

$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 
     ) 
) 
+0

代碼爵士,顯示'組由Month' ,,, ofcourse它會告訴你在一個月內只有1個冠軍。 –

+0

@ J.Zend :你能告訴我更好的辦法嗎?! – NewCod3r

+0

你想看到每個月的所有標題正確....所以從'group by'代碼刪除'月'... –

回答

0

您的問題是在查詢:

$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中過濾總是更快。

0

您正在用每個循環覆蓋您的XML。考慮根開始的文件和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();