PHP:数据库输出两次逻辑的东西

时间:2014-04-23 15:14:30

标签: php database

我有这段代码:

if ($object_id != $cur_object_id) {
                        ?>

                    <div class="workbench_object_wrap">
                        <p class="text_center"><u><?php echo $object_name; ?></u></p>

                        <div class="workbench_object_img">
                            <img style="max-width: 100px; max-height:100px;" src="<?php echo $src. "2.png";?>">
                        </div>
                        <div class="workbench_object_info_wrap">
                            <div class="workbench_object_info">
                            <?php
                        }

                                ?>
                                <p><?php echo $material_name; ?><i style="float:right;"><?php echo $material_amount; ?></i></p>
                                <?php

                                if ($object_id != $cur_object_id) {
                                ?>
                                <div class="craft">
                                    <button id= "craft-<?php echo $object_id; ?>" class="craft" onclick="craft(this);">Craft</button>
                                </div>
                            </div>
                        </div>
                    </div>
                    <?php
                    $cur_object_id = $object_id;
                    }

在while循环中,迭代数据库查询返回的所有内容。

所以我希望$object_name每个对象都出现一次。每个对象都有一些名称:$material_name。在打印完所有这些材料名称之后,我希望div关闭并为每个对象仅打印craft一次。

此图像表示我从数据库获得的输出。正如您所看到的,相同的object_id出现了两次,因此我创建了$cur_object_id因为我只想要对象name一次(Royal Chair)但是我想要两个材料名称(石头和桦木日志)在最后一个div关闭之前显示。

This is what the database call returns

这可能是通过一些布尔值来检查object_id是否仍然相同或某些逻辑,但我只是想办法实现这一点。提前谢谢!

1 个答案:

答案 0 :(得分:1)

在这里,我认为你出错......

看起来您的数据库结构看起来像这样:

objects
-------
object_id, name

categories
----------
category_id, name

materials
---------
material_id, name

category_objects
----------------
category_id, object_id

object_materials
----------------
material_id, object_id

为了加载您想要显示的所有数据,您可能会执行以下单个查询:

$results = query(
    'SELECT * FROM objects o
    INNER JOIN object_materials om ON om.object_id = o.object_id
    INNER JOIN materials m ON om.material_id = m.material_id

    INNER JOIN category_objects co ON co.object_id = o.object_id
    INNER JOIN categories c ON c.category_id = co.category_id'
);

这不仅会为您提供材料的重复结果,而且当您开始将对象分为多个类别时,它也会给您重复的结果。尝试将其分解为多个查询:

$objects = query('SELECT * FROM objects');

// Iterate over each object and load the category/materials for 
// each object individually
    $categories = query(
        'SELECT * FROM categories c
            INNER JOIN category_objects co ON co.category_id = c.category_id
        WHERE co.object_id = ?',
        $object['id']
    );

    $materials = query(
        'SELECT * FROM materials m
            INNER JOIN object_materials om ON om.material_id = m.material_id
        WHERE mo.object_id = ?',
        $object['id']
    );

然后,您可以单独迭代每个结果集并根据需要显示它们。你或许可以通过一个查询来完成这项工作,但是对于那些后来进入你的人来说,它完全不清楚,或者甚至在6个月之后,如果一个bug是发现的。

<强>更新

从您的问题中不清楚您是如何查询的,或者您显示的是什么标记,但这里有一些适用于您的伪代码 如果你想继续前进的方式。我在这里使用表格元素来显示结果,但您可以根据自己的需要对其进行修改。

echo '<table>';
$currentObjectId = null;
$currentCategoryId = null;
$currentMaterialId = null;

// Iterate over your result set
// Each object here is a tuple representing joined entities from the 
// objects, categories and materials tables
foreach($objects as $object) { 
    echo '<tr>';

    if(!$currentObjectId || $currentObjectId != $object['id']) {
        echo '<td>' . $object['name'] . '</td>';
    } else {
        echo '<td></td>';
    }

    if(!$currentCategoryId || $currentCategoryId != $object['category_id']) {
        echo '<td>' . $object['category_name'] . '</td>';
    } else {
        echo '<td></td>';
    }

    if(!$currentMaterialId || $currentMaterialId != $object['material_id']) {
        echo '<td>' . $object['material_name'] . '</td>';
    } else {
        echo '<td></td>';
    }

    echo '</tr>';
}

echo '</table>';