![](/img/trans.png)
[英]Select multiple options, use them as array, and retrieve data from database without loading page
[英]speedup loading select options from sql database
我有一个添加项表单,其中有一些输入项和4个选择项,每当我单击添加/编辑记录按钮时,大约需要2-3s的时间来将所有可能的值填写到表单中。 我想知道是否有任何方法可以使sql数据库中的加载选择选项更快? (例如查询缓存或其他我可能不知道的方式)。 这是我用于加载选择选项的机制的示例:
JS:
loadSelectOptions("tab1"); //1600 options
loadSelectOptions("tab2"); //1200
loadSelectOptions("tab3"); //400
loadSelectOptions("tab4"); //100
function loadSelectOptions(elmId) {
$.post(
"queries.php",
{getValues:elmId},
function(data) {
$("#"+elmId).empty();
for (var i = 0, len = data.length; i < len; i++) {
$("#"+elmId).append(data[i]);
};
$("#"+elmId).selectpicker("refresh");
},
"json"
);
}
PHP(queries.php):
if (isset($_POST["getValues"]) && (in_array($_POST["getValues"], array("tab1","tab2","tab3","tab4")))) {
$table = $_POST["getValues"];
$sql = "SELECT id, name FROM {$table} WHERE active='Y' ORDER BY name";
$result = mysqli_query($con, $sql);
$selectValues = array();
$selectValues[] = "<option value=0> [Select a value] </option>";
while ($row = mysqli_fetch_array($result)) {
$selectValues[] = "<option value='".$row["id"]."'>".$row["name"]."</option>";
}
echo json_encode($selectValues);
}
请告知我如何简化此机制。 我还有另一种向数据库添加新选择选项的形式(对于admin),因此它应该能够识别何时应该刷新选项列表(例如,更改列表的标志或其他用于缓存机制的标志)。 对于解决此问题,我有一些想法,例如可以加载到JS数组中,然后从中读取,但是我不想使它变得比原本应该的复杂。
您的示例中有很多地方尚待改进,我将首先简要介绍一下。
1)通常,在处理大型数据集时,选择框不是最佳的UI选择
2)像您从php脚本中一样对JSON进行html编码和解码,效率低下/缓慢,因为json必须转义所有html和引号字符。
3)与其构造要返回的结果数组然后构造html客户端,不如构造html字符串服务器端通常更快,这取决于要加载页面的客户端类型。 (这是一个有争议的主题,呈现html服务器与客户端,因此您可以决定自己的立场)。
为了解决1,我建议找到一个更好的ui替代方案,例如可以动态过滤数据的搜索框或类似工具(从而减少数据集和加载时间)。
要解决2,不要对html进行json编码,只需让脚本直接输出html,然后在客户端上将该文本响应用作html。 这也解决了3。
您可以更改您的php以执行以下操作:
echo "<option value='0'>[Select a Value]</option>";
while ($row = mysqli_fetch_array($result)) {
echo "<option value='".$row["id"]."'>".$row["name"]."</option>";
}
然后将您的JavaScript更改为:
$.post(
"queries.php",
{getValues:elmId},
function(data) {
$("#"+elmId).empty();
$("#"+elmId).html(data);
$("#"+elmId).selectpicker("refresh");
}
);
确保您的php脚本的内容类型响应标头为text/html
或jquery的ajax调用可能会尝试将其解释为json,默认情况下为text/html
,因此,如果您未将其设置为application/json
,不用担心
此外,在这种情况下最好使用GET
请求而不是POST
请求,以遵循传统的http REST惯例,您可以在线阅读有关此内容的更多信息。
另一种解决方案是使您的php脚本仅返回数据,而不返回伪html字符串。
例如,您的php可能会变成
$options = array();
while ($row = mysqli_fetch_array($result)) {
array_push($options, array('id' => $row['id'], 'name' => $row['name']));
}
echo json_encode($options);
然后您的JavaScript可能会变成
$.post(
"queries.php",
{getValues:elmId},
function(data) {
$("#"+elmId).empty();
for (var i = 0, len = data.length; i < len; i++) {
var option = data[i];
var html = "<option value='"+option.id+"'>"+option.name+"</option>";
$("#"+elmId).append(html);
};
$("#"+elmId).selectpicker("refresh");
},
"json"
);
第一个选项将提高脚本执行速度(消除html上的json编码),一点点的网络性能(从响应中删除不必要的json格式)和客户端性能(直接获取html,不对数组进行循环)。
第二个选项将提高网络性能,但在客户端上的性能不佳,我建议同时尝试一下,看看哪种更适合您。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.