我尝试使用原生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;
}
答案 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。您应该开始使用函数或对象将代码分解为可重用的小块。