从不同的php文件访问值?

从不同的php文件访问值?,php,Php,我正在尝试使用本机PHP来练习OOP 我有我的‘控制器’,my_controller.php: session_start(); if (!isset($_SESSION['userId'])) exit('You are not authorized to access this page'); // ... some code ... if(isset($_GET['action'])) { switch($_GET['action']) { case 'getO

我正在尝试使用本机PHP来练习OOP

我有我的‘控制器’,my_controller.php

session_start();
if (!isset($_SESSION['userId'])) exit('You are not authorized to access this page');

// ... some code ...

if(isset($_GET['action']))
{
    switch($_GET['action']) {
        case 'getOrder':
            if(isset($_GET['id'])) {
                $orderDetails = $jobModel->getOrderById($_GET['id']);
                    header('Location: order-details.php');
            }
            break;
        default:
            echo 'Invalid action';
            break;
    }
}
<?php
require_once './My_Controller.php';
?>
<html>
    <head>
        <title>Order Details</title>
    </head>

<body>
    <div>
        <a href="order-list.php">Back to Order List</a>
    </div>
    <div>Order Details</div>
    <div>
        <form id="form-add-job-item" method="post" action="">
            <table border="1">
                <thead>
                    <tr>
                        <th>Item Name</th>
                        <th>Quantity</th>
                        <th>Amount</th>
                    </tr>
                </thead>
                <tbody>
                    <?php
                        if(isset($orderDetails) && $orderDetails != 0) {
                            foreach($orderDetails as $orderItem => $value) {
                                ?>
                                <tr>
                                    <td><?= $value->name; ?></td>
                                    <td><?= $value->quantity; ?></td>
                                    <td><?= $value->amount; ?></td>
                                </tr>
                                <?php
                            }
                        }
                    ?>
                </tbody>
            </table>
            <button type="submit">Add Item</button>
        </form>
        <?php

        ?>
    </div>
</body>
</html>
case 'getOrder':
      if(isset($_GET['id'])) {
        // $dba contains the connection to the database
        $MyController = new My_Controller($dba);
        $MyController->getOrderById($_GET['id']);
      }
      break;

// ... Some code ...

class My_Controller
{
    private $myModel;

    public function __construct(Db $db)
    {
        $this->myModel = new My_Model($db);
    }

    public function getOrderById($orderId)
    {
        $orderDetails = $this->myModel->getOrderById($orderId);
        include './order-details.php';
    }
}
这是我的“视图”,订单详细信息。php:

session_start();
if (!isset($_SESSION['userId'])) exit('You are not authorized to access this page');

// ... some code ...

if(isset($_GET['action']))
{
    switch($_GET['action']) {
        case 'getOrder':
            if(isset($_GET['id'])) {
                $orderDetails = $jobModel->getOrderById($_GET['id']);
                    header('Location: order-details.php');
            }
            break;
        default:
            echo 'Invalid action';
            break;
    }
}
<?php
require_once './My_Controller.php';
?>
<html>
    <head>
        <title>Order Details</title>
    </head>

<body>
    <div>
        <a href="order-list.php">Back to Order List</a>
    </div>
    <div>Order Details</div>
    <div>
        <form id="form-add-job-item" method="post" action="">
            <table border="1">
                <thead>
                    <tr>
                        <th>Item Name</th>
                        <th>Quantity</th>
                        <th>Amount</th>
                    </tr>
                </thead>
                <tbody>
                    <?php
                        if(isset($orderDetails) && $orderDetails != 0) {
                            foreach($orderDetails as $orderItem => $value) {
                                ?>
                                <tr>
                                    <td><?= $value->name; ?></td>
                                    <td><?= $value->quantity; ?></td>
                                    <td><?= $value->amount; ?></td>
                                </tr>
                                <?php
                            }
                        }
                    ?>
                </tbody>
            </table>
            <button type="submit">Add Item</button>
        </form>
        <?php

        ?>
    </div>
</body>
</html>
case 'getOrder':
      if(isset($_GET['id'])) {
        // $dba contains the connection to the database
        $MyController = new My_Controller($dba);
        $MyController->getOrderById($_GET['id']);
      }
      break;

// ... Some code ...

class My_Controller
{
    private $myModel;

    public function __construct(Db $db)
    {
        $this->myModel = new My_Model($db);
    }

    public function getOrderById($orderId)
    {
        $orderDetails = $this->myModel->getOrderById($orderId);
        include './order-details.php';
    }
}
这样它就可以是动态的,因为我不必为每个订单编写单独的页面。此模板将只保存变量,这些变量将根据传递的订单ID填充相关信息,这将取决于用户单击的链接

我需要完成的事情:

我需要访问
$orderDetails
的内容,并在order details.php中显示订单项目列表,但我不确定如何操作?根据我目前掌握的信息,当从order details.php访问
$orderDetails
变量时,我从变量中获得了一个
NULL

我已经使用
var\u dump($orderDetails)
检查了数据库查询的结果,它确实返回了预期的结果

更新:

在My_Controller.php内部

session_start();
if (!isset($_SESSION['userId'])) exit('You are not authorized to access this page');

// ... some code ...

if(isset($_GET['action']))
{
    switch($_GET['action']) {
        case 'getOrder':
            if(isset($_GET['id'])) {
                $orderDetails = $jobModel->getOrderById($_GET['id']);
                    header('Location: order-details.php');
            }
            break;
        default:
            echo 'Invalid action';
            break;
    }
}
<?php
require_once './My_Controller.php';
?>
<html>
    <head>
        <title>Order Details</title>
    </head>

