2014-01-06 6 views
0

У меня есть страница, которая динамически генерируется с использованием PHP и базы данных MySQL. На странице отображается информация о событии и перечислены даты запуска этого события.mysqli_fetch_array итерационная проблема

Моя база данных имеет следующие соответствующие таблицы:

events - содержащие название события, стоимость т.д.,

venue - содержащие информацию на месте проведения

instance - содержащие event_id, venue_id, дату события в этом месте будет работать, и возможности для этого экземпляра.

registration - содержащий экземпляр_и_и_ и посетитель_ee_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 количество участников, зарегистрированных в каждом конкретном случае, я полагаю, что я могу сделать это thuswise:

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));'; 

Проблема I что это пропустит первый экземпляр и проскакивает прямо ко второму. Я понимаю, что это, вероятно, связано с тем, что я дважды вызывал mysqli_fetch_array, так как я могу работать так, чтобы этого не случилось?

+0

Необходимо укрепить это в одном запросе и просто использовать результаты напрямую. –

+0

@TiesonT. Я не вижу, как это сделать, учитывая, что есть несколько экземпляров каждого события. Я полный noob, хотя :) – ElendilTheTall

+0

Я признаю, что SQL не является моим сильным пакетом, но попробуйте запустить обновленный запрос ниже в MySQL Workbench или phpMyAdmin и посмотреть, получился ли результат. –

ответ

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 

Конечно, это не проверено, поэтому оно может не работать как есть.

РЕДАКТИРОВАТЬ: Возможно, более вероятен дополнительный запрос. См. Отредактированный запрос выше.

+0

Это дает ошибку - 'Unknown column' regs 'in' where clause ' – ElendilTheTall

+0

@ElendilTheTall Хорошо, последняя попытка; см. обновленный запрос выше. –

+0

сделаю. Чтобы помочь мне понять, что здесь происходит, могу ли я правильно подумать, что в этом случае должны появляться только экземпляры, которые имеют доступность (т.е. меньше регистраций, чем емкость)? Поэтому мне не нужно проверять доступность, мне просто нужно выводить результаты? – ElendilTheTall

1

Поместите

mysqli_data_seek ($r , 0); 

перед вторым mysqli_fetch_array, чтобы сбросить внутренний указатель на первый экземпляр.

+0

Или пропустите первый '$ row =' и сделайте _'while цикл'_ вместо _'do while loop'_ – Michel

+0

Это не сработало - возможно, я помещаю его в неправильное место? Я помещаю это прямо перед 'do' – ElendilTheTall

+0

Эта работа _did_, я просто идиот.Спасибо :) – ElendilTheTall

Смежные вопросы