在if($ _ POST)块内部初始化的PHP数组不能在它之外使用

时间:2018-04-29 21:51:13

标签: php arrays

我一直在寻找发现这种情况的原因,但无济于事。我有一个两步过程来根据选中的复选框更新mySQL数据库中的特定行(以批准时间表)。在第一个屏幕中,用户检查与她或他想要更新的时间表相关联的任何复选框。在下一个屏幕上,我显示与这些复选框关联的行,一个确认页面 - 如果您愿意的话。在此确认页面上,我成功设置并回显了一个数组,该数组只是$ _POST复选框数组的副本,称为“approvebox”。尽管如此,我似乎无法在创建它的“if($ _ POST)”块之外的任何地方使用此数组。

以下是与创建第一页相关的代码,用户必须在其中检查她/他希望批准的每个时间表的复选框:

if($_POST['submit']){
...
... 
while ($row = mysqli_fetch_assoc($tblresults)){
            echo "<tr>";
    echo "<td>" . $row['name'] . "</td>";
    echo "<td>" . $row['timesheetsid'] . "</td>";
    echo "<td>" . $row['unixstamp'] . "</td>";
    echo "<td>" . $row['total_hours'] . "</td>";
    echo "<td>" . $row['coordinatorid'] . "</td>";
    echo "<td>" . $row['status'] . "</td>";
    echo "<td>(<a href='./currenttimesheets.php?timesheetsid=" . $row['timesheetsid'] . "'>View</a>)</td>";
    echo "<td> &nbsp &nbsp &nbsp <input type='checkbox' name='approvebox[{$row['timesheetsid']}]' value='{$row['timesheetsid']}' /></td>";
    echo "</tr>";
    }

以下是我成功设置并回显数组的代码,该数组是$ _POST approvebox数组的副本。另外值得注意的是,我实际上在foreach循环中使用if($ _ POST ['submit'])块中的approvebox数组来填充用户从前一个屏幕中选择的结果行:

if($_POST['appove']){
...
...
foreach ($_POST['approvebox'] as $approvebox){
...
...
while($row = mysqli_fetch_assoc($tblresults)){
    echo "<td>" . $row['name'] . "</td>";
    echo "<td>" . $row['timesheetsid'] . "</td>";
    echo "<td>" . $row['unixstamp'] . "</td>";
    echo "<td>" . $row['total_hours'] . "</td>";
    echo "<td>" . $row['coordinatorid'] . "</td>";
    echo "<td>" . $row['status'] . "</td>";
    echo "<td>(<a href='./currenttimesheets.php?timesheetsid=" . $row['timesheetsid'] . "'>View</a>)</td>";
    echo "</tr>";
            }
        }
    echo "</table>";
    print_r($_POST);
    $selectedtimesheets = array();
    $selectedtimesheets2 = array_merge($selectedtimesheets, $_POST['approvebox']);

    //$selectedtimesheets2 is successfully set to the $_POST array here
    print_r($selectedtimesheets2);

最后,这是第二个if($ _ POST)块,其中我尝试使用$ selectedtimesheets2数组,但是没有成功,它不会回显任何东西:

if($_POST['accept']){

            print_r($_POST);

            //$selectedtimesheets2 does not get echoed out, despite being successfully set and echoed previously..
            print_r($selectedtimesheets2);
            echo $selectedtimesheets2;

2 个答案:

答案 0 :(得分:1)

听起来你正在做两个请求。在第一次请求之后,超级全球_POST中的任何内容都不会出现在下一个请求中。

要在请求之间保留数据,您可以使用PHP sessions

您可以执行以下操作:首次请求时,将该数组保存到会话中:

session_start();    
$_SESSION["selectedtimesheets2"] = array_merge($selectedtimesheets, 
$_POST['approvebox']);

然后在您的下一个请求中,您可以检索它:

$selectedtimesheets2 = $_SESSION["selectedtimesheets2"]

这有意义吗?这非常粗糙,我建议使用像SymfonyLaravelLumen这样的框架,具体取决于项目的大小。 HTTP请求已被抽象化,操作起来更容易/更安全。另请查看HTTP foundation package from Symfony

答案 1 :(得分:-1)

不应该print_r($_POST); print_r($_POST['approve']);