0

私の最初の投稿は、可能な限り徹底的に試みました。何か問題が発生した場合は、事前にお詫び申し上げます。私もPHP/SQLの初心者なので、しばらくお待ちください。ループ内のループについて同様の質問をいくつか見つけましたが、私の場合に解決策が適用されるかどうかはわかりません。

tws_workshopNamesとtws_workshopsの2つのテーブルがあります。tws_workshopNamesの主キーは、2つのテーブルを関連付けるためにtws_workshopsの外部キーとして使用されます。これを2つの表に分けた理由は、同じワークショップの名前/価格/説明が複数の日時に提供される場合が多いためです。

スクリーンショットを送信することはできませんが、SQLServerのテーブルデザインの概要は次のとおりです。

tws_workshopNames:
workshopNameID (pri)
description
price
etc.

tws_workshops:
workshopID (pri)
workshopNameID (foreign)
date
time
etc.

私がしたいのは基本的にこれです:

  1. tws_workshopNamesテーブルを照会し、workshopName / price / description/etcを表示します。
  2. WorkshopNameごとに、tws_workshopsテーブルを調べて、同じworkshopNameIDを持つすべてのレコードを表示します。

つまり、tws_workshopNamesを調べて最初のworkshopNameを表示し、次にtws_workshopsを調べてそのworkshopNameに関連するすべてのレコードを表示し、次にtws_workshopNamesの次のworkshopNameに移動して、そのworkshopNameに関連するすべてのレコードを表示します。

whileループ内でwhileループを使用することで、目的の結果を得ることができます。この場合、外側のループはtws_workshopNamesを呼び出し、ネストされたループはtws_workshopsテーブルを呼び出します。しかし、私はこれについて多くのことを読んでおり、dbへの呼び出しが多くなるため、これが適切なアプローチではないことは明らかですが、代替案を理解するのに苦労しています。

必要な出力:

Workshop 1
price
description
 date (of workshop 1)
 time (of workshop 1)
 ...

Workshop 2
price
description
 first date (of workshop 2)
 first time (of workshop 2)
 second date (of workshop 2)
 second time (of workshop 2)
 third date (of workshop 2)
 third time (of workshop 2)
 ...

Workshop 3
price
description
 date (of workshop 3)
 time (of workshop 3)
 ...

etc.

ネストされたwhileループで機能する現在のコードは次のとおりです。

<?php
// query workshopNames table, what types of workshops are available?
$query = mssql_init("tws_sp_workshopNames", $g_dbc);

// pull up result
$result = mssql_execute($query);
$numRows = mssql_num_rows($result);

while($row = mssql_fetch_array($result)) {

echo "<div style=\"...\">
<span class=\"sectionHeader\">" . $row['workshopName'] . "</span><br />
<span class=\"bodyText\"><strong>" . $row['price'] . "</strong></span><br />
<span class=\"bodyText\">" . $row['description'] . "</span>";

$workshopNameID = $row['workshopNameID'];

// query workshops table, what are the dates/times for each individual workshop?
$query2 = mssql_init("tws_sp_workshops", $g_dbc);
mssql_bind($query2, "@workshopNameID", $workshopNameID, SQLVARCHAR);

//pull up result
$result2 = mssql_execute($query2);
$numRows2 = mssql_num_rows($result2);

while($row2 = mssql_fetch_array($result2)) {

echo $row2[date] . "&nbsp;";
echo $row2[time] . "<br />";

};

echo "</div><br />";

};
?>

ストアドプロシージャは非常に単純です。

tws_sp_workshopNames = "SELECT workshopNameID, workshopName, description, location, price FROM tws_workshopNames"
tws_sp_workshops = "SELECT date, time, maxTeachers, maxStudents, teachersEnrolled, studentsEnrolled FROM tws_workshops WHERE workshopNameID=@workshopNameID"

それがすべて比較的明確であることを願っています。私が本当に探しているのは、同じ結果を得るより良い方法、つまりループ内でdb呼び出しを含まないソリューションです。

助けてくれてありがとう、これに頭をぶつけて数日経ちました...

4

2 に答える 2

0

この場合、ループ クエリの使用を避けるのは正しいことです (1 つのクエリで単純な JOIN を実行するだけで目的の結果が得られるため)。

GROUP_CONCAT() も使用しないでください。文字制限があるため (デフォルトでは変更できます)、出力されるデータを解析する必要があるため、面倒です。参加してすべての行を取得することで、必要なすべてのデータを取得するだけです。次に、ワークショップ ID をキーとして使用してデータを配列に読み込みますが、配列を開いたままにして、各時間データを新しい配列として追加します。

$workshops[$workshop_name][] = $timesArray;

次に、出力でループできますが、呼び出しごとにデータベースにアクセスする必要はありません。

foreach ($workshops as $workshop_name => $times)
{
  echo $workshop_name;
  foreach ($times as $time)
  {
    echo $time;
  }
  echo "<br>";
}

これは正確なコードではありません。質問で指摘したように、ワークショップに関する他の情報を保持/表示したい場合は、必要なすべてのデータを階層で取得するまで配列構造をいじってください。深いツリー構造を構築しようとしている場合はhttp://kevin.vanzonneveld.net/techblog/article/convert_anything_to_tree_structures_in_php/のようなものを使用できますが、この例ではやり過ぎだと思います。

これは私が「中級レベル」の質問と呼んでいるものであるため、私の提案を使用して、問題を解決するようにしてください (コピー/貼り付けではなく、これが優れたプログラマーになる理由です)。行き詰まった場合は、コメントしてください。さらにお手伝いします。

于 2012-05-31T00:37:54.653 に答える