从 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 需求。
当您或其他人不可避免地需要改进此用户体验时,阅读起来更容易。
我可以从我的 表 中检索至少 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 需求。
当您或其他人不可避免地需要改进此用户体验时,阅读起来更容易。