从不同的php文件中访问值?

时间:2017-11-19 02:45:06

标签: 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 'getOrder':
            if(isset($_GET['id'])) {
                $orderDetails = $jobModel->getOrderById($_GET['id']);
                    header('Location: order-details.php');
            }
            break;
        default:
            echo 'Invalid action';
            break;
    }
}

这是我的观点', order-details.php

<?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>

order-details.php 是某种模板,可根据$orderDetails的内容显示每个订单的信息。

通过包含订单表的单独页面调用它。表中的每个订单都有一个链接:

<tr>
    <td><a href="My_Controller.php?action=getOrder&id=<?= $value->job_id; ?>"><?= $value->job_id; ?></a></td>
    <td><?= $value->job_date; ?></td>
    <td><?= $value->total_amount; ?></td>
</tr>

这是动态的,因为我不必为每个订单编写单独的页面。该模板只保存变量,这些变量将根据传递的订单ID填充相关信息,这取决于用户点击的链接。

我需要做什么:

我需要访问$orderDetails的内容并在 order-details.php 中显示订单商品列表,但我不知道该怎么做?根据我目前的情况,当从 order-details.php 访问NULL变量时,我会从$orderDetails变量中获得var_dump($orderDetails)值。

我已使用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'; } } 检查了数据库查询的结果,并确实返回了预期结果。

更新

My_Controller.php

<body>
<div id="bg-top"></div>
</body>
<style>

body {
  background-color: #ffffff;
  background-attachment: fixed;
  position: fixed;
}
#bg-top {
  background-color: #00b9ff;
  background-attachment: fixed;
  position: fixed;
  top: 12%;
  bottom: 6%;
  left: 0%;
  right: 0%;
  z-index: -1;
}

1 个答案:

答案 0 :(得分:2)

该变量可以在不做任何特殊操作的情况下访问,因为它位于global scope中。换句话说,您只需将其作为$orderDetails访问。

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

以下是捕获:此代码行确保在您到达显示逻辑时$orderDetails 永远不会设置:

header('Location: order-details.php');

此重定向不会保留$_GET个参数。它会使用 no 参数触发全新请求。因此,在重定向之后,加载订单详细信息的逻辑永远不会运行。

至于如何解决它:这取决于你尝试做什么,但很可能你根本不应该重定向。

另外,您应该知道using lots of global variables like this is considered bad practice。您应该开始使用函数或对象将代码分解为可重用的小块。