0

我使用 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 文件并显示参数的数据,我应该怎么做?因为如果我使用 header('index.html') 或 echo file_get_contents('index.html') 那么我无法发送参数。我解释?

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

4

4 回答 4

4

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

if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest') {
    // JSON
} else {
    // HTML
}
于 2013-04-24T12:52:17.620 回答
2

有效的快速而肮脏的解决方案

“检测是否 AJAX”方法将是解决该问题的直接实用解决方案。但是,最好让客户端指定它想要接收什么样的内容。

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

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

要仅使用 PHP 实现这一点,想法是您的 URL 看起来像/.../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;
}

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

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

这是如何使用Accept标头执行此操作的准系统示例:

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

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

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

于 2013-04-24T12:58:11.833 回答
0

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

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

希望这对你有用。:)

喜欢!!!

于 2013-04-24T13:08:57.193 回答
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
}

我希望它是有用的。

于 2013-04-24T13:14:05.117 回答