PHP mysqli while循环调用两次

时间:2016-06-22 12:41:28

标签: php mysqli while-loop tabs

我有这个代码:         

$q = 'SELECT * FROM languages ORDER BY id DESC';
$r = mysqli_query($dbc, $q);

while($langs = mysqli_fetch_assoc($r)){

$l_id = $langs['id'];
$l_name =  $langs['name_en'];

?>

<li <?php if($l_id == '1'){ echo 'class="active"'; }?>><a href="#<?php echo $l_name;?>" data-toggle="tab"><?php echo $l_name;?></a></li>        

<?php } // closing 1st while loop 
?>

</ul>
<div class="tab-content">

    <?php 

    $q = 'SELECT * FROM languages ORDER BY id DESC';
    $r = mysqli_query($dbc, $q);

    while($langs = mysqli_fetch_assoc($r)){

    $l_id = $langs['id'];
    $l_lang = $langs['language'];
    $l_name = $langs['name_en'];

    ?>
    <div class="tab-pane fade <?php if($l_id == '1'){ echo 'in active'; }?>" id="<?php echo $l_name;?>">                    

    <div class="form-group col-xs-4">                           
        <label for="title_<?php echo $l_lang;?>">Title:</label>
        <input class="form-control" type="text" name="title_<?php echo $l_lang;?>" id="title_<?php echo $l_lang;?>" value="<?php echo $opened['title_'.$l_lang.'']; ?>" placeholder="Page Title">
    </div>

    <div class="form-group col-xs-4">
        <label for="header_<?php echo $l_lang;?>">Header:</label>
        <input class="form-control" type="text" name="header_<?php echo $l_lang;?>" id="header_<?php echo $l_lang;?>" value="<?php echo $opened['header_'.$l_lang.'']; ?>" placeholder="Page Header">
    </div>

    <div class="form-group col-xs-<?php if($page_type == 'tour'){ echo 8;}else {echo 12;} ?>">
        <label for="body_<?php echo $l_lang;?>">Body:</label>
        <textarea class="form-control editor" name="body_<?php echo $l_lang;?>" id="body_<?php echo $l_lang;?>" rows="7" placeholder="Page Body"><?php echo $opened['body_'.$l_lang.'']; ?></textarea>      
    </div>
 </div>
 <?php } //closing 2nd while loop 
?>  
</div>

运行它时,结果是一个标签形式(我从上面跳过表单标签和一些html,以减少代码写入),一切正常。

我的问题是:

如何获得相同的输出,但只有一个查询和while循环? 有可能使这个功能?任何提示?

谢谢!

3 个答案:

答案 0 :(得分:2)

我认为你必须循环两次,但你根本不需要进行两次查询!

使用mysqli_fetch_all将结果存储在数组中,然后循环遍历

例如:

$q = 'SELECT * FROM languages ORDER BY id DESC';
$r = mysqli_query($dbc, $q);
$langs = mysqli_fetch_all($r);

foreach($langs as $lang){
    //render links
}

//...

foreach($langs as $lang){
    //render tabs
}

您的脚本运行得更快

答案 1 :(得分:0)

尝试

<?php

function get_rows()
{
    $q = 'SELECT * FROM languages ORDER BY id DESC';
    $r = mysqli_query($dbc, $q);
    $languages = array();
    while($langs = mysqli_fetch_assoc($r))
    {
        $languages[] = $langs;
    }
    return $languages;
}
$languages = get_rows();
if($languages != false)
{
    ?>
    <ul>
        <?php
        foreach($languages as $langs)
        {

            $l_id = $langs['id'];
            $l_name = $langs['name_en'];
            ?>
            <li <?php
            if($l_id == '1')
            {
                echo 'class="active"';
            }
            ?>><a href="#<?php echo $l_name; ?>" data-toggle="tab"><?php echo $l_name; ?></a></li>     
                <?php
            }
            ?>
    </ul>
    <div class="tab-content">
        <?php
        foreach($languages as $langs)
        {
            $l_id = $langs['id'];
            $l_lang = $langs['language'];
            $l_name = $langs['name_en'];
            ?>
            <div class="tab-pane fade <?php
            if($l_id == '1')
            {
                echo 'in active';
            }
            ?>" id="<?php echo $l_name; ?>">                    

                <div class="form-group col-xs-4">                           
                    <label for="title_<?php echo $l_lang; ?>">Title:</label>
                    <input class="form-control" type="text" name="title_<?php echo $l_lang; ?>" id="title_<?php echo $l_lang; ?>" value="<?php echo $opened['title_' . $l_lang . '']; ?>" placeholder="Page Title">
                </div>

                <div class="form-group col-xs-4">
                    <label for="header_<?php echo $l_lang; ?>">Header:</label>
                    <input class="form-control" type="text" name="header_<?php echo $l_lang; ?>" id="header_<?php echo $l_lang; ?>" value="<?php echo $opened['header_' . $l_lang . '']; ?>" placeholder="Page Header">
                </div>

                <div class="form-group col-xs-<?php
                if($page_type == 'tour')
                {
                    echo 8;
                }
                else
                {
                    echo 12;
                }
                ?>">
                    <label for="body_<?php echo $l_lang; ?>">Body:</label>
                    <textarea class="form-control editor" name="body_<?php echo $l_lang; ?>" id="body_<?php echo $l_lang; ?>" rows="7" placeholder="Page Body"><?php echo $opened['body_' . $l_lang . '']; ?></textarea>      
                </div>
            </div>
        <?php } ?> 
    </div>

    <?php
}
?>

答案 2 :(得分:0)

在第一次迭代某个数组时保存结果,然后第二次迭代这个数组:

$tmp_array = array();
while ($langs = mysqli_fetch_assoc($r)){
    $tmp_array[] = $langs;
}

//some code here

//and second array
foreach ($tmp_array as $langs) {
//more code here
}