<?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个不同的变量,每个变量访问数据库以获取相同的信息。
答案 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>";
}
?>