Php mysqli_fetch_数组迭代问题
我有一个使用PHP和MySQL数据库动态生成的页面。该页面显示有关事件的信息,并列出事件将运行的日期 我的数据库包含以下相关表: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.
事件
-包含事件名称、成本等
场馆
-包含场馆信息
实例
-包含活动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
,这通常是个坏主意。