Php 如何多次使用mysql查询
我在for循环中有这个select菜单,因此查询运行了多次。还有很多这样的查询,所以页面加载速度非常慢Php 如何多次使用mysql查询,php,mysql,Php,Mysql,我在for循环中有这个select菜单,因此查询运行了多次。还有很多这样的查询,所以页面加载速度非常慢 <div class="col-md-4"> <label for="edit_kwaliteit_id['.$i.']">Kwaliteit</label> <div class="form-group input-group has-success has-feedback" id="edit_kwaliteit_id_div['.
<div class="col-md-4">
<label for="edit_kwaliteit_id['.$i.']">Kwaliteit</label>
<div class="form-group input-group has-success has-feedback" id="edit_kwaliteit_id_div['.$i.']">
<span class="input-group-addon"><span style="display: inline-block; width:15px; text-align:center;" class="fab fa-squarespace" aria-hidden="true"></span></span>
<select class="form-control" id="edit_kwaliteit_id['.$i.']" name="edit_kwaliteit_id" onchange="validate_edit_table_1(this, '.$i.')">';
$sql_kwal = "SELECT
id,
kwaliteit
FROM kwaliteit
ORDER BY kwaliteit ASC
";
if(!$res_kwal = mysqli_query($mysqli, $sql_kwal)) { echo '<div class="alert alert-danger text-center" role="alert">Er is helaas iets fout gegaan.</div>'; }
while($row_kwal = mysqli_fetch_array($res_kwal)) {
echo '<option ';if($row_table_1['kwaliteit_id'] == $row_kwal['id']) { echo 'selected="selected"';} echo 'value="'.$row_kwal['id'].'">'.$row_kwal['kwaliteit'].'</option>';
}
echo '
</select>
<span class="glyphicon glyphicon-ok form-control-feedback" id="edit_kwaliteit_id_glyp['.$i.']"></span>
</div>
</div>
夸利特
';
$sql\u kwal=“选择
身份证件
夸利特
来自夸利特
kwaliteit ASC订购
";
如果(!$res_kwal=mysqli_query($mysqli,$sql_kwal)){echo'Er是helaas iets fout gegaan.;}
while($row\u kwal=mysqli\u fetch\u数组($res\u kwal)){
回声“.$row_kwal['kwaliteit']”;
}
回声'
因为每次查询都是相同的,所以我想将查询移出循环,并将查询本身放在循环之前。
差不多
<?php
// some code
$sql_kwal = "SELECT
id,
kwaliteit
FROM kwaliteit
ORDER BY kwaliteit ASC
";
if(!$res_kwal = mysqli_query($mysqli, $sql_kwal)) { echo '<div class="alert alert-danger text-center" role="alert">Er is helaas iets fout gegaan.</div>'; }
// start loop
<div class="col-md-4">
<label for="edit_kwaliteit_id['.$i.']">Kwaliteit</label>
<div class="form-group input-group has-success has-feedback" id="edit_kwaliteit_id_div['.$i.']">
<span class="input-group-addon"><span style="display: inline-block; width:15px; text-align:center;" class="fab fa-squarespace" aria-hidden="true"></span></span>
<select class="form-control" id="edit_kwaliteit_id['.$i.']" name="edit_kwaliteit_id" onchange="validate_edit_table_1(this, '.$i.')">';
while($row_kwal = mysqli_fetch_array($res_kwal)) {
echo '<option ';if($row_table_1['kwaliteit_id'] == $row_kwal['id']) { echo 'selected="selected"';} echo 'value="'.$row_kwal['id'].'">'.$row_kwal['kwaliteit'].'</option>';
}
echo '
</select>
<span class="glyphicon glyphicon-ok form-control-feedback" id="edit_kwaliteit_id_glyp['.$i.']"></span>
</div>
</div>
// end loop
?>
您应该在第一次运行查询时将所有行读入一个数组,然后在for
循环中迭代该数组,例如
$sql_kwal = "SELECT
id,
kwaliteit
FROM kwaliteit
ORDER BY kwaliteit ASC
";
if(!$res_kwal = mysqli_query($mysqli, $sql_kwal)) { echo '<div class="alert alert-danger text-center" role="alert">Er is helaas iets fout gegaan.</div>'; }
$rows = array();
while ($row = mysqli_fetch_array($res_kwal)) {
$rows[] = $row;
}
与
请注意,如果安装了MySQL本机驱动程序(mysqlnd
),则可以使用
$rows = mysqli_fetch_all(MYSQLI_BOTH);
代替while
循环加载$rows
数组
注意
如果有一个特别大的结果集无法加载到内存中,则可以在开始读取结果集之前使用重置数据指针。那么你在哪里
while ($row = mysqli_fetch_array($res_kwal)) {
换成
mysqli_data_seek($res_kwal, 0);
while ($row = mysqli_fetch_array($res_kwal)) {
您应该在第一次运行查询时将所有行读入一个数组,然后在for
循环中迭代该数组,例如
$sql_kwal = "SELECT
id,
kwaliteit
FROM kwaliteit
ORDER BY kwaliteit ASC
";
if(!$res_kwal = mysqli_query($mysqli, $sql_kwal)) { echo '<div class="alert alert-danger text-center" role="alert">Er is helaas iets fout gegaan.</div>'; }
$rows = array();
while ($row = mysqli_fetch_array($res_kwal)) {
$rows[] = $row;
}
与
请注意,如果安装了MySQL本机驱动程序(mysqlnd
),则可以使用
$rows = mysqli_fetch_all(MYSQLI_BOTH);
代替while
循环加载$rows
数组
注意
如果有一个特别大的结果集无法加载到内存中,则可以在开始读取结果集之前使用重置数据指针。那么你在哪里
while ($row = mysqli_fetch_array($res_kwal)) {
换成
mysqli_data_seek($res_kwal, 0);
while ($row = mysqli_fetch_array($res_kwal)) {
您在这里提供的代码似乎缺少外循环,因此我将使用现有的代码
如果这个循环真的减慢了你的页面,你应该考虑使用Ajax来加载页面加载后的菜单内容,例如:
<select class="form-control" id="edit_kwaliteit_id['.$i.']" name="edit_kwaliteit_id" onchange="validate_edit_table_1(this, '.$i.')">';
// add a loader while page loads
<div id="menu-loader"></div>
</select>
Php端点:
// do your query
....
// loop through the result and build your menu
ob_start();
while($row_kwal = mysqli_fetch_array($res_kwal)) {
echo '<option ';if($row_table_1['kwaliteit_id'] == $row_kwal['id']) { echo 'selected="selected"';} echo 'value="'.$row_kwal['id'].'">'.$row_kwal['kwaliteit'].'</option>';
}
$output = ob_get_contents();
ob_end_clean();
echo json_endcode($output); exit();
//执行查询
....
//循环浏览结果并构建菜单
ob_start();
while($row\u kwal=mysqli\u fetch\u数组($res\u kwal)){
回声“.$row_kwal['kwaliteit']”;
}
$output=ob_get_contents();
ob_end_clean();
echo json_endcode($output);退出();
您在这里提供的代码似乎缺少外部循环,因此我将使用现有的代码
如果这个循环真的减慢了你的页面,你应该考虑使用Ajax来加载页面加载后的菜单内容,例如:
<select class="form-control" id="edit_kwaliteit_id['.$i.']" name="edit_kwaliteit_id" onchange="validate_edit_table_1(this, '.$i.')">';
// add a loader while page loads
<div id="menu-loader"></div>
</select>
Php端点:
// do your query
....
// loop through the result and build your menu
ob_start();
while($row_kwal = mysqli_fetch_array($res_kwal)) {
echo '<option ';if($row_table_1['kwaliteit_id'] == $row_kwal['id']) { echo 'selected="selected"';} echo 'value="'.$row_kwal['id'].'">'.$row_kwal['kwaliteit'].'</option>';
}
$output = ob_get_contents();
ob_end_clean();
echo json_endcode($output); exit();
//执行查询
....
//循环浏览结果并构建菜单
ob_start();
while($row\u kwal=mysqli\u fetch\u数组($res\u kwal)){
回声“.$row_kwal['kwaliteit']”;
}
$output=ob_get_contents();
ob_end_clean();
echo json_endcode($output);退出();
可能是范围问题。尝试将if(!$res\u kwal=mysqli\u查询($mysqli,$sql\u kwal)){…
更改为res\u kwal=mysqli\u查询($mysqli,$sql\u kwal);if(!$res\u kwal){…
可能是一个范围问题。尝试将if(!$res kwal=mysqli\u查询($mysqli,$sql\u kwal)){…
更改为res{…
在不加载到数组的情况下对每一行进行迭代不是更好吗?这样,您就不会在大型结果集上遇到问题。我看不到查询中的限制…@JamieBelcher,因为我理解OPs问题,他多次执行同一查询,这很慢。其目的是获取一次数据,然后再执行一次查询n在第一次使用后,每次需要时都从数组中读取它。@JamieBelcher我已经添加了一个备用解决方案,如果结果集的大小有问题,可以使用mysqli\u data\u seek
。考虑到它正被用来进行选择,我认为这不太可能,但拥有选项也无妨。非常非常好:)@Muiter:-)我“我很高兴你喜欢它。在不加载到数组的情况下对每一行进行迭代不是更好吗?这样你就不会在大型结果集上遇到问题。我看不到查询中的限制…@JamieBelcher,因为我理解他多次执行同一查询,这很慢。这样做的目的是一次获取数据。”e,然后在第一次需要时从数组中读取它。@JamieBelcher我已经添加了一个替代解决方案,如果结果集的大小有问题,可以使用mysqli\u data\u seek
。考虑到它被用来进行选择,我认为这不太可能,但拥有选项并没有坏处。非常非常好:)@Mui特:-)我很高兴你喜欢它。