2012-01-23 43 views
0

有人能幫我嗎。我正在嘗試創建一個xml列表,其中包含按日期排序的所有事件。我通過使用php腳本來做到這一點。現在,我有這樣的:找不到sql語句

$sql = "SELECT DATE_FORMAT(K.kalender_datum,'%W %d %M %Y') as afhaaldag, A.afval_naam 
     FROM tblkalender K 
     INNER JOIN tblafval A 
     ON A.pk_afval_Id = K.fk_afval_Id 
     WHERE kalender_datum > CURDATE() 
     ORDER BY K.kalender_datum"; 
$query = mysql_query($sql); 

$last_date = ""; 
$tag_open = false; 

$xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; 
$xml .= "<kalender>\n"; 

for($i = 0; $i<mysql_num_rows($query); $i++) 
{ 
    $itemrow = mysql_fetch_assoc($query); 

    if($last_date != $itemrow['kalender_datum']) 
    { 
     //als de laatste datum die gebruikt is niet gelijk is aan de datum die hij binnen krijgt, moet hij een nieuwe afhaaldag beginnen 
     if($tag_open) 
     { 
      $xml .= "\t</afhaaldag>\n"; 
      $tag_open = false; 
     } 
     $xml .= "\t<afhaaldag>\n"; 
     $xml .= "\t<datum>" . $itemrow['kalender_datum'] . "</datum>\n"; 
     $xml .= "\t<afval>" . $itemrow['afval_naam'] . "</afval>\n";  
     $last_date = $itemrow['kalender_datum']; 
    } 

    else 
    { 
     $xml .= "\t<afval>" . $itemrow['afval_naam'] . "</afval>\n"; 
     $last_date = $itemrow['kalender_datum']; 
     $tag_open = true; 
    } 
} 
$xml .= "</kalender>"; 
echo $xml; 

這給了我這個輸出XML:

<kalender> 
    <afval>Grofvuil</afval> 
    <afval>Restafval</afval> 
    <afval>GFT</afval> 
    <afval>PMD</afval> 
    <afval>Snoeiresten</afval> 
    <afval>GFT</afval> 
    <afval>Restafval</afval> 
    <afval>GFT</afval> 
    <afval>PMD</afval> 
    <afval>GFT</afval> 
    <afval>Snoeiresten</afval> 
    <afval>Papier en karton</afval> 
    <afval>Grofvuil</afval> 
    <afval>Restafval</afval> 
    <afval>GFT</afval> 
    <afval>PMD</afval> 
</kalender> 

但我需要的是這樣的:

<kalender> 
    <afhaaldag> 
     <datum>2012-01-02</datum> 
     <afval>GFT</afval> 
     <afval>Restafval</afval> 
     <afval>PMD</afval> 
    </afhaaldag> 
    <afhaaldag> 
     <datum>2012-01-17</datum> 
     <afval>Papier en karton</afval> 
    </afhaaldag> 
    <afhaaldag> 
     <datum>2012-01-23</datum> 
     <afval>GFT</afval> 
    </afhaaldag> 
</kalender> 

是否有人知道我該怎麼辦呢。我知道我需要某種循環(我猜測for循環)。有人能幫我解決這個問題嗎?

回答

1

我使用python在這裏,但你可以按照沒有問題的代碼:

kalender = [ 
('2012-01-02', 'GFT'), 
('2012-01-02', 'Restafval'), 
('2012-01-02', 'PMD'), 
('2012-01-17', 'Papier en karton'), 
('2012-01-23', 'GFT') 
] 

last_date = "" 
tag_open = False 

xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" 
xml += "<kalender>\n" 


for i in kalender: 
    # i[0] == datum 
    # i[1] == afval 

    # i == $itemrow in your code 

    datum = i[0] 
    afval = i[1] 

    if last_date != datum: 
     if tag_open: 
      xml += "\t</afhaaldag>\n" 
      tag_open = False 

     xml += "\t<afhaaldag>\n" 
     xml += "\t<datum>" + datum + "</datum>\n" 
     xml += "\t<afval>" + afval + "</afval>\n" 
     last_date = datum 
      tag_open = True 
    else: 
     xml += "\t<afval>" + afval + "</afval>\n" 
     last_date = datum 
     tag_open = True 
