optgroup 标签并选择不重复的选项组[重复]

2024-02-21

按类别对项目进行分组是可行的,但它不会将该类别的所有产品放在一个中optgroup但重复它。

所有项目应位于一组中,而不是作为重复组分开。

<select style="width: 25%;" name="item[]" id="item1" class="item browser-default custom-select-new"> 
    <option value="" disabled selected>Click to See Products</option>
<?php
$conn_register = mysqli_connect('localhost', 'root', '', 'register');
$Comid = "27";

$levy_input = "";
$records = mysqli_query($conn_register, "SELECT * FROM customer_product WHERE customer LIKE '$Comid'");
while ($data = mysqli_fetch_array($records)) {
    $price = $data['new_total_rate'];
    $product = $data['product'];

    $sqlii = "SELECT DISTINCT category 
                FROM addproducts 
                WHERE `name` LIKE '$product' 
                ORDER BY 'category' ";
    $resultii = $conn_register-> query($sqlii);
    $prof= $resultii -> fetch_assoc();
    $Pcategory = $prof["category"];

    echo '<optgroup label="'. $Pcategory .'">';
                            
    echo '<option value="' . $data['product'] . '"  
            data-new_price_rate="' . $data['new_total_rate'] . '" 
            data-description="' . $data['description'] . '" 
            data-tax="' . $data['tax'] . '"
            data-PriceRate_NoDiscount="' . $data['new_price_rate'] . '">'
        . $data['product'] . '</option>
    </optgroup>';     
}
?>
</select>

请注意,您无条件输出<optgroup>每次迭代;因此,如果您不想每次都输出,则需要(至少)使输出有条件。在许多情况下,这还不够,因为连续的行可能位于不同的组中;相反,您需要在 PHP 中对结果进行分组,然后迭代结果。在这里,经过一些修改ORDER BY子句将确保每个类别中的项目按顺序处理。当前的语句还不够,因为类别是在单独的语句中检索的,这不仅阻止了ORDER BY使类别中的项目连续但效率低下,因为它发出的请求超出了必要的数量。

这两个语句可以用一个组合起来JOIN:

SELECT cp.product AS name,
       cp.description,
       cp.tax,
       cp.new_price_rate,
       cp.new_total_rate,
       ap.category
  FROM customer_product AS cp
    LEFT JOIN addproducts AS ap ON cp.product = ap.name
  WHERE customer LIKE ? -- NB: parameter for prepared statement
  ORDER BY ap.category

如果 customer_product.product 和 ap.name 之间存在 1:N 关系,则需要修改查询,以便为每个产品仅返回一行customer_product行(一种简单的方法是按所有行进行分组cp rows).

确定何时输出<optgroup>,代码需要检测类别何时发生变化。通过存储当前类别并将其与新行的类别进行比较,可以轻松完成此操作。

一般来说,您必须考虑第一次、中间和最后一次迭代时发生的情况。

第一次迭代很重要,因为您想要强制 optgroup 的输出。只要存储的类别永远不会等于数据库中的类别,这本质上是自动的。

另外,没有</optgroup>关闭标签应在第一次迭代时输出。第一次跳过此步骤的一个简单方法是使用一个变量来保存要输出的标签,该变量被初始化为仅打开标签,然后在第一次添加关闭标签<optgroup>是输出。另一个是有一个标志记录是否有一个 optgroup 需要关闭(初始化为FALSE并设置为TRUE when <optgroup>是输出),并且仅当标志为真时才输出关闭标记。

最后一次迭代之后,最后一次<optgroup>必须关闭。假设 1 个类别中至少有 1 个产品,您应该能够在循环后无条件输出关闭标签。

请注意,问题中的示例代码混合了许多不同类型的任务,主要是数据库访问和输出。这违反了关注点分离 https://en.wikipedia.org/wiki/Separation_of_concerns。相反,每个都应该放置在单独的模块中。实现这一点的确切方法远远超出了本问答的范围,但下面的示例代码中使用了一种简化的方法。

请务必使用以下方式对任何非 HTML 字符串进行编码htmlspecialchars https://php.net/htmlspecialchars,既可以防止注入,也可以防止 HTML 损坏。

