在PHP中遍历MySQL行

在PHP中遍历MySQL行,php,mysql,Php,Mysql,我有一个MySQL数据库,有3个表-事件,场馆,实例事件包含事件id、名称和描述等事件信息场馆包含场馆id和场馆名称实例包含活动id、场馆id和日期 我执行连接并将结果加载到数组中,以便使用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

我有一个MySQL数据库,有3个表-
事件
场馆
实例
<代码>事件包含事件id、名称和描述等事件信息<代码>场馆包含场馆id和场馆名称<代码>实例包含活动id、场馆id和日期

我执行连接并将结果加载到数组中,以便使用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

我可以使用现有的查询来实现这一点,还是编写一个新的查询更简单?如果是,怎么做?另外,我如何循环它,以便显示地点、日期、下一个地点等?

您可以使用
Mysql
GROUP\u 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中分解为一个数组。

您可以使用
Mysql
GROUP\u 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中分解为一个数组。

您可以使用
Mysql
GROUP\u 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中分解为一个数组。

您可以使用
Mysql
GROUP\u 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中分解为一个数组。

在发生变化时将地点的值输出。大概是这样的:-

<?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 />";
    }
}

?>

当场地发生变化时,将其值显示出来。大概是这样的:-

<?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 />";
    }
}

?>

当场地发生变化时,将其值显示出来。大概是这样的:-

<?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 />";
    }
}

?>

当场地发生变化时,将其值显示出来。大概是这样的:-

<?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 />";
    }
}

?>


如果按城市名称排序,则可以保留查询。在遍历所有条目时,检查cityname是否与上次迭代的cityname相同。如果我至少正确理解了您的问题:如果您
orderby
cityname,您可以保留查询。在遍历所有条目时,检查cityname是否与上次迭代的cityname相同。如果我至少正确理解了您的问题:如果您
orderby
cityname,您可以保留查询。在遍历所有条目时,检查cityname是否与上次迭代的cityname相同。如果我至少正确理解了您的问题:如果您
orderby
cityname,您可以保留查询。在遍历所有条目时,检查cityname是否与上次迭代的cityname相同。如果我对你的问题理解正确的话,至少是这样的:除了它没有显示第一个地点或日期之外,它工作得非常好。我的测试数据库中有两个场地,它只显示第二个场地(场地id=2)。编辑:添加了另一个场地,id=3,它还显示该场地。那么循环迭代器的问题呢?只需要在WHERE(我现在已经编辑了上面的内容)之前添加一个细节的回声,这也几乎可以完美地工作,但是在第一个地点只显示一个日期,而实际上有两个。Ooops。我想它会把日期推迟,只是因为地点不对。还需要在while循环之前输出场地。还使用do…while(未测试)添加了稍微不同的变体。这删除了两行重复的代码,同样有效,但仍然只输出第一个地点的一个日期。它为其他两个输出多个日期,而不是第一个日期。:)除了没有显示第一个地点或日期之外,这个功能非常有效。我的测试数据库中有两个场地,它只显示第二个场地(场地id=2)。编辑:添加了另一个场地,id=3,它还显示该场地。那么循环迭代器的问题呢?只需要在WHERE(我现在已经编辑了上面的内容)之前添加一个细节的回声,这也几乎可以完美地工作,但是在第一个地点只显示一个日期,而实际上有两个。Ooops。我想它会把日期推迟,只是因为地点不对。还需要在while循环之前输出场地。还使用do…while(未测试)添加了稍微不同的变体。这删除了两行重复的代码,同样有效,但仍然只输出第一个地点的一个日期。它为其他两个输出多个日期,而不是第一个日期。:)除了没有显示第一个地点或日期之外,这个功能非常有效。我的测试数据库中有两个场地,它只显示第二个场地(场地id=2)。编辑:添加了另一个场地,id=3,它还显示该场地。那么循环迭代器的问题呢?只需要在WHERE(我现在已经编辑了上面的内容)之前添加一个细节的回声,这也几乎可以完美地工作,但是在第一个地点只显示一个日期,而实际上有两个。Ooops。我想它会把日期推迟,只是因为地点不对。还需要在while循环之前输出场地。还使用do…while(未测试)添加了稍微不同的变体。这删除了两行重复的代码,同样有效,但仍然只输出第一个地点的一个日期。它为其他两个输出多个日期,而不是第一个日期。:)除了没有显示第一个地点或日期之外,这个功能非常有效。我的测试数据库中有两个场地,它只显示第二个场地(场地id=2)。编辑:添加了另一个场地,id=3,它还显示该场地。那么循环迭代器的问题呢?只需要在WHERE(我现在已经编辑了上面的内容)之前添加一个细节的回声,这也几乎可以完美地工作,但是在第一个地点只显示一个日期,而实际上有两个。Ooops。我想它会把日期推迟,只是因为地点不对。还需要在while循环之前输出场地。还使用do…while(未测试)添加了稍微不同的变体。这将删除两行重复的代码。同样,它可以工作,但仍然只为第一个ven输出一个日期