3

我正在开发我的第一个单页应用程序,但我不确定存储页面数据的最佳方式。

我进行了设置,以便将页面内容保存在我的数据库中,当用户单击其中一个导航链接时,它会对提取页面内容的进程文件进行 ajax 调用,将其格式化为 json 并回显它返回以便 jQuery 可以填充页面。

我遇到的问题是,如果数据库中的任何页面内容包含 PHP,则 PHP 不会被处理甚至显示(但是,如果我查看源代码,我会看到原始 php)。他们是否是解决此问题的更好方法,以便代码运行?

我的 Ajax 调用:

$("nav a").click(function(e) {
    e.preventDefault();
    var page = $(this).attr("href");
    $("nav a").removeClass("menuSelected");
    $(this).addClass("menuSelected");

    form_data = {
        action: "load",
        page: page,
        is_ajax: 1
    }

    $.ajax({
        type: "post",
        url: "process.php",
        dataType: "json",
        data: form_data,
        success: function(data) {
            if(data.success === "true") {
                $("#asideLeft").html(data.aside_left);
                $("#contentMiddle").html(data.content_middle);
                $("#asideRight").html(data.aside_right);
            } else {
                $("#contentMiddle").html("<h1>AJAX Failure</h1>");
            }
        }
    });

当用户单击链接时调用我的 PHP 代码:

if($action == "load") {
    $pms->connect();
    $result = $pms->dbh->prepare("SELECT * FROM pages WHERE name=:name");
    $result->execute(array(':name' => $page));
    $page = $result->fetch(PDO::FETCH_OBJ);
    $data['success'] = "true";
    $data['aside_left'] = $page->aside_left;
    $data['content_middle'] = $page->content_middle;
    $data['aside_right'] = $page->aside_right;
    echo json_encode($data);
}

以及保存在数据库中的 HTML/PHP 示例:

<h1>Content Middle</h1>
<p>Today is <?php echo date("Y-m-d H:i:s"); ?> </p>

感谢您提供的任何帮助或建议。

4

3 回答 3

1

+1 的问题。我同意 php 代码和 html(来自数据库)应该分开。特别是,在服务器端组装 json 数据时,您应该调用您现在存储在数据库中的所有 php 代码。因此,与其在数据库中存储类似:

<p>Today is <?php echo date("Y-m-d H:i:s"); ?> </p>

你可以这样写:

$data['success'] = "true";
$data['aside_left'] = $page->aside_left;
$data['content_middle'] = $page->content_middle;
$data['aside_right'] = "<p>Today is" . date("Y-m-d H:i:s") . "</p>";
echo json_encode($data);

是的,这不像从数据库中检索数据那样干净,但是所有服务器端脚本都应该在服务器端执行。尤其是像这样的问题 - 比如打印今天的日期和类似的问题 - 可以使用 JavaScript 解决,它可以轻松存储在数据库中(例如,您在数据库中存储一个函数,一旦加载到服务器端,返回当前日期)。如果您在数据库中存储如下记录,则可以实现这一点:

"<p><script>(new Date()).toString('dddd, MMMM ,yyyy');</script></p>"

加载后,它将在p标签内显示当前日期。

另一种解决方案,如果 JavaScript 根本不是一个选项,并且您必须使用 PHP,这可以通过对服务器端的另一个请求来实现,如下所示:

.
.
$data['aside_right'] = "<p>Today is:<script> $.ajax({type:'post',url:'processSomeMore.php',dataType:'json',data:form_data,success:function(data) {...}});
</script></p>";
echo json_encode($data);

一旦 JavaScript 代码与从数据库中检索到的其余 html 一起发送到客户端,它将向服务器发出另一个请求,要求通过 ajax 获取更多数据。希望这不会太令人困惑:-)。

于 2012-11-14T01:04:18.743 回答
0

这是因为 php 是一个服务器端脚本局域网,你不能将它解析到客户端,除非它是 js/jquery 脚本,它将通过 ajax 从 php 脚本加载结果。

于 2012-11-14T00:08:59.523 回答
0

好吧,您不能只导出数据库内容;你必须通过eval()。但是在你的例子中这特别难的是eval只处理 PHP 代码;它无法处理您提供的 PHP 和 HTML 的混合。因此,要么您将数据库片段全部设为 PHP(通过 HTML 内容echo-ed 或printed),要么您必须投入时间和精力来了解如何分离这些内容。(后一个问题起初可能看起来像是一个正则表达式,但结果确实很难完全解决)。

但也许您想要查看的不是完整的 PHP 和 HTML 的组合,而是一种模板语言——例如,在交付之前将 Smarty 片段存储在您使用 Smarty 处理的数据库中?(我们已经在我们自己的两个产品中成功使用了这样的数据流——通过 AJAX 的智能输出。)

于 2012-11-14T00:09:08.070 回答