<?php
// initially, there's no category
$category = NULL;
// the category tag; will be updated to close the previous element the first time it's output
$catTag = '<optgroup ';
// attributes for each <option> element
$attrs = [
    'value' => 'name',
    'data-new_price_rate' => 'new_total_rate',
    'data-description' => 'description',
    'data-tax' => 'tax',
    'data-PriceRate_NoDiscount' => 'new_price_rate',
];
?>
<select>
  <option disabled>Click to see products</option><!-- Note: this smells a bit. -->
  <?php
    // note there's no sign of DB access; the products could come from anywhere
    foreach ($customerProducts->fetch($comid) as $product) {
        // The core of the answer: output a new optgroup only then when the category changes
        if ($category != $product['category']) {
            echo $catTag, 'label="', htmlspecialchars($product['category']), "\">\n";
            // from now on, close the previous element when there's a new optgroup
            $catTag = "</optgroup>\n<optgroup ";
        }
        // output the current product as an option element
        ?>
        <option<?php foreach ($attrs as $attr => $prop) {
                    echo ' ', $attr, '="', htmlspecialchars($product[$prop]), '"';
                } ?>><?= htmlspecialchars($product['name']) ?></option>
        <?php
        $category = $product['category'];
    }
  ?>
  </optgroup>
</select>

该示例假设每个产品都属于 1 个类别,因此$product['category']不为空。但是,如果任何产品不属于某个类别,则它应该仍然有效,除非结果中的每个产品都不属于任何类别,在这种情况下,将不会有<optgroup>s 和决赛</optgroup>不会关闭任何内容,从而产生无效的 HTML。

以下(未经测试)示例仅用于将数据库访问与 HTML 生成分开。在其他地方搜索有关主题的信息,例如DALs https://en.wikipedia.org/wiki/Data_access_layer, 准备好的陈述 https://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php,以及可穿越 https://php.net/Traversable接口(由mysqli_result https://php.net/mysqli_result, 尽管PDO https://php.net/PDO具有更好的支持,包括允许您将结果类型设置为关联数组之外的其他类型PDOStatement->setAttribute https://php.net/PDOStatement.setAttribute).

