Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用AJAX实时运行SQL select查询?_Php_Jquery_Sql_Ajax - Fatal编程技术网

Php 如何使用AJAX实时运行SQL select查询?

Php 如何使用AJAX实时运行SQL select查询?,php,jquery,sql,ajax,Php,Jquery,Sql,Ajax,我目前正在为一个学校项目用PHP构建一个评论系统,但我偶然发现了一个问题。我希望用户能够发表评论,插入没有刷新。我让它工作了。我还希望帖子加载所有评论,包括用户刚刚发布的评论 我不知道如何做后者,所以这就是为什么我在这里征求建议/提示/示例 这是我现在用来加载当前帖子所有评论的代码。这是可行的,但我想用一个AJAX代码来替换它,它也可以做到这一点,但是是“实时”的 include('dbconnect.php'); $stmt = $db->prepare(" SELECT c.

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

我不知道如何做后者,所以这就是为什么我在这里征求建议/提示/示例

这是我现在用来加载当前帖子所有评论的代码。这是可行的,但我想用一个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>';
}
以及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他的解决方案,因为它运行良好,易于实现

注释成功插入数据后,只需将其添加到页面中即可。这将在$.ajax函数中的成功回调中完成:

$.ajax({
    url: 'insertmessage.php',
    data: {comment:comment, post_id:post_id},
    type: 'POST',
    success: function (response) {
        // here you would add it to the page
    }
});
还有一个用于处理错误响应的错误回调,您可能还需要研究一下,以便在出现问题时通知用户

您已经有了注释值,因此,除非您需要从服务器获得其他信息,否则您可能可以忽略回调中的响应。但是,如果您需要从服务器获取信息,您就可以从服务器获取信息

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

如何在页面上显示评论实际上取决于您。这取决于页面的HTML以及添加注释的位置。但是因为您使用的是jQuery,所以应该非常简单。例如,如果要将注释添加到已知元素,可以按如下方式添加:

var existingComments = $('#someElement').text();
$('#someElement).text(existingComments + comment);
这可能太简单了,但希望你能理解。或者,您可以将注释包装在新元素中,并将其附加到以下内容:

$('#someElement').append('<div>' + comment + '</div>');
有无数的可能性,真的。但主要的一点是,您可以在AJAX调用的成功回调中执行此操作。基本上,操作顺序是:

将注释发送到服务器 插入数据库,返回成功 将注释添加到页面中
对于重新加载部件,请使用success函数。 文件:

并使用.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;
        });

您应该有一个带有addComment端点的RESTAPI,然后执行添加注释的请求。然后,此请求将返回帖子中所有评论的列表,您可以使用该列表填充评论部分RealTime data通常与NoSQL数据库配合良好您对此有何确切问题?你被困在哪里?@NicoHaase这是个老问题,已经解决了!当所有需要的数据都已经是客户端数据时,似乎没有必要加载整个页面。这将加载除一条之外的所有注释以及页面的其余部分,并向下过滤到注释变量中已有的新注释。它没有加载所有内容,只是加载您需要的容器。我更喜欢了解数据库中的实际内容,而不仅仅是模拟它。但是那只是我的观点,他需要一个答案,我们给了他好几个,他选择他想要的。那么当一个新的评论被输入时,你怎么听呢?我喜欢“刷新”一个div的想法,但是我遇到了一个问题。注释是从SQL查询加载的,因此在执行查询后,我将注释加载到foreach循环中。每次循环一条注释时,我都会回显html和相应的查询数据。例如,我会有2篇文章,每个文章都有一定数量的注释。如果我在第一篇文章中发表评论,AJAX将触发再次加载带有评论的容器。我如何在AJAX的成功函数中选择加载哪个容器,因为它们都具有相同的类@大卫,非常感谢你的回复。我选择不使用这种方法,因为我需要在添加新注释时从数据库中获取一些变量,就我而言,这种方法是不可行的。@Sandertjuhh:这是可行的。您所要做的就是最好将这些值作为JSON对象从PHP页面返回到客户端。另一个答案可能会让你克服这一障碍,这是很好的。但是您可能希望了解如何使用AJAX,以便不必在每次更改任何内容时简单地重新加载整个页面。这基本上就是AJAX要避免的。我进一步研究了它,唯一的问题似乎是我没有访问评论id的权限。如果你看我的第一篇文章,你可以看到我在foreach中使用$row[comments\u id]为删除按钮提供id,因此
评论可以删除。如果我要附加一条注释,它还需要这个带有注释ID的删除按钮。你知道我该如何解决这个问题吗?或者有什么方法来解决这个问题吗?@Sandertjuhh:在PHP页面中,不要重定向用户,因为AJAX忽略了这一点,而是像任何PHP页面一样将所需的信息回显到响应中。像echo$comment\u id这样简单的东西;可以这样做,或者任何保存该标识符的变量,您可以从数据库中获取该标识符作为最后一个插入的ID(如果它是从那里开始的话)。那么这个响应将出现在AJAX成功回调的参数中。哦,听起来很不错,有一件事,我该如何使用AJAX成功回调的参数呢?在我插入数据的php文件中,我现在还回显了我需要的数据库中的最新注释id。我试着在网上查,但什么也找不到。
$("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;
        });