xml += "\t</afhaaldag>\n" 
xml += "</kalender>" 
print xml 

這是輸出:

<?xml version="1.0" encoding="UTF-8"?> 
<kalender> 
    <afhaaldag> 
    <datum>2012-01-02</datum> 
    <afval>GFT</afval> 
    <afval>Restafval</afval> 
    <afval>PMD</afval> 
    </afhaaldag> 
    <afhaaldag> 
    <datum>2012-01-17</datum> 
    <afval>Papier en karton</afval> 
    </afhaaldag> 
    <afhaaldag> 
    <datum>2012-01-23</datum> 
    <afval>GFT</afval> 
    </afhaaldag> 
</kalender> 

[完成]

輸出是確切的你正在尋找,是嗎?試着再次檢查,因爲在你的新輸出中,datum標籤不存在,所以這很奇怪。

注意我添加兩個額外的線路:

tag_open = True ##(in the True part of the If Statement) 
xml += "\t</afhaaldag>\n" ###Before ending the kalender tag. 

刪除else子句的if語句。

代碼:http://dl.dropbox.com/u/3389104/kal.py

編輯的-------結束

我的(代碼)評論:

$last_date = ""; 
$tag_open = false; 

for($i = 0; $i<mysql_num_rows($query); $i++) 
{ 
    $itemrow = mysql_fetch_assoc($query); 

    if ($last_date != $itemrow['kalender_datum']) 
    { 
     //New Entry 
     if (tag_open) 
     { 
      $xml .= "\t</afhaaldag>\n"; 
      tag_open = false; 
     } 
     $xml .= "\t<afhaaldag>\n"; 
     $xml .= "\t<datum>" . $itemrow['kalender_datum'] . "</datum>\n"; 
     $xml .= "\t<afval>" . $itemrow['afval_naam'] . "</afval>\n"; 
     $xml .= "\t</afhaaldag>\n"; 

     $last_date = $itemrow['kalender_datum'] 
    } 
    else 
    { 
     if not (tag_open) 
     { 
      $xml .= "\t<afhaaldag>\n"; 
      tag_open = true; 
     } 
     $xml .= "\t<afval>" . $itemrow['afval_naam'] . "</afval>\n"; 
    } 
} 

藉口一些錯別字,我沒有一臺PC與PHP現在。這個代碼是我的一般想法,我不知道它的工作原理。

+0

明天我會試一試(我在使用Filezilla時出現了一些問題,無法連接到服務器)。謝謝! –

+0

好吧,我終於能夠測試它,但我無法弄清楚它有什麼問題。你給我的代碼給出了一個錯誤,標籤未關閉。我設法解決了這個問題,但它並沒有完全實現,因爲它只是做了。現在我得到這樣的: Restafval GFT PMD 修剪殘留 Restafval PMD GFT 修剪殘留 紙和紙板 粗 我將修改我原來的職位,所以你可以看到我的新代碼。 –

+0

請看看我編輯的答案與執行的代碼。嘗試插入更多回聲進行調試。 – Jaxedin

1

那麼,有一件事我要說的是,在查詢結果中沒有「kalender_datum」鍵。您將格式化的日期別名爲afhaaldag。因此,在你的循環,你應該有:

if($last_date != $itemrow['afhaaldag']) 
{ 
    ... 
    $xml .= "\t<datum>" . $itemrow['afhaaldag'] . "</datum>\n"; 
    $xml .= "\t<afval>" . $itemrow['afval_naam'] . "</afval>\n";  
    $last_date = $itemrow['afhaaldag']; 
} 

else 
{ 
    $xml .= "\t<afval>" . $itemrow['afval_naam'] . "</afval>\n"; 
    $last_date = $itemrow['afhaaldag']; 
    $tag_open = true; 
} 

不知道這是什麼是錯的,因爲我還沒有測試的代碼,但它可能是這個問題。

+0

噢,多麼愚蠢的我(*臉紅)我編輯的查詢,但完全忘了(我有我的心中對英語考試)。我明天會試試看,現在我真的需要學習英語。考試時間不到12小時 –

+0

感謝您的注意!我真的忽視了那個:) –