d3通过PHP

时间:2018-03-20 16:53:57

标签: php d3.js

在现有的SO文献中,我见过使用jquery和PHP代理数据的例子:

jquery的

function loadTheUrl(x){      
    $.ajax({ url: 'loader.php',
         data: {url: x},
         type: 'get',
         success: function(output) {
                      $('.loading-space').html(output);
                  }
            });

  } 

PHP

<?php
$doc = new DOMDocument();
$doc->loadHTML(file_get_contents($_GET['https://www.google.com/finance/getprices?q=.NSEI&x=NSE&i=600&p=1d&f=d,o']));
echo $doc->saveHTML();

以上是上面PHP中看到的URL的前几行数据。它只是一个纯文本页面,如下所示:

MARKET_OPEN_MINUTE=570
MARKET_CLOSE_MINUTE=960
INTERVAL=300
COLUMNS=DATE,OPEN
DATA=
TIMEZONE_OFFSET=-240
a1521120900,555.45
1,554.53
2,554.07
3,553.9
4,552.67
...

据我所知,PHP是正确的。对于我的用例,我需要通过d3复制上面的jquery。我希望d3可以用来与我的php文件吐出的数据进行交互。

如果您想知道为什么我会这么长,那是因为我的浏览器不允许我直接通过说d3.text()来运行脚本(即d3.csv()d3.text('https://www.google.com/finance...') et all)臭名昭着的访问控制原始标题错误。所以我的计划是将谷歌回填中的数据镜像到我从服务器上提供的本地php文件中。这样每个人都很开心(或者至少是我)。

当我尝试在我的php文件上调用d3.text()时,我的数据未正确加载。换句话说,我试过:d3.text('my_loader.php')。但是这导致了很多NaN错误,我经常注意到这些错误是某种解析错误的症状。通过我的代码检查,事情似乎很好。我有一元解析,字符串应该转换为数字。事实上,一切都在线下工作。我可以在IDE中直接加载和解析数据。只有当我将d3图表发布到网络上时才意识到我无法解析来自不同来源的数据。这是我添加PHP组件的地方。我的预感是d3实际上是在尝试解析我的PHP页面,而不是PHP指向的URL。我后来通过在控制台中传递data返回的d3.text()确认了这一点,它确实是PHP页面本身。

问题:根据我的跨源数据情况,我可以从d3侧或PHP侧做什么来实现彼此的两个接口是否正确?我想知道d3是否只适用于相同的原始数据,或者是否有一种方法可以使用我不了解的技术(PHP或其他方式)来读取/解析跨源数据。

2 个答案:

答案 0 :(得分:1)

交叉原点适用于所有ajax请求,而不是请求d3.text(&#39; https://www.google.com/finance ...&#39;)为什么不尝试d3.text(&#39; mymethod.php&# 39;)并确保该方法通过标题返回文本文件而不是html:

<?php header('Content-Type: text/plain'); $file = file_get_contents('https://www.google.com/finance/getprices?q=.NSEI&x=NSE&i=600&p=1d&f=d,o'); echo $file;

答案 1 :(得分:1)

您提取的网址在$_GET变量中不存在。

您提交的参数是一个数组:

$_GET = ['url' => 'some_url'];

这意味着:

$_GET['https://www.google.com/finance/getprices?q=.NSEI&x=NSE&i=600&p=1d&f=d,o]

错了(它也错过了字符串末尾的引号)。

应为$_GET['url']

没有验证:

<?php
header('Content-Type: text/plain');
echo file_get_contents($_GET['url']);

但那既不在这里也不在那里。

我认为,问题在于传递的网址。它包含一个问号和多个&符号(?&)。我认为这是bjorking $_GET参数,所以你得到的只是https://www.google.com/finance/getprices?q=.NSEI。您需要将网址包装在encodeURIComponent

var url = encodeURIComponent('https://www.google.com/finance/getprices?q=.NSEI&x=NSE&i=600&p=1d&f=d,o');
d3.text('/path/to/myscript.php?url=' + url);