PHP页面无法正确呈现

时间:2011-07-17 16:34:53

标签: php mysql

我有一个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">&nbsp;</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">&nbsp;</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">&nbsp;</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">&nbsp;</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()

2 个答案:

答案 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'];
}

希望以上解释有所帮助!