爆炸结果然后内爆php

时间:2018-02-27 22:37:58

标签: php mysql

我正在获取列内容存储为3,2的内容,然后我使用explode函数将它们分开。然后,分隔的值用于查询另一个表以引入名称。接下来我想破坏汉堡,薯条等结果。但结果并没有用逗号分隔,而是像汉堡包......这就是我所做的:

$sql = "SELECT items FROM orders";
$result = mysqli_query($connection, $sql);
$array = mysqli_fetch_assoc($result);

$exploded = explode(",", $array['items']);

foreach ($exploded as $row){
    $query = "SELECT food_name FROM foodlist WHERE food_id = $row";
    $res = mysqli_query($connection, $query);
    $arr = mysqli_fetch_assoc($res);

    $imploded = implode(", ", $arr);

    echo $imploded;

}

2 个答案:

答案 0 :(得分:6)

因为每个$arr只包含一个成分,所以你实际上implode()只有一个元素,回应它,然后回应其他没有被任何东西分开的成分,所以它们一起显示出来。

您可以将它们添加到数组中然后内爆它们:

$sql = "SELECT items FROM orders";
$result = mysqli_query($connection, $sql);
$array = mysqli_fetch_assoc($result);

$exploded = explode(",", $array['items']);

$ingredients = [];
foreach ($exploded as $row){
    $query = "SELECT food_name FROM foodlist WHERE food_id = $row";
    $res = mysqli_query($connection, $query);
    $arr = mysqli_fetch_assoc($res);

    $ingredients[] = $arr["food_name"];
}

echo implode(", ", $ingredients);

PRO TIP ,将您的字段用数据库中的逗号分隔是一个坏主意。您应该normalize该字段,有另一个名为ingredients的表和一个名为order_ingredient的数据透视表,其中包含特定订单所具有的每种成分,然后您可以通过ID简单地JOIN成分并立即获取所有内容,而不是执行N+1 queries,这会扼杀 fast 的性能。

结构如下所示:

enter image description here

查询类似

SELECT ingredient FROM orders o JOIN order_ingredient oi ON oi.order_id = o.id JOIN ingredients i ON oi.ingredient_id = i.id

只需一次查询即可返回所有成分。

答案 1 :(得分:3)

我看到你已经接受了答案。

如果您希望大幅减少正在执行的查询数量,可以使用以下单个查询来获取所有订单的逗号分隔食品项目列表。

SELECT o.id, GROUP_CONCAT(f.name SEPARATOR ', ') AS food
FROM orders o
INNER JOIN food f ON FIND_IN_SET(f.id, o.items) > 0
GROUP BY o.id

这是一个用来演示的SQL小提琴:http://sqlfiddle.com/#!9/b0004c/2

但正确的解决方案是规范化数据库结构。