我有一个PHP网站,我正在构建,我似乎有一些渲染问题。 我将我的网站分成了多个部分,例如Header.php,sidebar.php和footer.php。我在边栏中呈现的所有类别都没有问题,但是当我尝试为所选类别呈现产品时,页面不会呈现整个页面。
我有一个包含Categories和Products的简单数据库。 下面是我的connect_db.php,categories_db.php和products_db.php文件的代码,它们处理所有数据库内容。
注意:如果我只显示所有产品,我可以让我的product_list.php进行渲染,但我需要在侧边栏中为所选类别渲染产品。
以下是我的index.php或主视图
<?php
error_reporting(-1);
ini_set('display_errors', 1);
require('models/connect_db.php');
require('models/categories_db.php');
require('models/products_db.php');
$categories = get_categories();
if (!isset($category_id)) {
$category_id = 1;
}
else {
$category_id = $_GET['category_id'];
}
// get all products by category
$products = get_products_by_category($category_id);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<?php include('views/layout/head.php');?>
</head>
<body>
<!-- Wrapper -->
<div class="wrapper">
<!-- Header -->
<?php include('views/layout/header.php');?>
<!-- Main -->
<div id="main">
<div class="cl"> </div>
<!-- Content -->
<div id="content">
<?php include('views/product_list.php');?>
</div>
<!-- End Content -->
<!-- Sidebar -->
<?php include('views/layout/sidebar.php');?>
</div>
<!-- End Main -->
<!-- Footer -->
<?php include('views/layout/footer.php');?>
</div>
<!-- End Wrapper -->
</body>
</html>
现在侧边栏正确呈现了类别,但是当我点击某个类别时,它不会按预期呈现product_list.php。
我的侧边栏正确加载所有类别,代码如下。
<?php
$categories;
$categories = get_categories();
$category_id = $_GET['category_id'];
if (!isset($category_id)) {
$category_id = 1;
}
?>
<div id="sidebar">
<!-- Categories -->
<div class="box categories">
<h2>Categories </h2>
<div class="box-content">
<ul>
<!-- get category menu items -->
<?php foreach($categories as $category) : ?>
<li><a href="?category_id=<?php echo $category['category_id'];?>">
<?php echo $category['name'];?>
</a>
</li>
<?php endforeach; ?>
</ul>
</div>
</div>
<!-- End Categories -->
</div>
<!-- End Sidebar -->
<div class="cl"> </div>
现在提供不会呈现的product_list.php文件。
<?php
// get all products by category
$products = get_products_by_category($category_id);
// get category name
$category_name = get_category_name($category_id);
?>
<!-- Products -->
<div class="products">
<div class="cl"> </div>
<ul>
<?php foreach($products as $product) : ?>
<li>
<a href="#"><img src="css/images/big1.jpg" alt="" /></a>
<div class="product-info">
<h3><?php echo $product['name'];?></h3>
<div class="product-desc">
<h4><?php echo $category_name;?></h4>
<p><?php echo $product['description'];?></p>
<strong class="price"><?php echo $product['price'];?></strong>
</div>
</div>
</li>
<?php endforeach; ?>
</ul>
<div class="cl"> </div>
</div>
<!-- End Products -->
我不确定是不是因为$ category_id没有设置或者是什么,请有人帮我解决这个问题。
错误:
注意:未定义的变量:第4行/var/www/WidgetCorp/views/product_list.php中的category_id
注意:未定义的变量:第7行/var/www/WidgetCorp/views/product_list.php中的category_id
致命错误:在第22行的/var/www/WidgetCorp/models/categories_db.php中调用未定义的方法PDO :: fetch()
答案 0 :(得分:1)
我认为问题是你在product_list.php文件之后包含了sidebar.php文件。 Product_list.php引用了$ category_id,但是在sidebar.php文件之前似乎没有包含$ category_id。所以你试图将一个未定义的变量传递给你的各种函数,它产生了一个错误。
此问题的一部分原因是您错误地封送了资源。尝试将所有代码放在模板文件的顶部(抓取所需数据的东西),以便将其与您的演示代码分开。
在参考你的评论时,代码的顺序需要翻到这样:
<?php
/* sidebar.php */
$categories;
$categories = get_categories();
$category_id = $_GET['category_id'];
if (!isset($category_id)) {
$category_id = 1;
}
/* product_list.php */
// get all products by category
$products = get_products_by_category($category_id);
// get category name
$category_name = get_category_name($category_id);
答案 1 :(得分:1)
好!如果我正确理解您的结构,index.php是呈现所有组件的主脚本 - 标题,侧边栏,产品和页脚。 sidebar.php和product_list.php只呈现特定内容。
现在,当点击某个类别时,category_id
将作为GET参数传递给index.php。当代码包含“views / product_list.php”时,它会搜索尚不存在的$category_id
(我假设“register_globals”设置为off)。请尝试在product_list.php的前两个语句中使用$_GET['category_id']
,例如:
// get all products by category
$products = get_products_by_category($_GET['category_id']);
// get category name
$category_name = get_category_name($_GET['category_id']);
我还注意到在sidebar.php中,您正确使用$_GET['category_id']
来设置$category_id
。这意味着$category_id
将在以下所有代码中可用。但是,由于在“sidebar.php”之前调用了“product_list.php”,因此“product_list.php”中没有$category_id
。
其他建议
对于上述情况,最好在需要值的所有地方使用$_GET['category_id']
。这可以避免任何冲突或未定义变量问题。如果需要在示例中一次读取$_GET['category_id']
,则另一个替代方法是在主“index.php”中而不是在任何包含的文件中初始化$category_id
。这样做将确保变量始终可用。例如,您可以在前3个要求之后添加这些行:
$category_id = 1;
if (isset($_GET['category_id']) && !empty($_GET['category_id'])) {
$category_id = $_GET['category_id'];
}
希望以上解释有所帮助!