2011-03-21 39 views
0

我的情況是,我不能夠寫代碼,請告訴我..我要重新設計的XML結構

我想在XML中1個產品展示 - >第1類 - >許多子類別如果類別改變,然後1產品 - >第二類 - > 2 SubCategories等..產品總是1產品沒有改變..

1產品基於XML。

請幫我...

以下是目前的結構:

<? 
include_once("./inc/config.php"); 
include_once("jsAdminMethods.php"); 
$productID = $_POST['productID']; 

//echo $productID; 

$productQuery = mysql_query("select a.productId, a.productName, a.productAbout, a.productPic, aa.categoryID, aa.categoryName, aa.categoryDiscription, aa.categoryPic, l.subCategoryID, l.subCategoryName, l.subCategoryDescription from category aa, product a, subCategory l where a.productID = aa.productID and l.categoryID = aa.categoryID and a.productID = $productID"); 
$num = mysql_num_rows($productQuery); 

if(!$num == 0){ 
    $_fileName =""; 

    $file= fopen("../xml/{$productID}.xml" , "w"); 


    $_xml ="<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"; 
    $_XML = "<!DOCTYPE Server SYSTEM \"opt/pdos/etc/pdoslrd.dtd\">"; 

    $_xml .="<cmm>"; 


    while ($row = mysql_fetch_array($productQuery, MYSQL_ASSOC)) { 

     $_xml .=" <product>"; 
     $_xml .=" <productID>" . $row['productId'] . "</productID>"; 
     $_xml .=" <productName><![CDATA[" . htmlspecialchars($row['productName'],ENT_QUOTES) . "]]></productName>"; 
     $_xml .=" <productDescription><![CDATA[" . htmlspecialchars($row['productAbout'],ENT_QUOTES) . "]]></productDescription>";  
     $_xml .=" <productPicture><![CDATA[" . htmlspecialchars($row['productPic'],ENT_QUOTES) . "]]></productPicture>"; 
     $_xml .=" <category>"; 
     $_xml .=" <categoryID>" . $row['categoryID'] . "</categoryID>"; 
     $_xml .=" <categoryName><![CDATA[" . htmlspecialchars($row['categoryName'],ENT_QUOTES) . "]]></categoryName>";  
     $_xml .=" <categoryDescription><![CDATA[" . htmlspecialchars($row['categoryDiscription']) . "]]></categoryDescription>"; 
     $_xml .=" <categoryPicture><![CDATA[" . htmlspecialchars($row['categoryPic'],ENT_QUOTES) . "]]></categoryPicture>";    
     $_xml .=" <subCategory>"; 
     $_xml .=" <subCategoryID>" . $row['subCategoryID'] . "</subCategoryID>"; 
     $_xml .=" <subCategoryName><![CDATA[" . htmlspecialchars($row['subCategoryName'],ENT_QUOTES) . "]]></subCategoryName>"; 
     $_xml .=" <subCategoryDetail><![CDATA[" . htmlspecialchars($row['subCategoryDescription'],ENT_QUOTES) . "]]></subCategoryDetail>";     
     $_xml .=" </subCategory>"; 
     $_xml .=" </category>"; 
     $_xml .=" </product>"; 

    } 
    $_xml .="</cmm>"; 
    fwrite($file, $_xml); 
    fclose($file); 


    $value = "product XML Generted Successfully"; 
    $tagproductXML = md5($value); 
    header("location:xmlGenerator.php?tagproductXML=$tagproductXML"); 
} 

else{ 
     echo "No Records found in xml"; 
} 

?> 
+0

您能向我們展示您在此處運行的SQL嗎?表結構也很方便。 – Charles 2011-03-21 18:20:43

+0

編輯問題中的sql – 2011-03-21 19:06:46

回答

1

我不確定我是否完全理解這個問題,但我會採取一定的措施。

我想在1種產品的XML顯示 - > 1類 - >許多子類別,如果類別變化,則1個產品 - >第二類 - > 2級的子類別等產品始終爲1的產品沒有改變..

這聽起來像你說一個產品可能在多個類別。您需要<product>標記內的該產品的類別(及其子類別)的所有

鑑於您的數據集將只包含一個產品,這隻需要對您的循環進行一些小的更改。