<body>
    <div>
        <a href="order-list.php">Back to Order List</a>
    </div>
    <div>Order Details</div>
    <div>
        <form id="form-add-job-item" method="post" action="">
            <table border="1">
                <thead>
                    <tr>
                        <th>Item Name</th>
                        <th>Quantity</th>
                        <th>Amount</th>
                    </tr>
                </thead>
                <tbody>
                    <?php
                        if(isset($orderDetails) && $orderDetails != 0) {
                            foreach($orderDetails as $orderItem => $value) {
                                ?>
                                <tr>
                                    <td><?= $value->name; ?></td>
                                    <td><?= $value->quantity; ?></td>
                                    <td><?= $value->amount; ?></td>
                                </tr>
                                <?php
                            }
                        }
                    ?>
                </tbody>
            </table>
            <button type="submit">Add Item</button>
        </form>
        <?php

        ?>
    </div>
</body>
</html>
case 'getOrder':
      if(isset($_GET['id'])) {
        // $dba contains the connection to the database
        $MyController = new My_Controller($dba);
        $MyController->getOrderById($_GET['id']);
      }
      break;

// ... Some code ...

class My_Controller
{
    private $myModel;

    public function __construct(Db $db)
    {
        $this->myModel = new My_Model($db);
    }

    public function getOrderById($orderId)
    {
        $orderDetails = $this->myModel->getOrderById($orderId);
        include './order-details.php';
    }
}

该变量不需要做任何特殊的操作就可以访问,因为它位于。换句话说,您可以通过
$orderDetails
访问它

诀窍在于它必须被定义。在My_Controller.php中设置代码的方式中,
$\u GET['action']
必须等于
getOrder
并且必须定义
$\u GET['id']
,否则将不会设置
$orderDetails


这里有一个问题:这行代码确保在进入显示逻辑时,
$orderDetails
永远不会被设置:

header('Location: order-details.php');
此重定向不会保留
$\u GET
参数。它会触发一个没有参数的全新请求。因此,在重定向之后,加载订单详细信息的逻辑永远不会运行

至于如何解决这个问题:这取决于你想做什么,但最有可能的是你根本不应该在那里重定向


而且,你应该知道这一点。您应该开始使用函数或对象将代码分解成小的、可重用的块。

该变量不需要做任何特殊的操作就可以访问,因为它处于可用状态。换句话说,您可以通过
$orderDetails
访问它

诀窍在于它必须被定义。在My_Controller.php中设置代码的方式中,
$\u GET['action']
必须等于
getOrder
并且必须定义
$\u GET['id']
,否则将不会设置
$orderDetails


这里有一个问题:这行代码确保在进入显示逻辑时,
$orderDetails
永远不会被设置:

header('Location: order-details.php');
此重定向不会保留
$\u GET
参数。它会触发一个没有参数的全新请求。因此,在重定向之后,加载订单详细信息的逻辑永远不会运行

至于如何解决这个问题:这取决于你想做什么,但最有可能的是你根本不应该在那里重定向


而且,你应该知道这一点。您应该开始使用函数或对象将代码分成可重用的小块。

$orderDetails
为空,因为在控制器上,您正在重定向到另一页,因此会发出新请求。每个新请求都会重置所有内容。header('Location:order details.php');你为什么重定向?重定向此页面将销毁变量,或者您可以将其存储为会话
$orderDetails
为空,因为您在控制器上重定向到另一个页面,因此会发出新请求。每个新请求都会重置所有内容。header('Location:order details.php');你为什么重定向?重定向此页面将销毁变量,或者您可以将其存储为会话。你建议我怎么做?我基本上是在尝试模仿MVC行为,在控制器中,您可以将数据从模型传递回它,然后将数据传递给视图,然后访问视图中的数据。我基本上是在试图避免手动编写代码并为订单创建单独的页面,因此我设置了一个模板,根据传递的订单ID,它将包含有关该订单的信息。控制器实际上应该控制执行流程。现在,它不是真的。我同意它看起来是这样的,但它正在进行重定向,并试图在进一步的决策上下赌注。它应该首先决定要包含哪些代码。至于如何修复它:就像我说的,你可能根本不需要或者根本不想要重定向。如果没有更多的代码,很难确定,但是删除那一行可能就是你需要做的全部。我需要重定向,因为控制器首先在包含订单表的单独页面中调用,其中,每个订单都有一个链接,该链接首先重定向到控制器,以便它可以从数据库加载关于该订单的信息,然后在单独的页面中显示加载的信息。订单列表页面->点击订单->重定向到控制器->从数据库加载点击订单的数据->转到包含点击订单数据库数据的单独页面使用重定向的方法是错误的。相反,在本例中,控制器应该只是运行逻辑来加载每个视图所需的信息。因此,当调用它来加载订单表时,它将运行一组逻辑,但对于订单的详细信息,它将运行不同的逻辑。问题的一部分在于,您试图使用MVC,这是面向对象编程(OOP)中的一个概念,而不使用OOP。方钉,圆孔。我明白了。事实上,我有使用CodeIgniter的经验,但我还不知道如何完成在URL中包含控制器类名和所需函数的部分,瞧,它“重定向”等等。如果我将我的_控制器创建为一个类,我会