php使用while两次[重复]

uyto3xhc  于 2022-11-21  发布在  PHP
关注(0)|答案(2)|浏览(230)

此问题在此处已有答案

How can I use mysqli_fetch_array() twice?(4个答案)
21小时前关门了。
我现在是php的新手,但是在做了一些测试之后,我知道while不能使用两次,但是我不知道如何重置它。
我看到在某些情况下人们使用reset($variable),但在我的情况下似乎不起作用。
如果有问题的话,我试图使用mysqli来检索我的下拉菜单作为一个选择,第一个工作,但第二个根本不工作。

<?php 
                    echo '<select>';
                    while(list($stateID, $stateName) = $result->fetch_row())
                    {   
                echo '<option value="$stateName">';
                echo "$stateName";
                echo '</option>';
                    } 
                    echo '</select>';
                    ?>
                <br>
                <br>
                To: &nbsp; &nbsp;
            <?php 
                 echo '<select>';
                    while(list($stateID, $stateName) = $result2->fetch_row())
                    {   
                echo '<option value="$stateName">';
                echo "$stateName";
                echo '</option>';
                    }
            echo '</select>';
                    ?>

另外,如果需要的话,这里是我在mysql中搜索的结果。

<?php
include 'connect.php';
$query = "SELECT * FROM LOCATION";
$result = $mysqli->query($query, MYSQLI_STORE_RESULT);
$result2 = $mysqli->query($query, MYSQLI_STORE_RESULT);
if(!$result) {
    echo($mysqli->error);
    exit();
}
?>

虽然这个方法可以在我创建了2个变量并得到结果1和2的情况下工作,但我有一种感觉,这不是正确的方法,特别是在我需要一遍又一遍地重用相同代码的情况下。

oyxsuwqo

oyxsuwqo1#

在这些while语句中,我们所做的是遍历从数据库中获取的行列表。确实,我们不能对列表进行两次迭代 *,所以我们可以尝试一些不同的方法:遍历列表一次,并保存结果以便重复使用。例如:
在查询数据库后执行以下操作:

$data = [];
while(list($stateID, $stateName) = $result->fetch_row())
{   
    $data[] = [ 'stateID' => $stateID, 'stateName' => $stateName ];
}

我在这里所做的就是遍历行列表,并将数据保存到一个变量中。现在,您可以使用该变量,而不必尝试访问MySQL结果:

echo '<select>';
foreach ($data as $d) {
    echo '<option value="'.$d['stateName'].'">";
    echo $d['stateName'];
    echo '</option>';
}

由于数据存储在数组中,因此您可以根据需要多次使用它。

  • 可以重置MySQL结果集上的指针,但我的方法更简单,而且(可能)性能更好,因为您已经将所需的数据复制到了一个普通的PHP数组中
fzwojiic

fzwojiic2#

或者,我们可以使用

方法一

(1)使用free_result()释放与结果相关的内存,然后(2)再次执行相同的查询。
例如,如果我们有一个名为“test”的表,其中包含字段“serial”(auto_increment),并且有几条记录
以下第二次迭代将失败:

<?php
$mysqli = new mysqli($host,$user,$pw,$db);

$sql = "SELECT * FROM test";
$result = $mysqli -> query($sql);

while ($row = $result -> fetch_array(MYSQLI_ASSOC)) {
echo $row["serial"]; 
echo "<br>";
}

while ($row = $result -> fetch_array(MYSQLI_ASSOC)) {
echo $row["serial"]; 
echo "<br>";
}
?>

但对于下面的代码,第一次和第二次迭代都将成功

<?php
$mysqli = new mysqli($host,$user,$pw,$db);

$sql = "SELECT * FROM test";
$result = $mysqli -> query($sql);

while ($row = $result -> fetch_array(MYSQLI_ASSOC)) {
echo $row["serial"]; 
echo "<br>";
}

$result -> free_result();
$result = $mysqli -> query($sql);

while ($row = $result -> fetch_array(MYSQLI_ASSOC)) {
echo $row["serial"]; 
echo "<br>";
}
?>

方法二

使用mysqli_data_seek($result, 0);移回表的第一条记录

<?php
$mysqli = new mysqli($host,$user,$pw,$db);

$sql = "SELECT * FROM test6";
$result = $mysqli -> query($sql);

while ($row = $result -> fetch_array(MYSQLI_ASSOC)) {
echo $row["serial"]; 
echo "<br>";
}

// go back to top
mysqli_data_seek($result, 0); 

while ($row = $result -> fetch_array(MYSQLI_ASSOC)) {
echo $row["serial"]; 
echo "<br>";
}
?>

相关问题