PHP$_GET和$_POST返回空数组,试图对SQL数据进行分页


PHP $_GET and $_POST are returning empty arrays--trying to paginate SQL data

我已经设置了以下内容:

  1. 数据库类($db)
  2. 分页类($paginator)

我正在尝试编写一个基本系统来管理页面。我有一个页面"page_manager.php",其中包括我的数据库类(database.php)和分页类(paginate.php)

在我的分页类中,我有一个函数,它会回显我的SQL数据。我已经想出了一种方法来回显HTML<select>元素,该元素具有必要的ID,这允许我基于<选择>元素。因此,"1"将回应数据库中的前10个结果,"2"将回应11-20,"3"将回应21-30,等等

我已将onChange事件添加到<select>元素,该元素将其值(使用"this.value")复制到隐藏的表单字段。然后,我使用document.getElementById().submit()提交此表单;

然后将$_GET变量添加到URL中,使URL变为"…/?pagenumber_form=X"。但是,当我试图从URL中获取此值时,$_GET['pagenumber_form']为空。

部分代码:

<span style='font-family: tahoma; font-size: 10pt;'>Page #</span>
    <select id="page_number_selection" 
    onchange='javascript: document.getElementById("pagenumber_form").value = this.value;
                          document.getElementById("pagenumber").submit();'>
    <?php
        for($i = 1; $i <= $this->num_pages; $i++)
            echo"<option id='" . $i . "'>" . $i . "</option>";      
    ?>
    </select>
<form name="pagenumber" id="pagenumber" action="" method="get">
    <input type="text" name="pagenumber_form" id="pagenumber_form" />
</form>

所以,我也尝试过使用$_POST,但同样的事情也发生了。我想使用$_GET,原因有两个:更容易看到我的值发生了什么,而且我使用的数据不需要安全。

概括一下:当我更改<select>元素,相应的值会添加到URL中,如:"…/?pagenumber_form=X",但当我尝试在PHP中使用该值时,例如。。。

$page_number = $_GET['pagenumber_form'];

我得到一个NULL值。:-(

有人能帮我吗?非常感谢。

编辑

我刚刚发现。如果我将print_r($_GET)移动到主索引页,那么超全局变量将按预期返回。我的网站结构是这样的:

index.php-JavaScript按钮使用AJAX HTTP请求将"responseText"作为我的main<div>。"responseText"是页面本身的内容,在本例中为page_manager.php,它又包括pagination.php。

换句话说,我的网站是用PHP includes构建的,它似乎与HTTP超全局不兼容。

你知道我该怎么解决这个问题吗?谢谢:-)。

+------------------------------------------------------------------+

我不能回答我自己的帖子,所以:

这个问题没有解决,但已经解决了。

关于PHP,我当然不是很了解,但我的印象是,使用AJAX请求在文档中包含一个PHP文件,而文档本身也包含其他PHP文件,这不是一个好主意。我相信,这个问题是因为PHP是在文档加载到浏览器之前执行的。因此,在文档中动态地包含PHP文件将导致所述文件的不正确工作,因为PHP必须在页面呈现之前而不是之后由服务器执行。

因此,我已经停止在我的网站上使用AJAX,而只是使用好的旧PHP。我知道的还不足以继续使用AJAX请求,所以这个问题就到此为止了。

感谢那些回复的人。

您需要将超全局变量重新传递给AJAX调用。因此,在向pagination.php发出请求的地方,需要向pagination.php?pagenumber_form=<?php echo $_GET['pagenumber_form']; ?>发出请求。

相应的值被添加到URL中,如下所示:"…/pagenumber_form=X

你可能想试试

.../?pagenumber_form=X

包含的文件可以很好地访问superglobal(这就是它们的超级特性)。不能做的是从一个请求访问另一个请求中的变量。目前还不清楚您的代码在做什么(因为这个问题不包括一个合适的最小测试用例——一个完整、简洁、有代表性的示例),但听起来加载一个页面涉及多个请求,并且只有第一个请求得到了表单数据。每个AJAX请求都涉及一个单独的HTTP请求,并且(因为HTTP应该是无状态的)有不同的请求数据,所以任何没有明确给出数据的请求都无法访问它。在处理请求后,脚本可以访问的所有数据都将被丢弃。这就是为什么如果您需要跨请求存在数据,则需要某种形式的持久性,例如会话(为了不破坏HTTP无状态模型,您应该小心)或数据库。

一些困难可能在于对服务器端发生的事情、客户端发生的事情以及两者之间发生的事情的顺序感到困惑。在你进一步研究之前,先阅读一下HTTP(网络搜索应该会发现无数关于这个主题的文档)。您可以使用调试器(例如Firebug、XDebug+客户端、Wireshark、LiveHTTPHeaders)在发生时查看正在发生的事情。