2016-04-03 10 views
0

Sıcaklık, tarih ve saat bilgilerini gösteren bir grafik üzerinde çalışıyorum. Şimdiye kadar her şey oldukça iyi çalışıyor, ancak MySQL veritabanımdan yeni değerleri almak için sayfamı tamamen yenilemeye ihtiyacım var. Grafiği Yenile düğmesine basmadan güncelleyebilmek istiyorum. Bu kodu verilmiştir:Bir düğmeye basıldığında D3.js'deki bir grafik nasıl güncellenir?

<?php require($_SERVER['DOCUMENT_ROOT'] . '/assets/php/getTemp.php'); ?> 

<!DOCTYPE html> 
<meta charset="utf-8"> 

<head> 
    <title>RPi</title> 
</head> 

<style> 

div.tooltip { 
    position: absolute; 
    text-align: center; 
    width: 120px; 
    height: 28px; 
    padding: 3px; 
    font: 12px sans-serif; 
    background: lightgrey; 
    border: 0px; 
    border-radius: 8px; 
    pointer-events: none; 
} 


body { font: 14px Arial;} 

path { 
    stroke: #FF8C00; 
    stroke-width: 3; 
    fill: none; 
} 

.axis path, 
.axis line { 
    fill: none; 
    stroke: black; 
    stroke-width: 2; 
    shape-rendering: crispEdges; 
} 

.grid .tick { 
    stroke: grey; 
    stroke-opacity: 0.3; 
    shape-rendering: geometricPrecision; 
} 
.grid path { 
      stroke-width: 0; 
} 


</style> 
<body> 


<div id="option"> 
    <input name="updateButton" 
      type="button" 
      value="Update" 
      onclick="updateData()" 
    /> 
</div> 


<!-- load the d3.js library --> 
<script src="http://d3js.org/d3.v3.min.js"></script> 

<script> 


var margin = {top: 30, right: 20, bottom: 30, left: 50}, 
    width = 800 - margin.left - margin.right, 
    height = 270 - margin.top - margin.bottom; 

var parseDate = d3.time.format("%Y-%m-%d %H:%M:%S").parse; 
var formatTime = d3.time.format("%d-%m-%Y %H:%M:%S"); 

var x = d3.time.scale().range([0, width]); 
var y = d3.scale.linear().range([height, 0]); 


var xAxis = d3.svg.axis().scale(x) 
    .orient("bottom"); 

var yAxis = d3.svg.axis().scale(y) 
    .orient("left").ticks(5); 

var valueline = d3.svg.line() 
    .interpolate("basis") 
    .x(function(d) { return x(d.datetime); }) 
    .y(function(d) { return y(d.temperature); }); 

var div = d3.select("body").append("div") 
    .attr("class", "tooltip") 
    .style("opacity", 0); 

var svg = d3.select("body") 
    .append("svg") 
     .attr("width", width + margin.left + margin.right) 
     .attr("height", height + margin.top + margin.bottom) 
    .append("g") 
     .attr("transform", 
       "translate(" + margin.left + "," + margin.top + ")"); 

function make_x_axis() { 
    return d3.svg.axis() 
     .scale(x) 
     .orient("bottom") 
     .ticks(5) 
} 

function make_y_axis() { 
    return d3.svg.axis() 
     .scale(y) 
     .orient("left") 
     .ticks(5) 
} 

<?php echo "data=".$json_data.";" ?> 
data.forEach(function(d) { 
d.datetime = parseDate(d.datetime); 
d.temperature = +d.temperature; 
}); 

x.domain(d3.extent(data, function(d) { return d.datetime; })); 
y.domain([0, d3.max(data, function(d) { return d.temperature; })]); 


svg.append("path") 
.attr("class", "line") 
.attr("d", valueline(data)); 


svg.selectAll("dot") 
    .data(data) 
.enter().append("circle") 
    .attr("r", 4) 
    .attr("cx", function(d) { return x(d.datetime); }) 
    .attr("cy", function(d) { return y(d.temperature); }) 
    .on("mouseover", function(d) { 
     div.transition() 
      .duration(200) 
      .style("opacity", 1); 
     div.html(formatTime(d.datetime) + "<br/>" + d.temperature + " &#8451") 
      .style("left", (d3.event.pageX + 16) + "px") 
      .style("top", (d3.event.pageY + 16) + "px") 
     .style("position", "absolute"); 
     }) 
    .on("mouseout", function(d) { 
     div.transition() 
      .duration(50) 
      .style("opacity", 0); 
}); 

