2013-12-10 61 views
0

我有一個MySQL數據庫,有3個表 - events,venues,instanceevents包含有關事件的信息,如事件ID,名稱和說明。 venues包含場地編號和場地名稱。 instance包含事件ID,場所ID和日期。在PHP中循環遍歷MySQL行

我執行連接,並將結果加載到一個數組,所以我可以使用PHP頁面上顯示該事件的信息:

$eid = $_GET['event_id']; 

$q = "SELECT e.event_name, e.event_description, i.venue_id, i.instance_avail, 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 
WHERE e.event_id = $eid"; 

$r = @mysqli_query ($dbc,$q); 
$row = mysqli_fetch_array($r, MYSQLI_ASSOC); 

的名稱和說明只在頁面上使他們很容易出現一次與顯示:

echo $row['event_name'] 

不過,我還需要做的是顯示由場地整理日期的列表,如:

**New York** 

18th December, 2013 
19th January, 2014 
21st February, 2013 

**Washington, DC** 

18th December, 2013 
22nd December, 2013 
12th March, 2014 

我可以使用現有的查詢來做到這一點,還是編寫新的查詢會更簡單?如果是這樣,怎麼樣?另外,我將如何循環顯示場地,然後顯示日期,然後顯示下一個場地等?

+0

如果您有'ORDER BY'城市名,您可以保留查詢。在遍歷所有條目的同時,檢查城市名稱是否與上次迭代的城市名稱相同。如果我至少正確地理解了你的問題:S – Viridis

回答

2

當地點的價值發生變化時,請將其放置。事情是這樣的: -

<?php 

$eid = $_GET['event_id']; 

$q = "SELECT e.event_name, e.event_description, i.venue_id, i.venue_name, i.instance_avail, 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 
WHERE e.event_id = $eid 
ORDER BY i.venue_id, i.instance_date"; 
$cur_venue = 0; 
$r = @mysqli_query ($dbc,$q); 
if ($row = mysqli_fetch_array($r, MYSQLI_ASSOC)) 
{ 
    $cur_venue = $row['venue_id']; 
    echo $row['event_name']."<br />"; 
    echo $row['venue_name']."<br />"; 
    echo $row['DATE']."<br />"; 
    while ($row = mysqli_fetch_array($r, MYSQLI_ASSOC)) 
    { 
     if ($cur_venue != $row['venue_id']) 
     { 
      $cur_venue = $row['venue_id']; 
      echo $row['venue_name']."<br />"; 
     } 
     echo $row['DATE']."<br />"; 
    } 
} 

?> 

可能把它清理乾淨使用do ... while循環: -

<?php 

$eid = $_GET['event_id']; 

$q = "SELECT e.event_name, e.event_description, i.venue_id, i.venue_name, i.instance_avail, 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 
WHERE e.event_id = $eid 
ORDER BY i.venue_id, i.instance_date"; 
$cur_venue = 0; 
$r = @mysqli_query ($dbc,$q); 
if ($row = mysqli_fetch_array($r, MYSQLI_ASSOC)) 
{ 
    echo $row['event_name']."<br />"; 

    do 
    { 
     if ($cur_venue != $row['venue_id']) 
     { 
      $cur_venue = $row['venue_id']; 
      echo $row['venue_name']."<br />"; 
     } 
     echo $row['DATE']."<br />"; 
    } while ($row = mysqli_fetch_array($r, MYSQLI_ASSOC)); 
} 

?> 

編輯 - 曾與測試數據的發揮和下面似乎工作。

<?php 

#------ database connections ------- 
define('MYSQLHOST','localhost'); 
define('MYSQLUSER',''); 
define('MYSQLPASS',''); 
define('MYSQLDATABASE','test'); 
define('MYSQLDATABASE_INTERNAL', '');// sf orders database 

$dbc = mysqli_connect(MYSQLHOST, MYSQLUSER, MYSQLPASS, MYSQLDATABASE); 


$eid = $_GET['course_id']; 

$q = "SELECT e.course_name, e.course_description, i.venue_id, v.venue_name, i.instance_avail, DATE_FORMAT(i.instance_date, '%M %D, %Y') AS DATE 
FROM courses AS e 
INNER JOIN instance AS i ON e.course_id = i.event_id 
INNER JOIN venue AS v ON i.venue_id = v.venue_id 
WHERE e.course_id = $eid 
ORDER BY i.venue_id, i.instance_date"; 
$cur_venue = 0; 
$r = @mysqli_query ($dbc,$q) or die(mysqli_error($dbc)); 
if ($row = mysqli_fetch_array($r, MYSQLI_ASSOC)) 
{ 
    echo $row['course_name']."<br />"; 

    do 
    { 
     if ($cur_venue != $row['venue_id']) 
     { 
      $cur_venue = $row['venue_id']; 
      echo $row['venue_name']."<br />"; 
     } 
     echo $row['DATE']."<br />"; 
    } while ($row = mysqli_fetch_array($r, MYSQLI_ASSOC)); 
} 

?> 
+0

這個工作完美 - 除了它沒有顯示第一個場地或其日期。我在我的測試數據庫中有兩個場地,並且僅顯示第二個場地(venue_id = 2)。編輯:增加了另一個場地,id = 3,它也顯示。那麼循環迭代器的問題? – ElendilTheTall

+0

只需要在WHERE之前添加一個迴音細節(我現在已經編輯了上述內容) – Kickstart

+0

這個功能也完全適用,但實際上只有兩個在第一個場地顯示一個日期。 – ElendilTheTall

1

您可以使用Mysql GROUP_CONCAT

SELECT 
    e.event_name, 
    e.event_description, 
    i.venue_id, 
    i.instance_avail, 
    GROUP_CONCAT(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 
WHERE e.event_id = $eid 
GROUP BY e.event_id 

這會給你可以爆炸在PHP中的數組的所有日期逗號分隔。