【问题标题】:How do you run a SQL select query in real time using AJAX?如何使用 AJAX 实时运行 SQL 选择查询?
【发布时间】:2017-06-18 05:01:37
【问题描述】:

我目前正在为一个学校项目用 PHP 构建一个评论系统,但我偶然发现了一个问题。我希望用户能够发布无需刷新即可插入的评论。我得到了这个工作。我还希望帖子加载所有 cmets,包括用户刚刚发布的那个。

我不知道如何做后者,所以这就是我在这里寻求建议/提示/示例的原因。

这是我现在用来加载当前帖子的所有 cmets 的代码。它正在工作,但我想以某种方式将其替换为具有相同功能但“实时”的 AJAX 代码。

include('dbconnect.php');
$stmt = $db->prepare("
SELECT c.comments_id, c.time, c.comment, c.date, c.posts_id, c.users_id, users.users_id, users.name, users.surname, users.profilepicture 
FROM `comments` as c k
INNER JOIN users ON c.users_id = users.users_id 
WHERE c.posts_id = ".$row["posts_id"]);
$stmt->execute();
$amtResults = $stmt->rowCount();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($results as $row) {
    echo '<div class="row">
            <div class="column column-1">
                 <img style="padding-left:5px;padding-top:5px; height: 30px; width: 30px;" class ="commentuppic" src="/uploads/'.$row["profilepicture"].'" alt="Profile picture">
            </div>
            <div class="column column-9">
               <p id="replytext">   
                   <a href="profilefriend.php?user_id='.$row["users_id"].'">'.$row["name"].' '.$row["surname"].'</a>:<br>
                '.$row["comment"].'
                </p>
            </div>
            <div class="column column-1">
                <form method="post">
                    <button type="submit" style="width: auto;" name="delete_comment" ><span class="fa fa-trash-o"></span></button>
                    <input type="hidden" name="comments_id" value="'.$row["comments_id"].'" />
                </form>
            </div>
        </div>';
}

如果需要,这里是我用于将评论插入数据库的代码:

       $("form[name='submit_comment']").submit(function (e) {
            //do whatever you want to do when submitting comment
            var comment = $('#comment').val();
            var post_id = $('#post_id').val();
            $.ajax({
                url: 'insertmessage.php',
                //async: true,
                //cache: false,
                data: {comment:comment, post_id:post_id},
                type: 'POST',           
            });

        return false;
        });

和insertmessage.php:

if($_POST["comment"]){
    include('dbconnect.php');
    // set the PDO error mode to exception
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // prepare sql and bind parameters
    $stmt = $db->prepare('INSERT INTO comments ( date, time, comment, posts_id, users_id ) VALUES ( :date, :time, :comment, :posts_id, :users_id )');
    $date = date("Y/m/d");
    $time = date("h:i:sa");
    $stmt->bindValue(':date', $date, PDO::PARAM_STR);
    $stmt->bindValue(':time', $time, PDO::PARAM_STR);
    $stmt->bindValue(':comment', $_POST["comment"], PDO::PARAM_STR);
    $stmt->bindValue(':posts_id', $_POST['post_id'], PDO::PARAM_INT);
    $stmt->bindValue(':users_id', $_SESSION['users_id'], PDO::PARAM_INT);
    $stmt->execute();
    $db= null;
    header('Location: profile.php');
}

感谢任何帮助!

编辑:我强烈推荐@David 他的解决方案,因为它运行良好且易于实施!

【问题讨论】:

  • 您应该有一个带有 addComment 端点的 REST api,然后执行添加评论的请求。然后,此请求将返回帖子中所有 cmets 的列表,您可以使用它来填充评论部分
  • 实时数据通常适用于 NoSQL 数据库
  • 您对此的具体问题是什么?你被困在哪里了?
  • @NicoHaase 这是一个老问题,已经解决了!

标签: php jquery sql ajax


【解决方案1】:

评论成功插入数据后,添加到页面即可。这将在$.ajax() 函数中的success 回调中完成:

$.ajax({
    url: 'insertmessage.php',
    data: {comment:comment, post_id:post_id},
    type: 'POST',
    success: function (response) {
        // here you would add it to the page
    }
});

(还有一个 error 回调来处理错误响应,您可能还想研究一下,以便在出现问题时通知用户。)

您已经拥有comment 值,因此除非您需要服务器提供其他信息,否则您可以忽略回调中的response。但是,如果您需要从服务器获取信息,那么您就可以从那里获得它。

(但是请注意,当前您的服务器端并没有向响应写入任何内容。它返回一个重定向,AJAX 请求基本上会忽略该重定向。如果您想返回任何数据,您必须像在任何其他 PHP 页面中一样将其写入响应(尽管最好使用 json_encode() 进行 AJAX 响应)而不是重定向。)

如何在页面上显示评论完全取决于您。这取决于页面的 HTML 以及您要添加评论的位置。但是由于您使用的是 jQuery,它应该很容易。例如,如果您想将评论添加到已知元素,您可以像这样添加:

var existingComments = $('#someElement').text();
$('#someElement).text(existingComments + comment);

这可能太简单了,但希望你能明白。或者您可以将注释包装在一个新元素中并将其附加到某些内容:

$('#someElement').append('<div>' + comment + '</div>');

真的有无数种可能性。但要点是您将在 AJAX 调用的 success 回调中执行此操作。基本上,操作的顺序是:

  1. 将评论发送到服务器
  2. 插入数据库,返回成功
  3. 将评论添加到页面

【讨论】:

  • 嗨,大卫,非常感谢您的回复。我选择不使用这种方法,因为在添加新评论时我需要数据库中的一些变量,(就我而言)这种方式不可行。
  • @Sandertjuhh:这是可行的。您所要做的就是将这些值(最好作为 JSON 对象)从您的 PHP 页面返回到客户端。另一个答案可能会让你克服这一障碍,这很好。但是您可能想研究如何使用 AJAX,以便不必在每次更改任何内容时都简单地重新加载整个页面。 (这本质上是 AJAX 要避免的。)
  • 我进一步研究了它,唯一的问题似乎是我无权访问comment_id。如果您查看我的第一篇文章,您可以看到我在 foreach 中使用了 $row["cmets_id"] 来为删除按钮提供 ID,因此可以删除评论。如果我要附加评论,它还需要这个带有评论 ID 的删除按钮。你知道我将如何解决这个问题,或者解决这个问题的方法吗?
  • @Sandertjuhh:在 PHP 页面中,不要重定向用户(因为 AJAX 无论如何都会忽略这一点),而是将您需要的信息回显到响应中(就像任何 PHP 页面一样)。像echo $comment_id; 这样简单的东西就可以做到(或者任何可以保存该标识符的变量,您可以从数据库中获取该标识符作为最后插入的 ID,如果这是它的来源)。然后该响应将在 AJAX success 回调的参数中。
  • 哦,听起来不错,一件事,我将如何使用 AJAX 成功回调的参数?在我插入数据的 php 文件中,我现在还回显了我需要的数据库中的最新 cmets_id。我试图在互联网上查找它,但找不到任何东西。
【解决方案2】:

对于重载部分使用“成功”功能。 文档:http://api.jquery.com/jquery.ajax/

并使用 .load() 重新加载内容而不刷新页面。 文档:http://api.jquery.com/load/

您的代码将如下所示:

$("form[name='submit_comment']").submit(function (e) {
            //do whatever you want to do when submitting comment
            var comment = $('#comment').val();
            var post_id = $('#post_id').val();
            $.ajax({
                url: 'insertmessage.php',
                //async: true,
                //cache: false,
                data: {comment:comment, post_id:post_id},
                type: 'POST',
                success : function(code_html, statut){ 
                    $('#your_comment_container').load(document.URL +  ' #your_comment_container');
                }
            });

        return false;
        });

【讨论】:

  • 当所有需要的数据都已经在客户端时,似乎没有必要加载整个页面。这将加载 所有 cmets(除了其中一个已显示)以及 页面的其余部分,然后过滤到新的 cmets(已在comment 变量)。
  • 它没有加载所有的内容,只是你需要的容器。我更喜欢知道我的数据库中实际有什么,而不是仅仅模仿它。但这只是我的观点,他需要一个答案我们给了他几个,他选择他想要的。
  • 当新的评论被输入时,你怎么听
  • 我喜欢只“刷新”一个 div 的想法,但我遇到了一个问题。 cmets 是从 SQL 查询中加载的,因此在执行查询后,我将 cmets 加载到 foreach 循环中。每次循环评论时,我都会回显 html 和相应的查询数据。例如,我会有 2 个帖子,每个帖子都有一定数量的 cmets。如果我对第一篇文章发表评论,AJAX 将触发带有 cmets 的容器再次加载。我将如何在 AJAX 的成功函数中选择要加载的容器,因为它们都具有相同的类? @T.J
猜你喜欢
  • 1970-01-01
  • 2017-11-04
  • 1970-01-01
  • 1970-01-01
  • 2015-02-25
  • 2019-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多