2014-04-26 95 views
1

我需要從谷歌可視化API的MySQL數據庫創建dataTable。所以,我這樣做的:我不能從我的代碼得到想要的結果

try { 

    $rez = $db->prepare("SELECT naziv FROM track_aktivnosti WHERE id_akt = :id_akt AND prvi=1 AND user_id=:user_id"); 
    $rez->execute(array(':id_akt' => $_POST['id_akt'], ':user_id' => $user_id)); 

    $kol = $rez->fetchAll(); 
    $rows = array(); 
    $rows1 = array(); 
    $table = array(); 
    $table = array(); 

    $rows[] = array('label' => 'Datum', 'type' => 'string'); 

    foreach ($kol as $r) { 
    $rows[] = array('label' => (string) $r['naziv'], 'type' => 'string'); 
    } 

    $table['cols'] = $rows; 
    // convert data into JSON format 
    $result = $db->prepare("SELECT datum FROM track_aktivnosti 
           WHERE id_akt = :id_akt 
           AND user_id=:user_id 
           GROUP BY datum ORDER BY datum"); 

    $result->execute(array(':id_akt' => $_POST['id_akt'], ':user_id' => $user_id)); 
    $dates = $result->fetchAll(); 
    $final_result = array(); 

    $rows1 = array(); 
    foreach ($dates as $date) { 

    $result = $db->prepare("SELECT vrednost, naziv 
            FROM track_aktivnosti 
            WHERE id_akt = :id_akt 
             AND datum = :datum 
             AND user_id= :user_id"); 

    $result->execute(array(':id_akt' => $_POST['id_akt'], 
     ':datum' => $date['datum'], 
     ':user_id' => $user_id)); 
    $m = array(array('v' => $date['datum'])); 
    foreach ($result as $r) { 
     $m[] = array('v' => (int) $r['vrednost']); 
    } 
    $rows1[] = array('c' => $m); 

    $table['rows'] = $rows1; 
    } 
} catch (PDOException $e) { 
    echo 'ERROR: ' . $e->getMessage(); 
} 
echo json_encode($table); 

所以,一切都很好,但是這個代碼更改的行值......你可以從MySQL數據庫和前端dataTable中看到:這樣的DataTable是:(用於id_akt = 82) enter image description here

和MySQL數據庫是:

enter image description here

所以你可以在數據表中我得到fdfdfd值56,而不是76和類似看看...我怎樣才能解決這個問題?

與JS代碼更新:

function drawTroskovnik() { 
    var cssClassNames = { 
    'headerRow': 'zaglavlje', 
    'tableRow': 'red', 
    'oddTableRow': 'red', 
    'selectedTableRow': 'orange-background large-font', 
    'hoverTableRow': 'prekoreda', 
    'headerCell': 'gold-border', 
    'tableCell': 'cell', 
    'rowNumberCell': 'underline-blue-font' 
    }; 

    // Create and populate the data table. 
    var JSONObject = $.ajax({ 
    url: 'getTroskovnik.php', // make this url point to the data file 
    dataType: 'json', 
    data: {id_akt: ajdi}, 
    async: false, 
    type: 'POST', 
    }).responseText; 

    var data = new google.visualization.DataTable(JSONObject, 0.5); 

    for (var y = 0, maxrows = data.getNumberOfRows(); y < maxrows; y++) { 
    for (var x = 1, maxcols = data.getNumberOfColumns(); x < maxcols; x++) { 
     data.setValue(y, x, '<input vr="' + data.getValue(y, 0) + '" kol="' + data.getColumnLabel(x) + '" class="form-control costRedovi" value="' + data.getValue(y, x) + '">'); 
    } 
    } 
    for (var y = 0, maxrows = data.getNumberOfRows(); y < maxrows; y++) { 
    data.setValue(y, 0, '<input class="span2 form-control" id="pocetak1" size="16" type="text" value="' + data.getValue(y, 0) + '" readonly>'); 
    } 

    data.addColumn('string', ''); 
    for (var y = 0, maxrows = data.getNumberOfRows(); y < maxrows; y++) { 
    var mc = data.getNumberOfColumns() - 1; 
    data.setValue(y, mc, '<div data-toggle="tooltip" data-placement="top" title="Delete this day data"><i class="fa fa-trash-o" ></i></div>'); 
    } 

    var table = new google.visualization.Table(document.getElementById('tpltroskovnik')); 
    new google.visualization.events.addListener(table, 'ready', function() { 
    $(".costRedovi").focusout(function() { 
     var vrednost = $(this).val(); 
     var datum = $(this).attr('vr'); 
     var tabela = $(this).attr('kol'); 
     console.log(datum + " " + tabela + " " + vrednost); 
     $.ajax({ 
     url: "updateCost.php", 
     type: "POST", 
     async: true, 
     data: {ajdi: ajdi, datum: datum, tabela: tabela, vrednost: vrednost}, //your form data to post goes here as a json object 
     dataType: "html", 
     success: function(data) { 
      console.log(data); 
     }, 
     }); 
    }); 
    }); 

    table.draw(data, {'allowHtml': true, cssClassNames: { 
     'headerRow': 'zaglavlje', 
     'tableRow': 'red', 
     'oddTableRow': 'red', 
     'selectedTableRow': 'orange-background large-font', 
     'hoverTableRow': 'prekoreda', 
     'headerCell': 'gold-border', 
     'tableCell': 'cell', 
     'rowNumberCell': 'underline-blue-font'} 
    }); 
}; 
+0

檢查結果數組,然後檢查代碼邏輯 –

+0

代碼邏輯是好的,但我得到不同的結果進入前端... – gmaestro

+1

你可以檢查你的json是否看起來像這樣? '{ 「COLS」:[{ 「標記」: 「基準」, 「類型」: 「串」},{ 「標籤」: 「fdfdfd」, 「類型」: 「串」},{ 「標籤」:「IMT 510-TD 「 」類型「: 」串「}], 」行「:[{ 」C「:[{ 」v「: 」2013年4月1日「},{ 」v「:1},{」 v 「:5}]},{」 C 「:[{」 v 「:」 2014年4月16日 「},{」 v 「:76},{」 v 「:56}]},{」 c」的:[{ 「v」: 「2014年4月22日」},{ 「v」:4},{ 「v」:3}]}]}'。我嘗試重新創建所有內容,獲取該json數據並將這些數據轉儲到Google的DataTable中,並顯示出我認爲是正確的表http://imgur.com/kJUQawv。也許你應該發佈你的JavaScript代碼? – mfirdaus

回答

3

在PHP代碼,您只要是列名和列值之間沒有相關性。因此,列中哪些值取決於數據從數據庫中提取的順序,這可能基於性能或插入順序,並且可能因查詢而異。爲了獲得可預測的訂單,您需要在查詢中指定您想要的訂單。需要對齊的兩個查詢是:拉取名稱的那個,以及拉取值的那個。

缺乏可預測的順序:

$rez = $db->prepare("SELECT naziv FROM track_aktivnosti WHERE id_akt = :id_akt AND prvi=1 AND user_id=:user_id"); 

... 

$result = $db->prepare("SELECT vrednost, naziv FROM track_aktivnosti WHERE id_akt = :id_akt AND datum = :datum AND user_id= :user_id"); 

ORDER BY naziv添加到每一個的最後,以將結果排序爲可預測的對齊,然後將其正確加載到關聯數組中,接着是JSON對象。

這是你的代碼的扭捏版本,清理其他一些非關鍵的問題:

<?php 

try { 

    $res = $db->prepare('SELECT naziv FROM track_aktivnosti WHERE id_akt = :id_akt AND user_id = :user_id AND prvi = 1 ORDER BY naziv'); 
    $res->execute(array(':id_akt' => $_POST['id_akt'], ':user_id' => $user_id)); 
    $kol = $res->fetchAll(); 

    $rows = array(); 
    $table = array(); 

    $rows[] = array('label' => 'Datum', 'type' => 'string'); 

    foreach ($kol as $r) { 
     $rows[] = array('label' => (string) $r['naziv'], 'type' => 'string'); 
    } 

    $table['cols'] = $rows; 

    $res = $db->prepare('SELECT datum FROM track_aktivnosti WHERE id_akt = :id_akt AND user_id = :user_id GROUP BY datum ORDER BY datum'); 
    $res->execute(array(':id_akt' => $_POST['id_akt'], ':user_id' => $user_id)); 
    $dates = $res->fetchAll(); 

    $rows = array(); 

    foreach($dates as $date){ 

     $res = $db->prepare('SELECT vrednost FROM track_aktivnosti WHERE id_akt = :id_akt AND user_id = :user_id AND datum = :datum ORDER BY naziv'); 
     $res->execute(array(':id_akt' => $_POST['id_akt'], ':user_id' => $user_id, ':datum' => $date['datum'])); 
     $vals = $res->fetchAll(); 

     $m = array(array('v' => $date['datum'])); 

     foreach($vals as $r) { 
      $m[] = array('v' => (int) $r['vrednost']); 
     } 
     $rows[] = array('c' => $m); 

     $table['rows'] = $rows; 
    } 

} catch(PDOException $e) { 
    echo 'ERROR: ' . $e->getMessage(); 
} 

echo json_encode($table); 

?> 
+0

這是正確的anser,但爲什麼你使用$ _GET,我使用$ _POST我認爲它更好地使用POST? – gmaestro

+1

我暫時將其更改爲GET以便於進行故障排除(然後我可以使用URL中的必要變量自行加載頁面),並在此處發佈時忘記將其更改回POST。我修好了它。 – bloodyKnuckles

+0

謝謝你的正確答案,非常感謝! – gmaestro

相關問題