2012-04-16 71 views
0

我身邊有建議的標題瀏覽並找到了一些答案,但沒有真正的工作,所以我轉交給你......PHP ob_start骨架只工作第一次

我有一個使用ob_start()調用一個函數從其中將內容用作骨架的文件。一旦內容已被檢索,我使用ob_end_clean()

我似乎只是從第一次調用函數獲得輸出,沒有更多的事後。我已經包含了一個代碼轉儲,以防萬一我做錯了什麼。

我還包括從我的數據庫調用返回的內容的示例($dl->select ...) 我也確保數據確實從數據庫傳回,我期待它。

Array 
(
[0] => Array 
    (
     [rev_id] => 7 
     [rev_temp_tree_id] => 2 
     [rev_tree_id] => 
     [rev_status] => 
     [rev_last_updated_by] => 0 
     [rev_authorized_by] => 
     [rev_date_updated] => 1334600174 
     [rev_date_reviewed] => 
     [rev_update_type] => 1 
     [temp_tree_id] => 2 
     [temp_tree_bag_size] => 250 
     [temp_tree_botanical_id] => 
     [temp_tree_stem_size] => 0 
     [temp_tree_crown] => 0 
     [temp_tree_price] => 0 
     [temp_tree_height] => 0 
     [temp_tree_plant_date] => 0 
     [temp_tree_review_id] => 
     [temp_tree_comments] => 
     [temp_tree_marked_move] => 0 
     [temp_tree_initial_location] => 
     [temp_tree_coord] => 
     [temp_tree_name] => TEST 
     [temp_tree_sale_status] => 0 
     [temp_tree_open_ground] => 
     [temp_tree_block] => 0 
     [temp_tree_row] => 0 
    ) 

) 

和代碼...

<?php 

function print_trees($trees){ 
$return = ''; 

ob_start(); 
include_once('skeletons/tree.html'); 
$tree_skeleton= ob_get_contents(); 
ob_end_clean(); 

$search=array("[tree_id]", "[tree_name]", "[Classes]", "[rev_id]");  
foreach($trees as $t){  
    $replace=array($t['temp_tree_id'], $t['temp_tree_name'].' ['.$t['temp_tree_id'].']', 'temp_tree', $t['rev_id']); 
    $return.=str_replace($search,$replace,$tree_skeleton); 
} 
return $return; 
} 

switch ($_GET['mode']){ 
case 'trees' : 
    $db_status = ''; 

    $new_trees = $dl->select('tree_review AS tr LEFT JOIN temp_tree_trees AS tt ON tr.rev_temp_tree_id=tt.temp_tree_id', 'tr.rev_update_type="1"'); 
    echo '<h2>New Trees</h2>'; 
    if($dl->totalrows>0){ 
     echo print_trees($new_trees); 
    } 
    else{ 
     echo 'no new trees for review'; 
    } 
    echo '<br /><br />'; 

    $new_trees = $dl->select('tree_review AS tr LEFT JOIN temp_tree_trees AS tt ON tr.rev_tree_id=tt.temp_tree_id', 'tr.rev_update_type="2"'); 
    echo '<h2>Updated Trees</h2>'; 
    if($dl->totalrows>0){ 
     echo print_trees($new_trees); 
    } 
    else{ 
     echo 'no update trees for review'; 
    } 
    echo '<br /><br />'; 

    $new_trees = $dl->select('tree_review AS tr LEFT JOIN temp_tree_trees AS tt ON tr.rev_tree_id=tt.temp_tree_id', 'tr.rev_update_type="3"'); 
    echo '<h2>Moved Trees</h2>'; 
    if($dl->totalrows>0){ 
     echo print_trees($new_trees); 
    } 
    else{ 
     echo 'no moved trees for review'; 
    } 
    echo '<br /><br />'; 

    $new_trees = $dl->select('tree_review AS tr LEFT JOIN temp_tree_trees AS tt ON tr.rev_tree_id=tt.temp_tree_id', 'tr.rev_update_type="4"'); 
    echo '<h2>Duplicated Trees</h2>'; 
    if($dl->totalrows>0){ 
     echo print_trees($new_trees); 
    } 
    else{ 
     echo 'no duplicated trees for review'; 
    } 

break; 
} 
?> 

任何幫助,將不勝感激。

在此先感謝。

+0

代碼提示:您可以執行'$ tree_skeleton = ob_get_clean();'而不是兩個步驟。 – Ryan 2012-04-16 18:59:56

回答

2

我相信這可能是兩兩件事之一:

你可能有與您代表的是多維數組作爲HTML文件中的字符串,然後試圖操作的事實麻煩用一個字符串替換。將文件表示爲數據結構(XML,JSON)並以這種方式進行解析可能會更好 - 這可以讓您完全跳過輸出緩衝。

或者,我不確定是否$ new_trees是一個對象或其他數組的數組。如果它是一個對象數組,foreach()循環不會正常工作,即它應該是$ t-> temp_tree_id與$ t ['temp_tree_id']

1

感謝您的意見。

我發現問題是什麼,實際上它很愚蠢。我正在使用include_once包含我作爲骨架導入的文件,因此一旦我嘗試再次調用它,它不會讓我。

@minitech我按照你的建議更新了我的代碼,謝謝。

@gadhra骨架文件中的內容是純html和im使用關鍵字將內容從db中的內容替換爲html。我應該附上HTML和我的代碼。

再次感謝:)