从 mysql 制作 html 选项列表的最有效方法?

most efficient way of making html options list from mysql?

我可以从我的 中检索至少 5000 条记录 以上的记录,我有四种方法可以做到这一点,但我不知道不知道哪个以及为什么适合我要求的工作,如果记录较少,哪个最好:(Queries)

#---- Rows
SELECT
  a.`id`,
  a.`content`
FROM
  `docs` a;

我对每一行使用 while() 循环:

while ($row = $rows->fetch()) {
  echo "<option value=\"{$row['id']}\">{$row['content']}</option>";
}

#---- Group
SELECT
  GROUP_CONCAT(
    a.`id`,
    ".",
    a.`content`
  ) AS `options`
FROM
  `docs` a;

我使用 explode() + foreach() 循环 (内容自然不允许在其文本中包含“.”):

foreach (explode(",", $options) as $option) {
  $option = explode(".", $option); //[0]: id, [1]: content
  echo "<option value=\"{$option[0]}\">{$option[1]}</option>";
}

#---- HTML Rows
SELECT
  CONCAT("<option value=\"",a.`id`,"\">",a.`content`,"</option>") AS `option`
FROM
  `docs` a;

我在查询中应用html然后使用while()循环:

while ($row = $rows->fetch()) {
  echo $row;
}

#---- HTML Group
SELECT
  GROUP_CONCAT("<option value=\"",a.`id`,"\">",a.`content`,"</option>" SEPARATOR "")
FROM
  `docs` a;

这里的所有内容都已经在查询中进行了打印:

echo $rows->fetch();

您可以使用 JQuery select2 并在其上应用搜索方法,这将通过 AJAX 调用获取数据。我使用 JSON 来填充 select。我在这里添加示例代码,根据您的要求进行修改。

样本HTML

                <select name="ItemID" id="ItemID">
                    <option value="0">--</option>
                </select>

相关javascript

        $("#ItemID").select2({
            minimumInputLength:3,
            ajax: {
                url: 'json/getItemList.php',
                dataType: 'json',
                data: function (params) {
                    return { 
                        Src: params.term
                    };
                },
             processResults: function (data) {
                    var items = [];
                    for (var i = 0; i < data.length; ++i) {
                        items.push({id: data[i][0], text: data[i][1]});
                    }
                    return {
                        results: items,
                    }
             },                  
            },
        });

相关PHP代码

<?php

$Src            = "";
if(isset($_REQUEST['Src']))
    $Src        = $_REQUEST['Src'];

// Write your own code to fetch data, and replace the below line 
//$oList        = $mdb->getItemListJSON3($tcmp->getCompanyID(), $Src, 2);

$jsonStr    =   json_encode($oList);    

print($jsonStr);

?>

我会从表面上接受您客户的要求,即使如果我不得不使用 5000 元素的下拉菜单会让我发疯。

您可以考虑使用 HTML5 datalist element 稍微改进此用户体验。

从 php 的角度来看,您生成此代码的方式可能无关紧要,无需担心。然而,从 MySQL 的角度来看,使用 while 循环的更简单的查询(您的第一选择)更好。为什么?

    如果用它生成长字符串,
  • GROUP_CONCAT() 需要一个设置。读这个。 MySQL and GROUP_CONCAT() maximum length 聪明的开发人员,尤其是面对奇怪的需求时,会保持简单。

  • 逐行处理中型结果集可以减少 php 程序和 MySQL 服务器中的 RAM 需求。

  • 当您或其他人不可避免地需要改进此用户体验时,阅读起来更容易。