while循环无限重复

Seb*_*bas 0 php mysql forms drop-down-menu

我有一个while循环,使用mysql表中的值填充下拉框.只有两个匹配的记录,它一遍又一遍地重复它们.我如何只显示一次记录?:

$query = "SELECT * FROM members, sportevents, dates, results, event, userlogin ". 
         "INNER JOIN members AS m ON userlogin.id = m.id " .
         "WHERE userlogin.username = '$un' " . 
         "AND sportevents.id = members.id " . 
         "AND sportevents.event_id = event.id " .
         "AND sportevents.date_id = dates.id " .
         "AND sportevents.result_id = results.id";

echo "<form method='POST' action='display.php'>";
echo "Please Select Your Event<br />";
echo "<select name='event'>";
echo "<option>Select Your Event</option>";
$results = mysql_query($query)
    or die(mysql_error());
    while ($row = mysql_fetch_array($results)) {

    echo "<option>";
    echo $row['eventname'];
    echo "</option>";
                                               }

echo "</select>";
echo "<input type='submit' value='Go'>";
echo "</form>";
Run Code Online (Sandbox Code Playgroud)

Mar*_*c B 6

您是否尝试在mysql监视器中手动运行该查询?代码中的任何内容都不会产生无限循环,因此很可能您的查询没有按预期进行连接,并且正在执行跨产品类型的事情并创建"重复"记录.

特别是,您的查询看起来非常可疑 - 您正在使用惰性"来自多个表"方法,而不是显式指定连接类型,并且您正在使用成员表两次(FROM members ...INNER JOIN members).您没有在原始成员表和加入/别名表之间指定关系m,因此很可能您正在进行members * members跨产品提取.


假设您似乎只为您的下拉列表提取事件名称,您可以尝试删除未使用的表 - 沟渠datesresults.这将简化相当大的事情,然后(猜测)您可以将查询减少到:

SELECT event.id, event.eventname
FROM event
INNER JOIN sportevents ON event.id = sportevents.event_id
INNER JOIN members ON sportevents.id = members.id
INNER JOIN userlogins ON members.id = userlogins.id
WHERE userlogins.username = '$un'
Run Code Online (Sandbox Code Playgroud)

我不知道成员/用户登录是否需要加入 - 它似乎只是将sportevents.id提供给成员,但是在不知道您的数据库架构的情况下,我尝试尽可能地重新创建原始查询.