Php mysqli_fetch_数组迭代问题

Php mysqli_fetch_数组迭代问题,php,mysql,mysqli,Php,Mysql,Mysqli,我有一个使用PHP和MySQL数据库动态生成的页面。该页面显示有关事件的信息,并列出事件将运行的日期 我的数据库包含以下相关表: 事件-包含事件名称、成本等 场馆-包含场馆信息 实例-包含活动id、场馆id、该场馆的活动运行日期以及该实例的容量 注册-包含实例id和与会者id 为了获取所有信息以实际显示事件信息,我使用以下代码: $eid = $_GET['event_id']; $q = "SELECT e.event_name, e.event_description, e.

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

我的数据库包含以下相关表:

事件
-包含事件名称、成本等

场馆
-包含场馆信息

实例
-包含活动id、场馆id、该场馆的活动运行日期以及该实例的容量

注册
-包含实例id和与会者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\u 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));';
do
{
$list_instance=$row['instance_id'];
$qRegs=“从注册中选择计数(代表id)作为注册表
其中registration.instance_id=$list_instance”;
$rRegs=mysqli_查询($dbc,$qRegs);
$registrations=mysqli\u fetch\u对象($rRegs);
$capacity=$row['instance_cap'];
$availability=$capacity-$registrations->regs;
如果($availability>0){//如果活动有可用的位置。。。
如果($cur\u-vention!=$row['vention\u-id'])//并且如果当前场地与场地id不同
{
echo'
  • ” $cur_vention=$row['vention_id']; echo'.$row['vention_name'].';//显示场馆名称 } echo“”//显示当前实例的日期 echo“
  • ”;//关闭列表标记 } }而($row=mysqli_fetch_数组($r,mysqli_ASSOC));
    我遇到的问题是,它忽略了第一个实例,直接跳到了第二个实例。我知道这可能是因为我已经调用了两次mysqli_fetch_array,所以我如何才能使它不发生这种情况呢

    mysqli_data_seek ( $r , 0 );
    
    在第二个mysqli_fetch_数组重置指向第一个实例的内部指针之前。

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

    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
    
    当然,这是未经测试的,因此可能无法正常工作


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

    应该能够将其合并到一个查询中,并直接使用结果。@TiesonT。鉴于每个事件都有多个实例,我看不出如何做到这一点。我承认SQL不是我的强项,但是试着在MySQL Workbench或phpMyAdmin中运行下面的更新查询,看看你是否得到了你想要的结果。或者跳过第一个
    $row=
    ,执行“while循环”而不是“dowhile循环”,这不起作用——也许我把它放错地方了?我把它放在
    do
    前面,这会给出一个错误-'where子句'@elendilhtheall'中的'Unknown column'regs',好的,最后一次尝试;请参阅上面更新的查询。可以。为了帮助我理解这里发生了什么,我是否正确地认为应该只获得可用的实例(即注册数少于容量)?所以我不需要做任何可用性检查,我只需要输出结果?@elendilhthetall是的。子查询应返回匹配注册的计数。然后将该值与“当前行”的
    instance\u cap
    值进行比较。如果计算结果为false,则该行将从结果集中排除。@elendilhtall您还需要查看准备好的语句;我没有注意到在查询字符串中注入
    $eid
    ,这通常是个坏主意。