svg.append("g") 
    .attr("class", "grid") 
    .attr("transform", "translate(0," + height + ")") 
    .call(make_x_axis() 
     .tickSize(-height, 0, 0) 
     .tickFormat("") 
) 

svg.append("g") 
    .attr("class", "grid") 
    .call(make_y_axis() 
     .tickSize(-width, 0, 0) 
     .tickFormat("") 
) 

svg.append("g") 
.attr("class", "x axis") 
.attr("transform", "translate(0," + height + ")") 
.call(xAxis); 

svg.append("g") 
.attr("class", "y axis") 
.call(yAxis); 


</script> 
</body> 

Bunu yapmaya çalıştım:

function updateData() { 

//d3.json("/assets/php/getTemp.php", function(error, data) { 
     <?php echo "data=".$json_data.";" ?> 
     data.forEach(function(d) { 
     d3.select("body").selectAll("svg") 
     d.datetime = parseDate(d.datetime); 
     d.temperature = +d.temperature; 
}); 

x.domain(d3.extent(data, function(d) { return d.datetime; })); 
y.domain([0, d3.max(data, function(d) { return d.temperature; })]); 

var svg = d3.select("body").transition(); 

    svg.select(".line") 
     .duration(750) 
     .attr("d", valueline(data)); 
    svg.select(".x.axis") 
     .duration(750) 
     .call(xAxis); 
    svg.select(".y.axis") 
     .duration(750) 
     .call(yAxis); 
}; 

ama hiçbir şey olmuyor, hatta bir hata. yapmam gereken şey

<?php 
$hostname = 'localhost'; 
$username = 'root'; 
$password = 'admin'; 

try { 
    $dbh = new PDO("mysql:host=$hostname;dbname=temp_database", 
           $username, $password); 


    $sth = $dbh->prepare(" 
     SELECT `datetime`, `temperature` FROM `tempLog` 
    "); 
    $sth->execute(); 


    $result = $sth->fetchAll(PDO::FETCH_ASSOC); 


    $dbh = null; 

} 
catch(PDOException $e) 
    { 
     echo $e->getMessage(); 
    } 

$json_data = json_encode($result); 
?> 

: bu sıcaklıklar ve zaman formu MySQL almak için kullanılan PHP kodu Önemli olan ise

?

+0

Bana uygun görünüyor. Bunu, kullandığınız veri türünün bir örneği ile bir jsfiddle'a yapıştırabilir misiniz? – BHouwens

+0

Tabii ki: https://jsfiddle.net/zzmoL7Le/4/ Umarım link tamamdır. –

+0

Sorun, "updateData" işlevindeki verilerde gerçekleştirdiğiniz biçimlendirmedir. Kodun çalıştığı bölümün yorumunu yaparsanız – BHouwens

cevap

0

d3.json işlevini kullanarak uygulamaya bakın. Bu, tüm sayfayı sıfırdan yeniden yüklemeden php komut dosyalarından json almanızı sağlar. Bu AJAX şeyler, ama d3 yardımcı işlevleri detayları gizler.

https://github.com/mbostock/d3/wiki/Requests

PS. Olduğunu onaylamak için yeterli bilgi var olmasa da, şu anda benim önsezi * çalışmıyor Neden olarak JSON output from PHP using d3.json


: bir asenkron çağrı olabilir, bu yüzden de burada kabul cevabı göreceksiniz unutmayın hep aynı veri çünkü hiçbir değişiklik olduğunu, böylece hiçbir şey updateData yılında

<?php echo "data=".$json_data.";" ?> 

bu çizgi ^^^ başında bir kez değerlendirilir ve sonra tüm fonksiyon javascript aleme plonked değişecektir. Bununla birlikte, daha önce oluşturduğunuz javascript değişkeni (data={some_json}), updateData numaralı telefonu arayarak, çoğu kez sunucu tarafı değişkenini oluşturan bu veritabanı ile ilgili php'i çağırsanız bile, updateData'u oluşturan php sayfasını yeniden yüklemeden değişmeyecektir.

* saçma olabilir, ancak çizginin üstündeki bit hala doğrudur

İlgili konular