2014-04-26 97 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

相关问题