PHP SQL结合Foreach中的记录()

时间:2012-06-18 16:06:28

标签: php sql

我正在重新审视这个,因为我正在处理另一个我希望使用相同概念的页面。 This page显示了我目前从MSSQL服务器获取的输出。

我有一张我们的活动发生的场地信息表(姓名,地址等)。另外,我有一张预定实际事件的表格(事件可能在一天内和/或多天内多次发生)。我用查询加入这些表(如下所示)。

<?php
try {
    $dbh = new PDO("sqlsrv:Server=localhost;Database=Sermons", "", "");
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "SELECT TOP (100) PERCENT dbo.TblSermon.Day, dbo.TblSermon.Date, dbo.TblSermon.Time, dbo.TblSermon.Speaker, dbo.TblSermon.Series, dbo.TblSermon.Sarasota, dbo.TblSermon.NonFlc, dbo.TblJoinSermonLocation.MeetingName, dbo.TblLocation.Location, dbo.TblLocation.Pastors, dbo.TblLocation.Address, dbo.TblLocation.City, dbo.TblLocation.State, dbo.TblLocation.Zip, dbo.TblLocation.Country, dbo.TblLocation.Phone, dbo.TblLocation.Email, dbo.TblLocation.WebAddress
        FROM dbo.TblLocation RIGHT OUTER JOIN dbo.TblJoinSermonLocation ON dbo.TblLocation.ID = dbo.TblJoinSermonLocation.Location RIGHT OUTER JOIN dbo.TblSermon ON dbo.TblJoinSermonLocation.Sermon = dbo.TblSermon.ID
        WHERE (dbo.TblSermon.Date >= { fn NOW() })
        ORDER BY dbo.TblSermon.Date, dbo.TblSermon.Time";
    $stmt = $dbh->prepare($sql);
    $stmt->execute(); 
    $stmt->setFetchMode(PDO::FETCH_ASSOC);
    foreach ($stmt as $row) {
        echo "<pre>";
        print_r($row);
        echo "</pre>";
    }
    unset($row);
    $dbh = null;
}
catch(PDOException $e) {
    echo $e->getMessage();
}
?>

因此,当它遍历查询结果时,它会为每条记录创建一个数组。

Array
(
    [Day] => Tuesday
    [Date] => 2012-10-30 00:00:00.000
    [Time] => 07:00 PM
    [Speaker] => Keith Moore
    [Location] => The Ark Church
    [Pastors] => Alan & Joy Clayton
    [Address] => 450 Humble Tank Rd.
    [City] => Conroe
    [State] => TX
    [Zip] => 77305.0
    [Phone] => (936) 756-1988
    [Email] => info@thearkchurch.com
    [WebAddress] => http://www.thearkchurch.org
)
Array
(
    [Day] => Wednesday
    [Date] => 2012-10-31 00:00:00.000
    [Time] => 07:00 PM
    [Speaker] => Keith Moore
    [Location] => The Ark Church
    [Pastors] => Alan & Joy Clayton
    [Address] => 450 Humble Tank Rd.
    [City] => Conroe
    [State] => TX
    [Zip] => 77305.0
    [Phone] => (936) 756-1988
    [Email] => info@thearkchurch.com
    [WebAddress] => http://www.thearkchurch.org
)
Array
(
    [Day] => Tuesday
    [Date] => 2012-11-06 00:00:00.000
    [Time] => 07:00 PM
    [Speaker] => Keith Moore
    [Location] => Fellowship Of Faith Christian Center
    [Pastors] => Michael & Joan Kalstrup
    [Address] => 18999 Hwy. 59
    [City] => Oakland
    [State] => IA
    [Zip] => 51560.0
    [Phone] => (712) 482-3455
    [Email] => ffcc@frontiernet.net
    [WebAddress] => http://www.fellowshipoffaith.cc
)
Array
(
    [Day] => Wednesday
    [Date] => 2012-11-14 00:00:00.000
    [Time] => 07:00 PM
    [Speaker] => Keith Moore
    [Location] => Faith Family Church
    [Pastors] => Michael & Barbara Cameneti
    [Address] => 8200 Freedom Ave NW
    [City] => Canton
    [State] => OH
    [Zip] => 44720.0
    [Phone] => (330) 492-0925
    [Email] => 
    [WebAddress] => http://www.myfaithfamily.com
)

我想要做的是以某种方式组合这些数组,以便每次都不重复场地信息,但每个日期/时间都会显示。

我尝试以数组样式输入它,但无法为它找出合适的多维度。我只是粘贴我希望它显示的方式,因为它最终会如何显示。

The Ark Church
    Contact:
        Alan & Joy Clayton
        450 Humble Tank Rd.
        Conroe, TX  77305
        (936) 756-1988
        info@thearkchurch.com
        http://www.thearkchurch.org
    Meetings:
        Tuesday, 2012-10-30 07:00 PM
        Wednesday, 2012-10-31 07:00 PM

Fellowship Of Faith Christian Center
    Contact:
        Michael & Joan Kalstrup
        18999 Hwy. 59
        Oakland, IA  51560
        (712) 482-3455
        ffcc@frontiernet.net
        http://www.fellowshipoffaith.cc
    Meetings:
        Tuesday, 2012-11-06 07:00 PM

Faith Family Church
    Contact:
        Michael & Barbara Cameneti
        8200 Freedom Ave NW
        Canton, OH  44720
        (330) 492-0925
        http://www.myfaithfamily.com
    Meetings:
        Wednesday, 2012-11-14 07:00 PM

它不一定要像那样结束,但它应该很好地了解我正在寻找的东西。

我不一定来创建一个新数组。我只想一遍又一遍地显示相同的信息。

我想我可以在foreach()中进行某种形式的比较,其中说“如果位置与以前的位置相同”,但我还没弄明白怎么做它(有没有办法通过执行$location1 = [Location]$location2 = [Location]等来缓存上一个变量......?

有一点需要注意......

这些例子没有不同的发言者,但有时也有。我想以某种方式访问​​演讲者。我认为我希望它与实际事件绑定。

JJ

2 个答案:

答案 0 :(得分:0)

一种技巧:如果你有这样的循环:

while ($row = $query->fetch(PDO::FETCH_NUM) ) {
    list($time,$place,$etc) = $row;
    // display formatted data
}

试试这个:

$row = $query->fetch();
do {
    list($time,$place,$etc) = $row;
    $row = $query->fetch(PDO::FETCH_NUM);
    if ($time != $row[0] && $place != $row[1] && $etc != $row[2]) {
        // display formatted data
    }
} while ($row);

答案 1 :(得分:0)

我通常会通过创建一个二维数组来解决这样的问题,按日期然后用ID索引,或者在你的情况下用ID然后是日期。

循环事件(第一个维度)并打印出该事件的内容 - 同时在该事件中循环显示日期并将其作为列表打印出来,如示例所示。