【问题标题】:I cannot get desired result from my code我无法从我的代码中得到想要的结果
【发布时间】:2014-06-12 06:26:03
【问题描述】:

我需要使用 google 可视化 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)

而mysql数据库是:

所以你可以在数据表中看到我得到的 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'}
  });
};

【问题讨论】:

  • 检查结果数组,然后检查代码逻辑
  • 代码逻辑没问题,但我在前端得到不同的结果...
  • 你能检查一下你的json是不是这样吗? {"cols":[{"label":"Datum","type":"string"},{"label":"fdfdfd","type":"string"},{"label":"IMT 510-td","type":"string"}],"rows":[{"c":[{"v":"2013-04-01"},{"v":1},{"v":5}]},{"c":[{"v":"2014-04-16"},{"v":76},{"v":56}]},{"c":[{"v":"2014-04-22"},{"v":4},{"v":3}]}]}。我尝试重新创建所有内容,获取该 json 数据并将这些数据转储到 Google 的 DataTable 中,它显示了我认为正确的表 imgur.com/kJUQawv 。也许你应该发布你的 JavaScript 代码?
  • 我用 JS 代码更新问题
  • 请用描述性的标题重命名,例如“使用谷歌可视化api从mysql数据库创建dataTable”这样会更好地吸引那些可以提供帮助的人。

标签: php mysql sql datatable


【解决方案1】:

在您提供的 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);

?>

【讨论】:

  • 那是正确的分析器,但为什么你使用 $_GET,我使用 $_POST 我认为使用 POST 更好?
  • 我暂时将其更改为 GET 以便于排除故障(然后我可以使用 URL 中的必要变量自行加载页面),并在此处发布时忘记将其更改回 POST。我修好了。
  • 这是否容易受到 sql 注入的影响?
  • 不,检查一下:php.net/manual/en/pdo.prepared-statements.php“准备好的语句的参数不需要引用;驱动程序会自动处理这个。”甜!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-09-29
  • 2013-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-09
  • 2013-03-12
相关资源
最近更新 更多