$seen_first_row = false; 
while ($row = mysql_fetch_array($productQuery, MYSQL_ASSOC)) { 
    if(!$seen_first_row) { 
     $seen_first_row = true; 
     $_xml .=" <product>"; 
     $_xml .=" <productID>" . $row['productId'] . "</productID>"; 
     $_xml .=" <productName><![CDATA[" . $x($row['productName'],ENT_QUOTES) . "]]></productName>"; 
     $_xml .=" <productDescription><![CDATA[" . $x($row['productAbout'],ENT_QUOTES) . "]]></productDescription>";  
     $_xml .=" <productPicture><![CDATA[" . $x($row['productPic'],ENT_QUOTES) . "]]></productPicture>"; 
    } 
    // Category and Subcategory XML here 
} 
$_xml .=" </product></cmm>"; 

這裏有兩個變化。首先,新變量:$seen_first_row。當您開始從數據庫中獲取結果時,將檢查該變量。如果它是錯誤的,當循環第一次啓動時,會添加開始的<product>標記。該變量然後設置爲true。下一次循環開始時,開始標籤將不會被打印。

第二個變化是關閉</product>標記已從循環中移除並放置在外面。

這些變化的結果是,將只有一個開口<product>標籤,包含產品的詳細信息,而可能有多個<category>標籤,取決於來自數據庫回數據。

另外,除了@Marc B關於(ab)使用PHP 5的優秀提示之外。3封閉,你應該知道一件事:你的代碼包含一個SQL Injection vulnerability。您直接從用戶那裏獲取輸入,並將其傳遞給SQL,但未正確轉義它。由於您使用的是笨重而破舊的「mysql」擴展名,因此您只有一個可行的選項:mysql_real_escape_string。您可能正是如此使用它:

$productQuery = mysql_query(
    "select ... where ... and a.productID = " 
    . mysql_real_escape_string($productID) 
); 

這是至關重要您正確逃避所有用戶提供的數據庫輸入。其他更現代的數據庫適配器可以爲您提供簡單,高級的自動保護。請考慮長期切換到PDOmysqli


回答您關於類別的後續行爲。

首先,您需要將ORDER BY子句添加到您的查詢中,並設置爲在categoryID列中進行排序。

接下來,您需要修改循環。初始化一個新變量來保存最後一行的categoryID。將其設置爲循環外的空值。

在循環內部,在do-we-need-a- <product> -tag檢查後,檢查目前的 categoryID。如果它比過去的categoryID不同,我們需要做兩件事情:

  1. 如果最後的categoryID不null,這意味着我們現在做一個處理一個類別,並應發出</category>關閉標籤。
  2. 如果最後一個categoryID與當前categoryID不同,那麼我們需要打開一個新的<category>標籤並提供我們的詳細信息。

下面的兩個檢查將會出現預期的子類別XML。打印子類別後,*將最後 categoryID設置爲當前 categoryID。

您還需要修改最後一個結束標記,並添加一個</category>

請注意,這組邏輯要求結果集中的所有categoryID不能爲空。如果您獲得空類別,則需要相應地更新close-and-reopen邏輯。 (您可能需要花點時間讓自己重新學習循環和條件邏輯;這很有可能導致您在該領域存在知識空白。通常,這些主題涵蓋在之前的教程和教育材料之前如SQL和XML)

+0

它似乎很好,但1個問題,我有5 .. [N *]類別,每個類別包含10 .. [N *]子類別,這是一個大問題..請指導我,我怎麼寫xml ..感謝提前。 – 2011-03-21 19:47:00

+0

我已經更新了我的答案,並簡要介紹了您還需要允許任意數量的子類別的類別。 – Charles 2011-03-21 20:03:30

+0

我非常感謝你的噓謝謝..但如果你給我的青睞你可以寫代碼,如果你不介意,我sql查詢和表結構在第一篇文章中提到..請請請...假設1個產品 - > 2個類別[[1st category containt 2 subcategory]]和2個類別包含[[3個子類別]] – 2011-03-21 20:36:21

2

文體提示,如果你是在PHP 5.3:

使用here文檔和一個匿名函數保存你自己所有那些可怕的字符串連接:

$x = function($txt) { 
    return(htmlspecialchars($txt)); 
} 

然後

while($row ...) { 
    $_xml .= <<<EOL 
<product> 
    <productID>{$row['productID']}</productID> 
    <productName>{$x($row['productName'])}</productName> 
    etc... 
EOL; 
} 

注意我怎麼樣了更換進行htmlspecialchars()的匿名函數$ x中直接調用,並用它的HEREDOC內逃脫文本字符串的正在建設中。使用這種類型的構造可以避免你必須在字符串連接後進行一行一行的操作,從而避免了在構建的字符串中必須避免引號的負擔,並且使用正確的語法高亮編輯器,遠離比原來更容易閱讀。

+0

我無法理解! ?? ! – 2011-03-21 19:26:22