我已获得访问第三方数据库的权限,并希望使用他们的信息创建一个工具。为其最初目的设计的数据库非常庞大且隔离。我需要完成以下任务:
从下面的 Schema 中,我需要完成以下任务:
在 invTypes 中查找项目,检查 invTypeMaterials 和 ramTypeRequirements 以查看是否需要任何材料来构建项目。如果是,则在 invTypes 中查找这些材料中的每一个,并再次重复该过程以查看它们是否需要组件。这个循环一直持续到对 invTypeMaterials 和 ramTypeRequirements 的检查为 False,这可以是 5 或 6 个循环,但每个循环要检查 5 或 6 个项目,因此可能是 1561 个循环,假设原始项目有 1 个循环,然后每个循环 5 个循环其中材料有5、5倍。
现在我尝试完成代码并提出以下内容:
$materialList = array();
function getList($dbc, $item) {
global $materialList;
// Obtain initial material list
$materials = materialList($dbc, $item);
// For each row in the database
while ($material == mysqli_fetch_array($materials)) {
// Check if there are any sub materials required
if (subList($dbc, $material['ID'])) {
// If so then recurse over the list the given quantity (it has already done it once)
for ($i = 0; $i < $material['Qty'] - 1; $i++) {
if (!subList($dbc, $material['ID'])) {
break;
}
}
} else {
// If there are no further materials then this is the base material so add to the array.
$materialList .= array(
"Name" => $mMaterial['Name'],
"Qty" => $mMaterial['Qty'],
"ID" => $material['ID']
);
}
}
return $materialList;
}
function subList($dbc, $item) {
global $materialList;
// Query the material incase it require further building
$mMaterials = materialList($dbc, $item['ID']);
// If the database returns any rows, then it must have more sub-materials required
if (mysqli_num_rows($mMaterials) > 0) {
// Check the sub-materials to see if they intern require futher materials
if (subList($dbc, $material['ID'])) {
// If the function returns true then iterate over the list the given quantity (its already done it once before)
for ($i = 0; $i < $material['Qty'] - 1; $i++) {
if (!subList($dbc, $material['ID'])) {
break;
}
}
} else {
// if the database returns 0 rows then this object is the base material so add to array.
$materialList .= array(
"Name" => $mMaterial['Name'],
"Qty" => $mMaterial['Qty'],
"ID" => $material['ID']
);
return true;
}
} else {
return false;
}
}
function materialList($dbc, $item) {
// Query
$query = " SELECT i.typeID AS ID, i.typeName AS Name, m.Quantity AS Qty
FROM invTypes AS i
LEFT JOIN invTypeMaterials AS m
ON m.materialTypeID = i.typeID
LEFT JOIN ramTypeRequirements AS r
ON r.typeID = i.typeID
WHERE groupID NOT IN(278,269,278,270,268) AND m.typeID = $item";
$snippets = mysqli_query($dbc, $query) or die('Error: ' . mysqli_error($dbc));
return $snippets;
}
我相信你们都注意到,当涉及到递归数据库调用时,这段代码违反了每条编程法则。不是很实用,尤其是subList()
它不断地调用自己,直到发现它是错误的。SQL 不是我的强项,但我终其一生都无法解决这个问题。
任何指针都会非常有帮助,我当然不会要求你们中的任何人为我重写我的整个代码,但如果你对我应该考虑什么有任何想法,我将不胜感激。