2017-09-13 85 views
1

我不能讓PHP產生JSON數據我已經開發了PHP應用程序(data1.php),它產生從MySQL JSON輸出:與d3.json

PHP

$username = "alitest"; 
$password = "aliden07"; 
$host = "localhost"; 
$database="ali_app"; 

$server = mysqli_connect($host, $username, $password); 
$connection = mysqli_select_db($server,$database); 

$myquery = "select Letter as '\"Letter\"', CAST(Freq as unsigned) as '\"Freq\"' from datajson"; 
$query = mysqli_query($server,$myquery); 

if (! $query) { 
    echo mysqli_error(); 
    die; 
} 

$data = array(); 

for ($x = 0; $x < mysqli_num_rows($query); $x++) { 
    $data[] = mysqli_fetch_assoc($query); 
} 

header('Content-type:application/json;charset=utf-8'); 
echo json_encode($data,JSON_NUMERIC_CHECK);  

mysqli_close($server); 

在HTML文件我想用d3.json命令獲取json數據。我將生成一個帶有返回數據的條形圖。

HTML用js和css

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

<head> 
    <style> 
     .bar{ 
      fill: steelblue; 
     } 

     .bar:hover{ 
      fill: brown; 
     } 

     .axis { 
      font: 10px sans-serif; 
     } 

     .axis path, 
     .axis line { 
      fill: none; 
      stroke: #000; 
      shape-rendering: crispEdges; 
     } 
    </style> 
</head> 
<body> 
    <script src="http://d3js.org/d3.v3.min.js"></script> 
    <script> 
     // set the dimensions of the canvas 
     var margin = {top: 20, right: 20, bottom: 70, left: 40}, 
      width = 600 - margin.left - margin.right, 
      height = 300 - margin.top - margin.bottom; 


     // set the ranges 
     var x = d3.scale.ordinal().rangeRoundBands([0, width], .05); 
     var y = d3.scale.linear().range([height, 0]); 

     // define the axis 
     var xAxis = d3.svg.axis() 
      .scale(x) 
      .orient("bottom") 


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

     // add the SVG element 
     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 + ")"); 

     // load the data 
     d3.json("http://localhost:8081/php/data1.php", function(error, data) { 

      data.forEach(function(d) { 
       d.Letter = d.Letter; 
       d.Freq = +d.Freq; 
      }); 

      // scale the range of the data 
      x.domain(data.map(function(d) { return d.Letter; })); 
      y.domain([0, d3.max(data, function(d) { return d.Freq; })]); 

      // add axis 
      svg.append("g") 
       .attr("class", "x axis") 
       .attr("transform", "translate(0," + height + ")") 
       .call(xAxis) 
       .selectAll("text") 
       .style("text-anchor", "end") 
       .attr("dx", "-.8em") 
       .attr("dy", "-.55em") 
       .attr("transform", "rotate(-90)"); 

      svg.append("g") 
       .attr("class", "y axis") 
       .call(yAxis) 
       .append("text") 
       .attr("transform", "rotate(-90)") 
       .attr("y", 5) 
       .attr("dy", ".71em") 
       .style("text-anchor", "end") 
       .text("Frequency"); 

      // Add bar chart 
      svg.selectAll("bar") 
       .data(data) 
       .enter() 
       .append("rect") 
       .attr("class", "bar") 
       .attr("x", function(d) { 
        return x(d.Letter); 
       }) 
       .attr("width", x.rangeBand()) 
       .attr("y", function(d) { 
        return y(d.Freq); 
       }) 
       .attr("height", function(d) { 
        return height - y(d.Freq); 
       }); 
     }); 

    </script> 
</body> 

我試圖與兩個HTTP服務器上運行的應用程序(servez和NPM安裝HTTP服務器-g)。

對於服務的PHP我已經安裝了wamp服務器。 當我用本地文件更改d3.json命令的輸入時,它可以工作,但是當我給出一個到php文件的鏈接時,我看不到圖表。

