【问题标题】:PHP Page Not Rendering ProperlyPHP页面未正确呈现
【发布时间】:2011-07-17 16:34:53
【问题描述】:

我正在构建一个 PHP 站点,但我似乎遇到了一些渲染问题。 我将我的网站分成多个部分,例如 Header.php、sidebar.php 和 footer.php。我的所有类别都在侧边栏中呈现没有问题,但是当我尝试为所选类别呈现产品时,页面并没有呈现完整的页面。

我有一个包含类别和产品的简单数据库。 下面是我的 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()

【问题讨论】:

  • 那里的代码太多了。 does not render 是什么意思?你有什么错误吗?只是没有按您的意愿显示吗?
  • 对不起...我希望它是完整的...有什么想法吗?
  • 另外,如果这是您正在开发的网站,您能否链接到该网站,以便我们准确查看哪里出了问题?
  • @Carl:如果没有呈现整个页面,那通常是由某种错误引起的。通过报告所有错误并显示它们更容易找到它们。将此添加到代码的最开头:error_reporting(-1); ini_set('display_errors', 1); - 如果您收到通知/警告/错误,请将它们添加到您的问题中。
  • 它没有完成页面渲染,并切断了 products_list.php 应该渲染的 HTML。

标签: php mysql


【解决方案1】:

我相信问题在于您在 product_list.php 文件之后包含了 sidebar.php 文件。 Product_list.php 引用了 $category_id,但 $category_id 似乎直到 sidebar.php 文件才包含在内。所以你试图将一个未定义的变量传递给你的各种函数,它会产生一个错误。

此问题的部分原因在于您错误地编组了资源。尝试将所有代码放在模板文件的顶部(获取所需数据的东西),以便将其与演示代码分开。

参考您的评论,代码的顺序需要翻转为这样的:

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

【讨论】:

  • 我尝试将所有代码添加到我的 index.php 文件的顶部,但仍然遇到相同的错误。
  • 您确定将侧边栏中的代码放在 product_list.php 中的代码上方吗?
  • 我不断收到错误消息... 注意:未定义的索引:第 11 行 /var/www/WidgetCorp/index.php 中的 category_id
  • 我改变了我的 if 语句,现在它可以工作了,但是当我点击侧边栏上的不同类别时,它不会加载所选类别中的产品。
  • 这只是意味着您正在尝试访问 $category 数组中的值,该值在 product_list.php 文件中不存在。你确定你的 foreach 中的变量 $category 有一个键“category_id”吗?
【解决方案2】:

好的!如果我正确理解您的结构,index.php 是渲染所有组件的主要脚本 - 页眉、侧边栏、产品和页脚。 sidebar.php 和 product_list.php 只呈现特定内容。

现在,当单击一个类别时,category_id 作为 GET 参数传递给 index.php。当代码包含“views/product_list.php”时,它会搜索尚不存在的$category_id(我假设“register_globals”设置为关闭)。请尝试在 product_list.php 的前 2 个语句中使用 $_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 将在以下所有代码中可用。但是,由于“product_list.php”在“sidebar.php”之前被调用,$category_id 在“product_list.php”中不可用。

补充建议

对于上述场景,最好在所有需要值的地方使用$_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'];
}

希望以上解释对您有所帮助!

【讨论】:

    猜你喜欢
    • 2020-10-09
    • 2023-04-09
    • 2017-10-16
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多