class CustomerProducts {
    static $statements = [
        'read' => 'SELECT […]',
    ];
    function __construct($db) {
        $this->db = $db;
        $this->read = $db->prepare(self::$statements[read]);
    }
    function fetch($id) {
        $this->read->bind_param('i', $id);
        if ($this->read->execute()) {
            return $this->read->get_result();
        } else {
            // handle failure with e.g. an exception
            throw …;
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

optgroup 标签并选择不重复的选项组[重复] 的相关文章

  • 混合数组和对象

    我有一个像这样的数组 Array count gt 2 0 gt stdClass Object term id gt 3109 name gt Aliens Colonial Marines slug gt aliens colonial
  • TOAD 将 &String 视为绑定变量

    我正在使用 Oracle Data Integrator 开发一些 ETL 有时会使用 TOAD 测试部分代码 今天我遇到了 TOAD 的问题 我有一行像 AND column value like DEV PROD 当我尝试运行包含上面过
  • Codeigniter:重置表单值

    在我看来 我想要做的是在用户成功注册后清除表单字段 这里一切正常 即用户正在注册 成功消息正在向用户显示 除了我想要做的是清除表单字段的值 我正在使用这个 Clear the form validation field data so th
  • 从 XML 节点 PHP DOM 中删除所有子节点

    我想使用 PHP DOM 从 XML 节点中删除所有子节点 以下之间有什么区别 A while parentNode gt hasChildNodes parentNode gt removeChild parentNode gt chil
  • 使用JQuery检查元素是否有边框?

    所以我正在玩 el css 尝试确定元素是否有边框 我用 css border style solid 设置边框 这是可行的 但实际上它设置了 4 种单独的样式 border right style border left style bo
  • PHP 检查字符串是否只包含任何语言的字母、数字和空格

    我如何检查字符串是否只包含任何语言中的字母 数字和空格 我已经尝试过 但它不检查像 这样的特殊字符 preg match p L u string preg match p N u string 您可以使用 preg match p L p
  • Oracle 中的 SQL 调优 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何文章 链接可以让我找到 SQL 调优 Oracle 的示例 如果能用例子来解释那就太好了 我需
  • sql查询将两列与一列连接起来

    我在 MS Access 2010 中有 2 个表 如下所示 USERS u id u name LOAN l id l from ref users u id l to ref users u id l amount Users u id
  • 通过 Javascript 将图像切割成碎片

    我正在创建一个简单的拼图游戏 为了做到这一点 我需要将我正在使用的图片切成 20 块 Javascript 有没有办法将一张图片切成 20 个相等的部分 并将它们保存为网页中的 20 个不同的对象 或者我只需要进入 Photoshop 自己
  • 如何使用 Laravel Eloquent 返回多重关系?

    我有一张桌子叫users 每个用户都有不同的事情 country device computer category 我为上述每一个 事物 创建了一个表格 类似如下 1 United States 2 United Kingdom 3 Aus
  • 比较表中的行以了解字段之间的差异

    我有一个包含 20 多列的表 客户端 其中大部分是历史数据 就像是 id clientID field1 field2 etc updateDate 如果我的数据如下所示 10 12 A A 2009 03 01 11 12 A B 200
  • 使用 PHP 获取 2 个同名 HTML 输入标签的值

    假设我有下表
  • 使 pdo::query 静态

    当我运行下面的代码时出现此错误 我通常使用 msql 函数 但我尝试使用 PDO 代替 怎么了 致命错误 第 14 行无法静态调用非静态方法 PDO query
  • 使用 MS Access 获取行的第一个实例

    EDITED 我有这个查询 我想SELECT表中记录的第一个实例petTable SELECT id pet ID FIRST petName First Description FROM petTable GROUP BY pet ID
  • 运行没有扩展名的 PHP 页面

    我想在 apache Web 服务器上运行我的 PHP 网页 而不需要 php扩大 所以我添加了以下代码 RewriteEngine on RewriteBase Rewritecond REQUEST URI NC RewriteRule
  • 如何在 Python 中包含 PHP 脚本?

    我有一个 PHP 脚本 news generator php 当我包含它时 它会抓取一堆新闻项并打印它们 现在 我在我的网站 CGI 中使用 Python 当我使用 PHP 时 我在 新闻 页面上使用了这样的内容 为了简单起见 我删掉了这个
  • 按通用值对值进行分组:userid 和 ipaddress

    我正在解决数据库中的一个问题 我正在尝试查找使用多个帐户的用户 我有一个用户 ID 和使用的 IP 地址的列表 如下所示 用户 ID IP 地址 1 IP 地址 13 2 IP 地址 23 1 IP 地址 12 4 IP地址56 9 IP
  • PHP - Filter_var 替代方案?

    我构建了一个 php 脚本来输出以表单形式发布的数据 但遇到了问题 网站将运行的服务器运行 PHP 5 1 6 此版本的 PHP 不支持 filter var 我需要知道短期内的替代方案 最好是昨天 但在 Google 或 Stack Ov
  • 将 div 文本分配给变量然后显示它

    我有一个简单的任务 我试图完成学习 JavaScript 但一直无法找到明确的答案 这是代码 div Testing div 基本上我希望将方框 div 中的文本存储到变量中 然后 我想在页面的不同部分显示该变量的文本 使用上面的代码我得到
  • 更改javascript nodejs中所有页面的href url

    我已经实现了具有多种语言下拉菜单的引导导航栏 当我选择语言时 它将翻译页面 如何更改其他页面的 url 和按钮文本 当我选择french 将所有网址更改为 fr about and fr contact 如何使用 JavaScript 进行

随机推荐

  • 预先填充的数据库。现在我想添加更多数据而不弄乱预先存在的数据

    我已经设置了一个应用程序 它预先填充了数据 将数据库复制到项目的存储中 使用 CoreDataBooks 示例 方法 有什么方法可以预填充核心数据吗 https stackoverflow com questions 2230354 any
  • 红宝石中的反射?

    我很好奇这是如何运作的 例如 如果我创建一个基于工厂模式的类 您可以在其中 注册 类以供以后使用 然后执行类似的操作 FactoryClass register YourClassName param param FactoryClass
  • 使用管道进行 awk 打印在 Jupyter Notebook 中无法使用 iPython

    因此 下面的命令不会在带有 iPython 的 Jupyter Notebook 中提供任何输出 IP 62 172 72 131 cat hits csv grep IP awk print 1 我尝试过双 符号和单 符号 但都不起作用
  • Twitter Bootstrap 按钮在 Firefox 和 Chrome 中奇怪地改变渲染

    我有一个问题 我试图用我自己的颜色覆盖 twitter bootstrap v 2 0 3 主按钮 并且它在 IE 中工作正常 但在 FireFox 或 Chrome 中不起作用 因此 在我的页面上 我首先链接到 bootstrap css
  • 如何将字节数组转换为字符串[重复]

    这个问题在这里已经有答案了 我创建了一个包含两个字符串的字节数组 如何将字节数组转换为字符串 var binWriter new BinaryWriter new MemoryStream binWriter Write value1 bi
  • 快速展开的解决方法

    那么针对这个问题的回答是 Xcode 6 Storyboard Unwind Segue 与 Swift 未连接退出 https stackoverflow com questions 24029586 xcode 6 storyboard
  • 查找 3D 坐标是否已被使用的最快方法

    使用 C 和 Qt 我需要处理大量 3D 坐标 具体来说 当我收到 3D 坐标 由 3 个双精度数组成 时 我需要检查列表是否已处理该坐标 如果没有 那么我处理它并将其添加到列表 或容器 中 坐标量可能会变得非常大 因此我需要将处理后的坐标
  • 在路由定义中间使用贪婪路由参数

    我正在尝试创建遵循树导航系统结构的路线 即我想将树中的整个路径包含在我的路线中 所以如果我有一棵像这样的树 Computers Software 发展 Graphics Hardware CPU 显卡 然后我希望能够有这样的路线 site
  • 在 Spring MVC 控制器中注入 Jaxb2Marshaller

    我正在尝试将静态 xml 转换为控制器类中的 POJO 解组 我正在使用 Jaxb2Marshaller 并在我的中按以下方式进行配置根上下文
  • FactoryGirl 覆盖关联对象的属性

    这可能很简单 但我在任何地方都找不到例子 我有两个工厂 FactoryGirl define do factory profile do user title director bio I am very good at things li
  • 可以覆盖位于 jar 依赖项中的 persistence.xml 中的属性

    我有一个 java ee Web 应用程序 它使用打包为 jar 依赖项 实体类 EJB 存储库 persistence xml 的持久性单元 为了让 Web 应用程序运行一些验收测试 我需要覆盖打包的 persistence xml 中的
  • 如何将 3 位毫秒的因子转换为 R 中的日期时间?

    我这样对 t 对象进行计时 t lt c 2016 10 19 00 00 00 000 我需要转换为 POSIXct 如下所示 as POSIXct t format Y m d H M OS 2016 10 19 EDT 我失去了小时
  • 使用字典查找更新 pandas 列

    有一个数据框 df import pandas as pd import numpy as np i dog cat rabbit elephant 3 df pd DataFrame np random randn 12 2 index
  • 如何在 SQL Server 中导入 DBF 文件

    如何在 SQL Server 中导入 FoxPro DBF 文件 使用链接服务器或使用 openrowset 例如 SELECT into SomeTable FROM OPENROWSET MSDASQL Driver Microsoft
  • 协程和 while 循环

    我一直在研究沿着从 Navmesh Unity3d 获得的路径的对象移动 我正在使用协程 其中我用 while 循环控制它 正如我所展示的 public void DrawPath NavMeshPath pathParameter Gam
  • Stripe - 定期付款中包含的附加发票项目

    我在订阅中添加发票项目时遇到问题 目前我的头撞在墙上 我已经在 stripe 上创建了一个发票项目 并且我希望将发票项目包含在定期付款中 这是我的代码 它在第一张发票上添加发票项目 但不在下一张发票上添加发票项目 new customer
  • 如何自定义表单身份验证 cookie 名称?

    我有 2 个网站在不同端口的本地主机上运行 由于浏览器在发送 cookie 时不区分端口号 因此我的表单身份验证票证从一个站点发送到另一个站点 我该如何解决这个问题 我认为一个好的解决方案是更改表单身份验证票或其中一个网站 但我不知道如何执
  • 如何在浏览器刷新后保持 React 组件状态

    感谢您阅读我的第一个问题 我尝试使用react react router 和 firebase 来使用共享根进行身份验证 所以 我想保留App js的用户状态 但是当我尝试刷新浏览器时 找不到用户状态 我尝试保存到本地存储 但是有没有办法在
  • 使用 ASP.NET AJAX 和更新面板时如何处理视图状态的想法

    这是我编写的一个类 用于解决我在视图状态方面遇到的一些问题 它将信息存储在用户会话中并增加一个值来跟踪要显示的状态 困难在于不支持后退按钮 我最初这样做的原因是 在 AJAX 出现之前 视图状态被发送到客户端而不是存储在服务器上 我认为通过
  • optgroup 标签并选择不重复的选项组[重复]

    这个问题在这里已经有答案了 按类别对项目进行分组是可行的 但它不会将该类别的所有产品放在一个中optgroup但重复它 所有项目应位于一组中 而不是作为重复组分开