mysqli_fetch_array迭代问题

时间:2014-01-06 10:27:17

标签: php mysql mysqli

我有一个使用PHP和MySQL数据库动态生成的页面。该页面显示有关事件的信息,并列出事件将运行的日期。

我的数据库有以下相关表格:

events - 包含事件名称,费用等

venue - 包含场地信息

instance - 包含event_id,venue_id,该会场的活动日期以及该实例的容量。

registration - 包含instance_id和attendee_id。

要获取实际显示事件信息的所有信息,我使用以下代码:

$eid = $_GET['event_id'];
        $q = "SELECT e.event_name, e.event_description, e.event_byline, e.event_benefit, e.event_cost, e.event_exam, e.event_resi, i.venue_id, i.instance_id, i.instance_cap, v.venue_name, DATE_FORMAT( i.instance_date,  '%M %D, %Y' ) AS DATE
        FROM events AS e
        INNER JOIN instance AS i ON e.event_id = i.event_id
        INNER JOIN venue AS v ON i.venue_id = v.venue_id
        WHERE e.event_id = $eid
        ORDER BY i.venue_id, i.instance_date";

        $cur_venue = 0;
        $r = @mysqli_query ($dbc,$q) or die(mysqli_error($dbc));
        $row = mysqli_fetch_array($r, MYSQLI_ASSOC);

现在,我想要做的是显示一个列表,按地点排序,相关事件的实例,我已经做了一点。但是,我还想做的是显示实例,如果 该特定实例上还有空格。

因为我知道每个实例的容量(来自我的instance_cap列),并且我可以COUNT注册到每个实例的与会者数量,所以我认为我可以这样做:

do
{
    $list_instance = $row['instance_id'];

    $qRegs = "SELECT COUNT(delegate_id) AS regs FROM registration
    WHERE registration.instance_id = $list_instance";
    $rRegs = mysqli_query($dbc,$qRegs);
    $registrations = mysqli_fetch_object($rRegs);

    $capacity = $row['instance_cap'];

    $availability = $capacity - $registrations->regs;

    if ($availability > 0){ //if event has places available...
        if ($cur_venue != $row['venue_id']) //and if the current venue is not the same as the venue id
        {
            echo '<li id="'.$row['venue_name'].'">'
            $cur_venue = $row['venue_id']; 
            echo '<h4>'.$row['venue_name'].'</h4>';//display the venue name
        }
        echo '<a href="#">'.$row['DATE'].'</a>' //display the date for current instance
        echo '</li>';//close list tag
    }
} while ($row = mysqli_fetch_array($r, MYSQLI_ASSOC));';

我遇到的问题是,这会错过第一个实例并直接跳到第二个实例。我知道这可能是因为我已经两次调用mysqli_fetch_array,所以我怎么能这样做才能不会发生这种情况?

2 个答案:

答案 0 :(得分:1)

mysqli_data_seek ( $r , 0 );

在第二个mysqli_fetch_array之前将内部指针重置为第一个实例。

答案 1 :(得分:1)

应该能够运行一个查询,然后只使用结果集。试试这个:

SELECT e.event_name, e.event_description, e.event_byline, 
e.event_benefit, e.event_cost, e.event_exam, e.event_resi, 
i.venue_id, i.instance_id, i.instance_cap, v.venue_name, 
DATE_FORMAT( i.instance_date,  '%M %D, %Y' ) AS DATE
FROM events AS e
INNER JOIN instance AS i ON e.event_id = i.event_id
INNER JOIN venue AS v ON i.venue_id = v.venue_id
WHERE e.event_id = $eid AND i.instance_cap > (SELECT COUNT(r.delegate_id) FROM registration AS r WHERE r.instance_id = i.instance_id)
ORDER BY i.venue_id, i.instance_date

当然,这是未经测试的,所以它可能无法正常工作。

编辑:子查询可能更正确。请参阅上面编辑的查询。