2014-07-16 49 views
-1

我想把數據庫記錄放在多個XML文件,但即時通訊不能做到這一點。基本上我有200行數據庫表中,我必須把它們放在4個不同的每50個xml文件。如果它跨過50行,就應該自動創建一個新的xml文件。 但我不能夠開發for循環邏輯。插入數據庫中的多個XML文件中的記錄在PHP

<?php 

//Create Database connection 
$mysqli = new mysqli('localhost', 'user', 'pass', 'dbname'); 

if (mysqli_connect_errno()) { 
    echo "Connection Failed: " . mysqli_connect_errno(); 
} 
$query = 'select * from tablename'; 

$result = mysqli_query($mysqli, $query); 

//Create SimpleXMLElement object 
$xml = new SimpleXMLElement('<xml/>'); 

//Add each column value a node of the XML object 
while ($row = mysqli_fetch_array($result)) { 
    $counter = 0; 
    if (count($row) % 50) { 
     $mydata = $xml->addChild('mydata'); 


     $mydata->Id = $row['PID']; 
     $fp   = fopen("sitemap$counter.xml", "wb"); 

     //Write the XML nodes 
     fwrite($fp, $xml->asXML()); 
     $xml = new XML(); 
    } else { 
     $counter++; 
    } 
} 

mysqli_close($mysqli); 
//Create the XML file 
//Close the database connection 
fclose($fp); 

現在有200行的數據庫表中,我想使4個不同的XML文件,每行50行。

我不是能夠做到這一點。請幫助

+0

把你的'fwrite'東西內環路和跟蹤已加載了多少條記錄。當你點擊50時,你將xml轉儲到一個文件中,然後啓動一個新文件並將計數器重置爲0. –

+0

內部循環意味着在while循環中嗎?我將只更新我的代碼。請檢查它的正確與否? – user3843585

+0

你有沒有其他的循環,你沒有在你的代碼中顯示? –

回答

0

你有什麼是Traversable的要切成每50個迭代塊。

爲了簡潔,在我的答案中,我將這個更改爲四個結果行,並且我想每個都有兩個迭代,所以說,創建兩個具有兩個條目的文件。

您可以通過編寫是分塊的迭代器的幫助下一個小功能做到這一點很容易一發電機

/** 
* @param Iterator $iterator 
* @param int  $size 
* 
* @return Generator 
*/ 
function ChunkGenerator(Iterator $iterator, $size) { 
    $size = max(0, (int) $size); 
    while ($size-- && $iterator->valid()) { 
     yield $iterator->key() => $iterator->current(); 
     $size && $iterator->next(); 
    } 
} 

這個小功能的形式再次返回Traversale生成器將重複從$iterator迭代$size迭代。

由於您的$resultTraversable的但不是一個迭代,你需要用它的IteratorIterator第一內側。然後你可以對它進行迭代,然後在該塊的迭代中進行迭代。參見例如:

$iterator = new IteratorIterator($result); 

foreach ($iterator as $void) { 
    echo "new chunk:\n"; 
    foreach (ChunkGenerator($iterator, 2) as $row) { 
     echo $row['PID'], "\n"; 
    } 
} 

我通過1000的PID開始示例性輸出然後給出:

new chunk: 
1000 
1001 
new chunk: 
1002 
1003 

正如你可以與層疊foreach看,內環提供了每每個文件中的行。外循環代表文件。它現在很容易把XML輸出邏輯進入這樣一個循環:

foreach ($iterator as $void) { 

    //Create SimpleXMLElement object 
    $xml = new SimpleXMLElement('<xml/>'); 

    foreach (ChunkGenerator($iterator, 2) as $row) { 
     $xml->addChild('row')->Id = $row['PID']; 
    } 

    // output the file 
    $xml->saveXML('php://output'); // place your filename here 
} 

輸出(我使用的示範性標準輸出爲「文件名」,你可以把你的文件名中有),然後是:

<?xml version="1.0"?> 
<xml><row><Id>1000</Id></row><row><Id>1001</Id></row></xml> 
<?xml version="1.0"?> 
<xml><row><Id>1002</Id></row><row><Id>1003</Id></row></xml> 

雖然這個例子有點複雜(你在對方內部有兩個循環),但它仍然很好地代表了你得到的建模:文件和每個文件的行。

您還可以在線演示播放:https://eval.in/173066

相關問題