为什么在使用`mysql_fetch_assoc()`的同一记录集上迭代多次失败?

时间:2011-04-06 00:48:37

标签: php mysql

<?php
session_start();

include '../dbconnect_form_fields.php';

$res = mysql_query("SELECT * FROM form_fields") or die(mysql_error());
echo "<form id='list' action='form_calc.php' method='post'>
<table width='100%' border='1'>
<tr>";
for($i=0;$i<2;$i++) {
    echo "<td><select>";

    while($row = mysql_fetch_assoc($res)){ 
        echo "<option value='".$row['id']."'>".$row['field']." ".$row['price']."</option>";
    }
    echo "</select>
</td>";
}
?>

为什么这段代码会生成一个正确的选择框和一个空的选择框?

我希望它能正确地显示两个相同的选择框,但它不起作用,除非我创建2个不同的变量,每个变量访问数据库以获取相同的信息。

4 个答案:

答案 0 :(得分:3)

因为mysql_fetch_assoc()在结果内部递增其指针,直到它到达结尾并返回FALSE。您需要重置它才能再次开始迭代。

简单的答案是建立一个字符串并echo两次。

我能给你的最好建议是学习PDO并使用它。

答案 1 :(得分:1)

您正在使用While循环运行所有数据库结果。这就是for循环的第二次迭代将不再具有数据库结果的原因。

你可以通过先将数据存储在一个数组中,或者使用这个丑陋的kludge来解决这个问题:

 mysql_data_seek($res, 0);
 while ($row = mysql_fetch_assoc($res)) {

重置指针(@alex所说的),所以你可以两次收到相同的结果。 (可能在这里没问题,因为无论如何mysql接口都可能缓存数据。)

答案 2 :(得分:1)

  

块引用   mysql_fetch_assoc()返回一个关联数组   对应于获取的行和   将内部数据指针向前移动。

More info on mysql_fetch_assoc() can be found here

所以构造一个字符串,因为它耗尽了所有输入:

$str = "";    
while($row = mysql_fetch_assoc($res)){ 
        $str .= "<option value='".$row['id']."'>".$row['field']." ".$row['price']."</option>";
}

echo $str;
echo $str;  

在:

 .= 

位是短手,用于添加到变量的末尾。另一种写作方式是:

$str = $str . "something";

这一切都可以变得更优雅,但是当你学习的时候我会让你在适当的时候解决这个问题:)

答案 3 :(得分:0)

试试这个:

<?php
session_start();

include '../dbconnect_form_fields.php';

$res = mysql_query("SELECT * FROM form_fields") or die(mysql_error());
$options = array();
while($row = mysql_fetch_assoc($res)){ 
            $options[] = "<option value='".$row['id']."'>".$row['field']." ".$row['price']."</option>";
}
echo "<form id='list' action='form_calc.php' method='post'>
<table width='100%' border='1'>
<tr>";
for($i=0;$i<2;$i++) {
    echo "<td><select>";
    echo $options;
    }
    echo "</select>
</td>";
}
?>