【问题标题】:explode results then implode php爆炸结果然后内爆php
【发布时间】:2018-02-28 07:19:25
【问题描述】:

我得到一列的内容,该列的内容存储为 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;

}

【问题讨论】:

  • 您正在循环内爆单个项目。您需要在循环之外构建和内爆列表。根据您的描述,您实际上可以通过一个查询来实现这一点。如果您发布表格,并附上示例数据,我可以向您展示。
  • 警告:当使用mysqli 时,您应该使用parameterized queriesbind_param 将用户数据添加到您的查询中。 请勿使用字符串插值或连接来完成此操作,因为您创建了严重的SQL injection bug切勿$_POST$_GET任何用户数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。
  • 注意:mysqli 的面向对象接口明显不那么冗长,使代码更易于阅读和审核,并且不容易与过时的mysql_query 接口混淆。在您对程序风格投入过多之前,值得转换一下。示例:$db = new mysqli(…)$db->prepare("…") 程序接口是 PHP 4 时代引入的 mysqli API 的产物,不应在新代码中使用。
  • implode(', '...) 只有一个列/元素要内爆,所以你永远看不到你的分隔符。

标签: php mysql


【解决方案1】:

因为每个$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);

专业提示,在数据库中使用逗号分隔字段是个坏主意。您应该normalize 该字段,有另一个名为ingredients 的表和一个名为order_ingredient 的数据透视表,其中包含特定订单的每种成分,然后您可以简单地JOIN 按ID 的成分并一次获取所有成分,而不是做N+1 queries 会影响你的表现快速

结构如下所示:

查询类似

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

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

【讨论】:

  • 我同意,我被他说他实际上得到burgerfries 的事实吓坏了。我认为他在这里粘贴代码时错过了一个变量。我会编辑以防万一,谢谢。
  • 对,这似乎令人困惑......有点奇怪的做事方式,这就是为什么我喜欢你如何解释以制作更好的关系表。
  • @ishegg,我会研究给出的建议,但你给我的建议确实有效。
  • @ishegg 只是一个更新,我用类似于你的建议的东西规范了我的数据库。谢谢你的建议。真的很感激..
  • 我很高兴听到!祝您好运,如果您有任何疑问,请随时回来提出新问题。
【解决方案2】:

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

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

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

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

【讨论】:

  • @SimpleProgrammer 这是我推荐的智能单查询方法。否则,您将进行 n+1 次查询——这不是很好的做法。是否移动绿色勾号由您决定,但您应该实施这种方法。
  • @mickmackusa 这是一个很好的答案(从没想过),但它比实际标准化数据更好,你知道,关系数据库是为什么而设计的?
  • 是的,应该规范化,实现单查询方案。
  • @mickmackusa 所以你会在我回答的第二部分推荐这个?
  • 一场激烈的辩论。爱它。 @ishegg,您的回答是正确的 - 您回答了原始问题,并且还概述了数据应该被标准化。我只是为 OP 现有的数据库结构提供了一个更优化的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多