// load the data 
d3.json("data1_db_out1.json", function(error, data) { 

    data.forEach(function(d) { 
     d.Letter = d.Letter; 
     d.Freq = +d.Freq; 
    }); 

我在我的桌面上試用它們。

  • HTTP的服務器:localhost:8080
  • WAMP:本地主機8081

任何幫助將不勝感激。

+0

首先,在你的代碼中,我們沒有看到''和''所以你必須在一個非傳統的HTML結構,腳本,HTML標籤和CSS內嵌樣式。 JavaScript是否像這樣運行!? – Meloman

+1

對不起。複製問題。在原始文件和部分存在。 –

+0

因此,在您上次更新之後,我們會看到''''。它需要進入。但不是那麼重要。 也許你需要一個document.ready函數來在執行腳本之前等待頁面加載。 哈耶夫你有什麼是從http:// localhost:8081/php/data1.php? 我用你的代碼做了一個小提琴,但是如果我們沒有訪問你的json結果,就不能工作。 https://jsfiddle.net/veuaotjz/ – Meloman

回答

0

這可能是交叉來源問題。嘗試啓用CORS在您的JSON響應:

header("Access-Control-Allow-Origin: *"); 
+0

我會盡力回覆你。 –

+0

非常感謝。在我的json響應中啓用CORS解決了我的問題。我現在可以看到圖表。 –

+0

@AliAbbasÇiftçi不客氣!並且不要忘記將答案標記爲已接受。 –

0

這是我所得到的,當我WAMP的服務器上運行http://localhost:8081/php/data1.php

[ { 字母: 「A」, 頻率:25 }, { 字母: 「B」, 頻率:12 },{ 信 : 「C」,頻率 :47 },{ 信 「d」, 頻率:34 }, { 字母: 「E」, 頻率:54 }, { 字母: 「F」, 頻率:21 }, { 字母: 「G」, 頻率:57 }, { 字母: 「H」, 頻率:31 }, { 字母: 「I」, 頻率:17 }, { 字母: 「J」, 頻率:5 }, { 字母: 「K」, 頻率:23 }, { 字母: 「L」, 頻率:39 }, { 字母: 「M」, 頻率:29 }, { 字母: 「N」, 頻率:33 }, { 字母: 「O」, 頻率:18 }, { 字母: 「P」, 頻率:35 }, { 萊特R: 「Q」, 頻率:11 }, { 字母: 「R」, 頻率:45 }, { 字母: 「S」, 頻率:43 }, { 字母: 「T」, 頻率:28 }, { 字母: 「U」, 頻率:26 }, { 字母: 「V」, 頻率:30 }, { 字母:「X 「, 頻率:5 }, { 字母: 「Y」, 頻率:4 }, { 信: 「Z」, 頻率:2 } ]

0

而且我已經改變了在Data1查詢字符串。 PHP。當前運行的版本是:

所有的
<?php 
    $username = "alitest"; 
    $password = "aliden07"; 
    $host = "localhost"; 
    $database="ali_app"; 

    $server = mysqli_connect($host, $username, $password); 
    $connection = mysqli_select_db($server,$database); 

    //$myquery = "select Letter as '\"Letter\"', CAST(Freq as unsigned) as '\"Freq\"' from datajson"; 
    $myquery = "select Letter , CAST(Freq as unsigned) as Freq from datajson"; 
    $query = mysqli_query($server,$myquery); 

    if (! $query) { 
     echo mysqli_error(); 
     die; 
    } 

    $data = array(); 

    for ($x = 0; $x < mysqli_num_rows($query); $x++) { 
     $data[] = mysqli_fetch_assoc($query); 
    } 

    //header('Content-type:application/json;charset=utf-8'); 
    header("Access-Control-Allow-Origin: *"); 
    echo json_encode($data,JSON_NUMERIC_CHECK);  

    mysqli_close($server); 
?>