以前我有一个关于查询的帖子,由于查询而加载很长时间。有人建议我使用microtime()
来检查加载时间长的部件。不幸的是,我无法找到任何问题,因为一切都加载不到0.03秒。由于我长时间的故障排除,该问题被自动删除。经过大量的试验和错误,我发现问题实际上是与模态有多个查询。
发生的情况是,我通过查询加载数据表。现在,我有一个包含按钮的列,该按钮根据选定的行弹出动态数据。该模式位于datatable内的循环内。我的数据表中的数据大约有2000个。现在,此模式还填充了导致加载时间过长的数据。我能够通过错误地从循环中删除模态位置来弄清楚它,从而使它加载得更快。
场景编码
<table>
<thead></thead>
<tbody>
//insert query here
//while loop here
{ -- note the brace
<tr>
<td>//random value</td>
<td> <button>
<modal>
</td>
</tr>
} -- note the brace
</tbody>
</table>
样本编码
<button type="button" class="btn btn-info" data-target="#updateProc<?php echo $row['id'] ?>" data-toggle="modal"><i class="fa-solid fa-pencil"></i></button>
<div class="modal fade" id="updateProc<?php echo $row['id'] ?>" tabindex="-1" role="dialog" aria-labelledby="updateProc" aria-hidden="true">
<div class="modal-body">
<form>
<div class="form-group">
<label for="sponsor">Select Value</label>
<select class="form-control" name="value" >
<option value="">Select value</option>
<?php
$query = mysqli_query($db,"Select id, val from tbl;");
while ($row = mysqli_fetch_array($query)) {
//will compare existing to table to showcase selected value
if ($previous_row_from_query['id']==$row ['id']){ ?>
<option value="<?php echo $row ['id']; ?>" selected><?php echo $row ['val']; ?></option>
<?php }
else{?>
<option value="<?php echo $row ['id']; ?>"><?php echo $row ['val']; ?></option>
<?php }
}?>
</select>
<small id="val" class="form-text text-muted ml-2">Choose value.</small>
</div>
</form>
</div>
</div>
目前,我使用相同的编码模式在这个模型中涉及6
查询,因为这更多地是为了编辑/更新数据。在上面的代码中,还有一个if else statement
,我用它来比较检索到的值和现有值的数据,以展示selected option
。
目前,我正试图找到一种方法,使数据不提前加载到modal上,因为从while loop
中删除modal可以解决这个问题。
有没有一种方法来简化代码,其中数据只会加载,如果它被称为通过按钮点击,而不是填充页面加载?
2条答案
按热度按时间rkttyhzu1#
这里有几种模式可以使用,具体取决于数据的实际组织方式。
例如:
在上面,您的查询似乎对所有行都完全相同。因此,您可以在循环外预先计算它,将所有行保存在数组中,然后使用数组,只需修改循环的一行:
一般来说,您可能会在M个不同的表行中有N个不同的查询,其中M〉〉N。然后,您可以预先运行查询并将其保存在子数组中,然后选择哪个数组:
另一种可能性是在Javascript中填充行 * 客户端 *,例如使用自定义库,如 Handlebars,或手动。这样做的好处是可以保存大量HTML的传输时间。
你可以在 AJAX 中这样做。你 * 根本 * 不 * 发出任何查询 *,只需要使用一个按钮来“解锁”选择。在表中,所有相关的SELECT都被一个可能保存当前值的按钮替换,用于show:
查询必须经过服务器端验证当然。你可不想惹上小鲍比·泰布斯
例如使用jQuery,您激活类“ajaxize”,因此当您单击值时,该值将被SELECT替换:
您还需要将当前值保存在另一个数据属性中,以便能够在遍历OPTIONS时预先选择当前值。
PHP“ajaxized.php”将获取一个查询并返回一个包含所需行的JSON数组。您可以使用
$.get()
将回复放在浏览器缓存中,以进一步缩短响应时间。您还可以通过使用DataTable库(有几个)来完全实现这一点,它允许您通过 AJAX 加载获得可分页的响应式数据表。虽然(必然)整体较慢,但结果可能 * 看起来 * 要快得多,并且服务器密集度较低。我个人赞成最后一种方法。
u3r8eeie2#
好吧。我找到解决办法了。除了上面的建议(我目前正在研究),我已经找到了一个替代的解决方案。我找到了这个tutorial
所以我在主页之外创建了另一个页面。对于主页面,我修改了按钮以添加
data-id
。然后添加了一个 AJAX ,它将触发一个空白的模态,并将数据从main
页面发布到secondary
页面。代码main.php
main中的空白模式
副页