【问题标题】:Can someone figure out why this jQuery is running the else?有人能弄清楚为什么这个 jQuery 正在运行 else 吗?
【发布时间】:2021-10-18 21:46:52
【问题描述】:

大家好,我目前正在与我的 PHP 一起研究 jQuery,并希望有一个加载功能,允许我在按下按钮时加载 2 个新的 cmets。我在网上找到了一个很好的教程,很好地解释了它,我按照它进行操作,但是当按下按钮时,它似乎没有返回任何 cmets。视频已经三年了,所以我怀疑我会从教程的创建者那里得到任何帮助,所以我来到这里:)

文件 test.php 上的 jQuery

 <script>
        $(document).ready(function(){
            var answerCount = 2;
            $("#btn").click(function(){
                answerCount = answerCount + 2;
                $("#answers").load("load_answers.php", {
                    answerNewCount: answerCount
                });
            });
        });
    </script>

文件 test.php 上的 PHP

            <div class="container"> 
                <div id="answers">
                    <?php
                    $sql = "SELECT * FROM tbl_answer LIMIT 2";
                    $result = mysqli_query($conn,$sql);
                    if (mysqli_num_rows($result) > 0){
                        while($row = mysqli_fetch_assoc($result)){
                            echo "<p>";
                            echo $row['answer_text'];
                            echo "<br>";
                            echo $row['user_name'];
                            echo "</p>";
                            if($_SESSION["user"]==$row["user_name"]):?>
                                <form method="post" action="delete_answer.php">
                                <input type="hidden" name="answerid" value="<?= $row['answer_ID'] ?>"/>
                                <input type="submit" name = "submit" value = "Remove"/>
                                </form>
                        <?php endif;?><?php
                        }
                    } else {
                        echo " There are no comments!";
                    }
                    ?>
</div>
<button id="btn"> Show more comments</button>
</div>

文件 load_answers.php 上的 PHP

<?php
    include 'db_login.php';
    $answerNewCount = $_POST['answerNewCount'];

    $sql = "SELECT * FROM tbl_answer LIMIT $answerNewCount";
    $result = mysqli_query($conn,$sql);
    if (mysqli_num_rows($result) > 0){
        while($row = mysqli_fetch_assoc($result)){
            echo "<p>";
            echo $row['answer_text'];
            echo "<br>";
            echo $row['user_name'];
            echo "</p>";
            
            if($_SESSION["user"]==$row["user_name"]):?>
                <form method="post" action="delete_answer.php">
                <input type="hidden" name="answerid" value="<?= $row['answer_ID'] ?>"/>
                <input type="submit" name = "submit" value = "Remove"/>
                </form>
        <?php endif;?><?php

        }
    } else {
        echo " There are no comments!";
    }
    ?>

此代码当前有效,直到我按下按钮。按下按钮后,它会删除所有 cmets 并显示 else "There are no cmets!"。发生这种情况的任何原因?

此图像的限制已更改:

【问题讨论】:

  • 您的tbl_answer 表中有数据吗?
  • 警告:您的代码容易受到 SQL 注入攻击。您应该使用参数化查询和准备好的语句来帮助防止攻击者通过使用恶意输入值来破坏您的数据库。 bobby-tables.com 给出了风险解释,以及如何使用 PHP / mysqli 安全地编写查询的一些示例。 切勿将未经处理的数据直接插入您的 SQL 中。按照您现在编写代码的方式,有人可以轻松窃取、错误更改甚至删除您的数据。
  • phpdelusions.net/mysqli 还包含使用 mysqli 编写安全 SQL 的好例子。另见mysqli documentation 和这个:How can I prevent SQL injection in PHP?。对查询进行参数化还将大大降低由于未转义或错误引用的输入值而导致意外语法错误的风险。
  • I don't see why this would be occurring...我们也不知道。根据您所展示的内容,唯一的结论就是我之前所说的——也许 load_answers 脚本连接到数据库的不同副本。我们看不到您在任何一个脚本中的连接方式。在运行的脚本之间以某种方式删除了那个或行。但这似乎不太可能,除非您还有其他东西可以在之后恢复数据
  • 基本上我觉得你所展示的不是问题的minimal reproducible example

标签: php html jquery


【解决方案1】:

在您的load_answers.php中,您必须更改sql查询中的限制偏移量,当您点击按钮加载load_answers.php页面并且您通过jquery的post方法传递answerNewCount时,这里变量的值是每次点击按钮时增加 2,然后每次 answerNewCount 的值都会改变,所以你必须通过限制偏移量 2 并且你会得到你想要的结果

更改 mysql 查询或替换 load_answers.php 中的此代码

<?php
    include 'db_login.php';
    $answerNewCount = $_POST['answerNewCount'];

    $sql = "SELECT * FROM tbl_answer LIMIT $answerNewCount,2";
    $result = mysqli_query($conn,$sql);
    if (mysqli_num_rows($result) > 0){
        while($row = mysqli_fetch_assoc($result)){
            echo "<p>";
            echo $row['answer_text'];
            echo "<br>";
            echo $row['user_name'];
            echo "</p>";
            
            if($_SESSION["user"]==$row["user_name"]):?>
                <form method="post" action="delete_answer.php">
                <input type="hidden" name="answerid" value="<?= $row['answer_ID'] ?>"/>
                <input type="submit" name = "submit" value = "Remove"/>
                </form>
        <?php endif;?><?php

        }
    } else {
        echo " There are no comments!";
    }
    ?>   

你必须在你的数据库表中输入多条记录,这样你才能看到结果。当光标到达数据库的最后一条记录时,您将收到消息“没有 cmets!” ,如果您想查看结果,则必须引用该页面。

【讨论】:

  • 这会起作用,在此页面之后您必须编写验证,当 $answerNewCount 的值将穿过表记录时,您将收到消息“没有 cmets!”
  • 如果没有对 JS 代码进行匹配更改,这将覆盖页面上显示的任何先前答案,而不是附加到它们。而且它不能解决 OP 声明的问题。
  • 亲爱的,无需更改 JS 代码,没关系,load_answers.php 页面中 SQL 语句所需的修复,例如 $sql = "SELECT * FROM tbl_answer LIMIT $answerNewCount,2";每次命中都会给出 2 个结果
  • On every hit it will give 2 result...但这不是 OP 想要的,也不会解决他们遇到的问题。您似乎误解了这个问题,并且可能还没有阅读任何其他 cmets
  • 它对我来说很好,我已经在我的本地系统中再次测试了上面的代码,因为我理解它解决了“jQuery 和我的 PHP 并希望有一个加载函数允许我按下按钮时加载 2 个新 cmets”并解决“此代码当前有效,直到我按下按钮。按下按钮后,它会删除所有 cmets 并显示 else There are no cmets!”
猜你喜欢
  • 1970-01-01
  • 2013-12-07
  • 2010-09-24
  • 2022-12-28
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多