1

我有一个页面,我正在尝试向它添加一个 ajax 评论系统。当我将 /comment 目录中的所有代码放入根目录时,我的新页面可以实现脚本。但是,如果我创建另一个目录,比如 /books,然后链接到 /comment 目录中的页面,它就不会发布评论。我可以显示它们并访问 javascript 页面,但我不能不发表新评论。是什么导致它失败。我认为它在 javascript 文件中的某个位置...如果您需要查看其他内容,我不想包含这么多代码,请告诉我,我会发布它。我会将 php 文件和 javascript 文件包含在一个目录中,然后放入另一个目录中……任何提示都会很棒。这是我的页面:

<?php

// Error reporting:
error_reporting(E_ALL^E_NOTICE);


include('../comments/connect.php');
include($_SERVER['DOCUMENT_ROOT'] . '/comments/comment.class.php');



/*
/   Select all the comments and populate the $comments array with objects
*/

$comments = array();
$result = mysql_query("SELECT * FROM comments ORDER BY id ASC");

while($row = mysql_fetch_assoc($result))
{
    $comments[] = new Comment($row);
}

?>

<html>
<head>
<link rel="stylesheet" type="text/css" href="../style.css" />
</head>
<body>

<ul id="nav">
    <li class="current"><a href="index.html">Home</a></li>
    <li><a href="#"></a>
        <ul>
            <li><a href="#"></a></li>
</ul>
<div id="container">

    <div id="content">

<?php

/*
/   Output the comments one by one:
*/

foreach($comments as $c){
    echo $c->markup();
}

?>

<div id="addCommentContainer">
    <p>Add a Comment</p>
    <form id="addCommentForm" method="post" action="">
        <div>
            <label for="name">Your Name</label>
            <input type="text" name="name" id="name" />

            <label for="email">Your Email</label>
            <input type="text" name="email" id="email" />

            <label for="url">Website (not required)</label>
            <input type="text" name="url" id="url" />

            <label for="body">Comment Body</label>
            <textarea name="body" id="body" cols="20" rows="5"></textarea>

            <input type="submit" id="submit" value="Submit" />
        </div>
    </form>
</div>
</p>

    </div>
</div>

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript" src="../comments/script.js"></script>
</body>
</html>

和JavaScript ...

$(document).ready(function(){
    /* The following code is executed once the DOM is loaded */

    /* This flag will prevent multiple comment submits: */
    var working = false;

    /* Listening for the submit event of the form: */
    $('#addCommentForm').submit(function(e){

        e.preventDefault();
        if(working) return false;

        working = true;
        $('#submit').val('Working..');
        $('span.error').remove();

        /* Sending the form fileds to submit.php: */
        $.post('submit.php',$(this).serialize(),function(msg){

            working = false;
            $('#submit').val('Submit');

            if(msg.status){

                /* 
                /   If the insert was successful, add the comment
                /   below the last one on the page with a slideDown effect
                /*/

                $(msg.html).hide().insertBefore('#addCommentContainer').slideDown();
                $('#body').val('');
            }
            else {

                /*
                /   If there were errors, loop through the
                /   msg.errors object and display them on the page 
                /*/

                $.each(msg.errors,function(k,v){
                    $('label[for='+k+']').append('<span class="error">'+v+'</span>');
                });
            }
        },'json');

    });

});
4

3 回答 3

3

您通常会将您的评论脚本放在一个不会更改的 URL 上,即 www.domain.com/comments。然后,您可以使用 GET 请求获取页面的评论(通过查询字符串参数指定页面、URL 或其他唯一标识符),然后可以使用 POST 请求发布评论。

这样,您的评论模块与您的应用程序完全分离,如果您需要更改数据库详细信息或文件路径,则无需遍历其中包含的每个脚本。

最简单的是,您可以为评论脚本创建一个如下所示的 PHP 文件:

<?php

header('Content-Type: application/json');

switch (strtolower($_SERVER['REQUEST_METHOD'])) {
    case 'get':
        // return comments for page in JSON format
    break;
    case 'post':
        // post new comment; return result in JSON format
    break;
}

然后在您的 HTML 视图文件中:

<!DOCTYPE html>
<html>
  <body>
    <div id="comments"></div>
    <form action="http://domain.com/comments.php" method="post" id="new-comment">
      <!--rest of your form here-->
    </form>
    <script src="jquery.js"></script>
    <script>
      $(document).ready(function() {
        $.getJSON('http://domain.com/comments.php?page_id=YOUR_PAGE_ID', function(comments) {
          $.each(comments, function(index, comment) {
            // add comment to #comments div
          });
        });

        $('#new-comment').submit(function() {
          $.post('http://domain.com/comments.php', $(this).serialize(), function(response) {
            // act on your form depending is response was success or not
          });
          return false;
        });
      });
    </script>
  </body>
</html>

您也可以将上述内容包装在一个插件中,然后只需将您的评论小部件添加到您的页面中,即$('#comments').nameOfYourCommentsPlugin();.

希望这对您构建有效的解决方案有足够的帮助。

于 2012-04-25T14:21:50.800 回答
3

您似乎正在使用相对路径通过包含连接到您的数据库:

include('../comments/connect.php');

这将是首先要改变的,它可能是这样的:

include($_SERVER['DOCUMENT_ROOT'] . '/comments/connect.php');

通常,查找相对路径并查看是否可以将它们更改为绝对路径,相对于 php 文件的服务器根目录或相对于 javascript 文件的 web 根目录。

于 2012-04-25T14:09:28.603 回答
2

我认为问题出在 javascript 方面,您的帖子转到相对 url,您应该用绝对 url 替换它:

/* Sending the form fileds to submit.php: */
$.post('submit.php',$(this).serialize(),function(msg){//<- replace submit.php with absolute url
...
于 2012-04-25T14:13:25.103 回答