【问题标题】:JQuery and php-Problem with file_get_contents() after $.ajaxJQuery 和 php-Problem with file_get_contents() after $.ajax
【发布时间】:2011-07-13 00:22:16
【问题描述】:

我想在单击 html 按钮后加载 error.html 文件。因此,我有一个带有按钮和相应点击事件的网站。

$.ajax(
        {
            type: "POST",
            url: "../../../server/check.php",
            data: "login=granted&user=user&site=overview",

            success: function(msg)
            {
                alert(msg); 
            }
        });

在此单击事件中,我使用 $.ajax 调用 check.php 脚本,该脚本应通过 file_get_contents() 加载我的 html 文件。这是复杂的php代码:

<?php $homepage = file_get_contents('../client/manage/login/error.html'); echo $homepage; ?>

现在的问题是 error.html 没有加载,而是将 html 代码返回给 $.ajax 调用。如果我直接在浏览器中输入 check.php 的 url,它就可以工作。

我知道有几种方法可以加载 html 文件,但我需要这样做。实际上,我还想通过这个 php 脚本加载其他几个网站。

有人可以给我一个提示吗?

非常感谢。

编辑:好的,我试着更具体一点。我已经成功实现了一个登录系统。该系统由两个 html 输入字段组成,一个用于用户名,一个用于密码。两者都根据数据库进行检查。如果两者都正确,则允许用户访问一些受保护的 html 站点。

现在我想避免用户可以直接将受保护站点的 url 放入浏览器的地址栏中;因此,我创建了一个 .htaccess 文件,并在 mod_rewrite 的帮助下强制将受保护的 html 站点的每个请求重定向到 check.php。 这是.htaccess:

RewriteEngine On
RewriteBase /simulation/client/manage 
RewriteRule ^([a-zA-Z]+)\.html$ ../../server/check.php?page=$1 [L]

你看,所有受保护的 html 文件都在 /simulation/client/manage 中,这是所有受保护站点所在的路径。如果用户想重定向到其中一个,他会被发送到 check.php他或她想要访问的相应站点。 这是php代码:

if(strcmp($_POST["login"],"granted") == 0)
{
    $_SESSION['user'] = $_POST["user"];
}
else if(strcmp($_POST["logout"],"logout") == 0)
{
    session_unset();
    $_SESSION=array();
}

if(!isset($_SESSION['user']))
{
        $homepage = file_get_contents('../client/manage/login/error.html');
        echo $homepage;
}
else
{
        $homepage = file_get_contents('../client/manage/'.$page.'.html');
        echo $homepage;
}

到目前为止,一切都很好。在这个 check.php 中,我检查是否设置了会话变量。仅当用户成功登录时才设置它们。如果没有,则加载 error.html。 这一切都很好,如果用户在浏览器中键入受保护页面之一的 url 并且未登录,则 file_get_contents 会加载 error.html 页面,否则会加载受保护页面之一。

唯一的问题是,如果我通过 $.ajax 调用脚本,则不会加载任何内容。

【问题讨论】:

  • 您说“将 html 代码返回给 $.ajax 调用”究竟是什么 HTML 代码?
  • 网站的完整代码,包括doctype和网站中声明的所有其他内容。
  • alert(msg) 显示以下内容:ttp://www.w3.org/TR/html4/strict.dtd" rel="nofollow" target="_blank">w3.org/TR/html4/strict.dtd"> 头> 错误
  • 你能让它打印出整个错误吗?尝试从 ajax 调用运行 file_get_contents() 时可能会出现问题。例如:当您从客户端文件夹中的 ajax 调用页面运行它时与直接在浏览器中访问服务器文件夹 php 脚本时不同,可能是您的 URL 路径存在问题。
  • 我尝试使用完整路径: url: "localhost/simulation/server/check.php" 但这会导致相同的结果

标签: php jquery


【解决方案1】:

这是 AJAX 调用的预期行为。您正在请求该 URL 的内容(您的 PHP 脚本)。如果我正确理解您的需求,您可以将返回的 html 插入页面正文:

$.ajax(
        {
            type: "POST",
            url: "../../../server/check.php",
            data: "login=granted&user=user&site=overview",

            success: function(msg)
            {
                $('body').html(msg);//ADDED LINE
            }
        });

【讨论】:

  • 那是不正确的。如果我正确理解您的回答,您是说 ajax 调用会返回 PHP 脚本本身?如果是这样,这是不正确的,它将返回 PHP 脚本的输出。
  • 我也有这个想法,但对我来说这似乎不是一个非常优雅的解决方案。该网站还包含大量元数据,所以这不是很理想。
  • Nocitizen,Jake 是对的,只是返回了 html 页面的代码。
  • 我知道,我并不是说没有返回 HTML 页面的代码,而是说脚本应该运行并显示您的输出,并且它永远不应该显示 PHP 脚本本身。
  • 我不明白你想完成什么。您可以在任何地方插入返回的内容。您可以创建一个模式,将其插入到常规内容顶部附近的新 div 中,然后将其淡出。我们要么需要更多信息,要么您可以发挥创意。
【解决方案2】:

好的,在我看来,这个问题的最佳解决方案是在 php 中使用 read_file() 读取文件并在浏览器中捕获 html 代码。 然后我在ajax成功回调函数中使用了以下三个命令:

$.ajax(
    {
        type: "POST",
        url: "../../../server/check.php",
        data: "login=granted&user=user&site=overview",

        success: function(msg)
        {
           document.open();
       document.write(msg);
       document.close();
        }
    });

此解决方案与 Jake 的解决方案几乎相同,但在这里您可以替换整个文档。 无论如何感谢您的帮助。

【讨论】:

  • 请注意,任何人都可以编辑 Javascript,因此传入 login=granted 并以此方式获得条目。除非您打算更改代码的工作方式,否则这里有一个巨大的安全漏洞。
猜你喜欢
  • 2022-10-25
  • 2022-12-27
  • 2022-12-28
  • 1970-01-01
  • 2022-12-28
  • 1970-01-01
  • 1970-01-01
  • 2022-12-26
  • 2013-01-08
相关资源
最近更新 更多