如何使用直接显示json数组的PHP文件

时间:2013-04-24 12:48:24

标签: php ajax json

我使用jQuery和AJAX在HTML和PHP之间进行交互。

我放了一个带有GET参数的url,PHP文件打印了一个JSON数组,其中包含我的数据库返回的数据。然后我在我的HTML中显示它。

<?php
   if (isset($_GET["vari"]) && isset($_GET["vari2"])){
      echo json_encode(array("hello", $_GET["vari"], $_GET["vari2"]);
   }
?>

我想要做的是当有人用GET参数打开PHP文件的url然后将重定向到我的HTML文件并在这里​​显示信息,就像我使用jQuery和AJAX一样。但是,很明显,当我打开PHP时,我看到了JSON数组...... 所以我发现了这个:

if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest') {
    // JSON
} else {
    // HTML
}

但如果我想加载index.html文件externaly并显示参数的数据,我该怎么办?因为如果我使用header('index.html')或echo file_get_contents('index.html'),那么我无法发送参数。我解释一下?

我正在寻找最好的方法,你有什么建议吗? 我希望我很清楚,但如果你需要更多信息来帮助我告诉我,我会编辑帖子。

4 个答案:

答案 0 :(得分:4)

您可以检查请求是否通过AJAX完成,如果是,则仅显示JSON响应。

if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest') {
    // JSON
} else {
    // HTML
}

答案 1 :(得分:2)

快速而肮脏的解决方案

“检测AJAX”方法是解决问题的直接实际解决方案。但是,让客户指定它想要接收的内容是更好的。

更灵活但也更复杂且仍然有点脏的解决方案

许多应用程序框架通过检测URL中是否存在.type后缀来实现此目的。例如,http://path/to/data.json将返回JSON,http://path/to/data.html或普通http://path/to/data将返回HTML。但是,要进行此设置,您需要具有特定的URL结构并使用前端控制器脚本或访问Web服务器配置。

要使用PHP实现此功能,我们的想法是,您的网址看起来像/.../data.php/json,而data.php会执行以下操作:

$data = array('Sample' => 'data');

switch (strtolower($_SERVER['PATH_INFO'])) {
    case '/json':
        echo json_encode($data);
        break;
    default:
        print_r($data);
        break;
}

最纯粹但也不太方便且绝对难以实施的解决方案

从技术上讲,正确的方法是让客户端通过HTTP Accept标头指定类型,该标头是为此目的而创建的。这样做的好处是“按书”,但它使得访问此功能变得更加困难(而将.json后缀传递给url是微不足道的。)

以下是使用Accept标题如何执行此操作的简单示例:

$data = array('Sample' => 'data');

if (strpos($_SERVER['HTTP_ACCEPT'], "application/json") === false) {
    print_r($data);
}
else {
    echo json_encode($data);
}

请注意,上面的代码严重不足,因为它没有尝试正确解析标题,这绝对应该。但是,正确确定客户端的首选内容类型并非易事。

答案 2 :(得分:0)

在你的.php页面开始时,你可以这样做。

if($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest')
{
    header('Location: index.html'); // Your HTML page url
}  

希望这对你有用。 :)

Enajoy !!!

答案 3 :(得分:0)

这是我的方法: 我在应用程序环境中创建了一个常量(我把它放在我的前控制器中)用于这种情况,例如:

define('AJAX_CALL', isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');

有了它,现在你可以询问电话的类型

if(AJAX_CALL){
//do stuff
}

此外,您可以定义一个指示是否为ajax的变量,将其添加到发送的数据中。如果你传递一个带有另一个数据的json对象,添加{ajax:true}然后在php文件中:

if($_GET['ajax']){
  //do stuff
}

我希望它很有用。