【问题标题】:How to obtain variable value outside of function to use with OFFSET如何在函数之外获取变量值以与 OFFSET 一起使用
【发布时间】:2020-03-01 23:50:49
【问题描述】:

我尝试在 mySQL 查询中使用 OFFSET 以在用户每次滚动到页面上的某个点时返回新的值行。我想获取原始数据以及当用户在同一个 AJAX 调用中滚动时返回的未来数据,因为到目前为止我一直在做的方式包括两个不同的函数,一个用于获取原始数据加载一个用于获取新数据,这更难维护。例如,如果我要获取 cmets,我会使用两个函数:

function getComments() {

    $.ajax({}); //ajax call to load first five comments

    $(".threads").scroll(function() {

            if ($(this).scrollTop() + $(this).height() >= $(this).prop('scrollHeight') - 1) {

                getMoreComments(); //call function that loads more comments using "OFFSET" in sql query

            }
        });
    }

getComments() 函数和getMoreComments() 之间的唯一区别是 AJAX 调用转到了具有相同代码的不同 PHP 页面,除了 getMoreComments() PHP 页面在 SQL 查询中包含 OFFSET。想要组合这些函数,我尝试在一个 AJAX 函数中使用 OFFSET 并设置一个包含我想要的偏移值的变量,但遇到了一个问题:函数外部的变量没有给我函数内部的值.我的函数,getMyForumLikes(),看起来像这样(为简洁起见):

    var getMyForumLikesOffset = 0;

    function getMyForumLikes() {

        $.ajax({
            url: 'includes/feed/getMyForumLikes.php',
            type: 'POST',
            data: {idUsers: idUsers, offset: getMyForumLikesOffset},
            dataType: 'json',
            success: function(data) {
                data.forEach(function(item) {
                    console.log(item);

                    //do stuff with returned data here

                });

            }
        });

    }

    $(".threads").scroll(function() { //call function again, increasing variable getMyForumLikesOffset to get new returned rows using OFFSET when user scrolls to bottom of div.

        if ($(this).scrollTop() + $(this).height() >= $(this).prop('scrollHeight') - 1) {

            getMyForumLikes();
            getMyForumLikesOffset = getMyForumLikesOffset + 5;

        }

    });

当用户向下滚动到 div 的底部时,我包含了滚动功能以再次运行该功能以获得更多行。 getMyForumLikes.php 页面如下所示(为简洁起见缩短了):

<?php

include '../dbh.inc.php';

$idUsers = mysqli_real_escape_string($conn, $_POST['idUsers']);
$offset = mysqli_real_escape_string($conn, $_POST['offset']);

$q = "SELECT forumvotes.vote_id, forumvotes.idUsers AS voterId, forums.forum_id, forums.forum_title, forums.idUsers AS forumCreatorId, forums.seen, users.uidUsers, profileimages.image FROM forumvotes JOIN forums JOIN users JOIN profileimages ON profileimages.idUsers = users.idUsers AND forumvotes.forum_id = forums.forum_id AND forumvotes.idUsers = users.idUsers WHERE forums.idUsers = '$idUsers' AND forumvotes.idUsers != '$idUsers' ORDER BY forumvotes.vote_id DESC LIMIT 5 OFFSET $offset";
$r = mysqli_query($conn, $q);

//do stuff with returned rows here

发生的问题是在执行 ajax 调用时,我收到一条错误消息,指出未定义 $offset。我相信这是因为变量的范围,因为它在函数之外,我试图在函数内部调用它,所以它不起作用。我的问题是:如何在函数中获取 getMyForumLikesOffset 变量的值以获取我想要的新行?这可能吗,还是我必须使用两个函数来获取新的偏移值?让我知道这是否以任何方式令人困惑。谢谢。

【问题讨论】:

    标签: php jquery sql ajax


    【解决方案1】:

    在 JavaScript 中,您可以使用函数范围之外的变量。

    var a = 4;
    (function () {
      console.log(a); // 4
    }());
    

    真正的问题是 PHP 不理解您的 JSON。要让 PHP 解析您的 JSON,请使用 json_decode

    print_r(json_decode(file_get_contents('php://input')));
    

    【讨论】:

    • 我对此有点困惑 - 当我设置 var a = 4 并使用您编写的 jQuery 函数 ($(function() { console.log(a); });) 调用它时,它会记录“4”。但是,当我创建一个像function nameHere() { console.log(a) } 这样的javascript 函数并使用nameHere() 调用它时,它会记录一个“未定义”的值。你知道这是为什么吗?
    • 我刚刚想通了一些事情。我认为这与我调用函数的位置有关。如果我在编写函数之后调用它,它似乎可以正确记录,但我之前没有。
    • 啊,明白了。虽然请修复$_POST$_POST 用于 application/x-www-form-urlencoded,但我看到您在 dataType 中使用 JSON。如果您使用 JSON,则需要 json_decode
    • 你是说我应该在$idUsers 中使用json_decode 和PHP 页面上的其他变量,像这样吗? $idUsers = mysqli_real_escape_string($conn, json_decode($_POST['idUsers']));
    • 对不起,我弄糊涂了,我当时还以为dataType是请求的Content-Type,但不是,它实际上是服务器响应类型的设置。如果你用contentType 或其他东西发送纯JSON 字符串,你会做json_decode,但这不是你在做什么。继续
    猜你喜欢
    • 2017-04-26
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2022-08-21
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    相关资源
    最近更新 更多