人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPの質問です!下記のようにテーブル(category)を抽出するWhile文の中で得られた値(cate_id)を参照し、異なるテーブル(m_group)データをWhile文で値を抽出しようとしましたが…この入れ子に記述したwhile文のループが終わった時点で、親のWhile文のループが1回で終わってしまいます。なぜでしょうか? 解決の糸口を、ご存知の方がいましたら…ご教授いただけると助かります。よろしくお願いします!

echo "<nav id=\"gropCntl\"><ul>";
$res = $db->query("SELECT * FROM category WHERE shop_id=?; ", array($shop_id));
if (PEAR::isError($res)) {die("カテゴリー・抽出エラー:");}
while ($row = $res->fetchRow(DB_FETCHMODE_ASSOC)) {
echo "<li class=\"naviMenu\" onmouseover=\"this.className='naviMenu_on'\"
onmouseout=\"this.className='naviMenu'\">
<a href=\"\">".htmlspecialchars($row["cate_name"],ENT_QUOTES)."</a>";
echo "<ul class=\"sub\">";
$res = $db->query("SELECT * FROM m_group WHERE g_cate_id=? AND shop_id=?",
array(htmlspecialchars($row["cate_id"],ENT_QUOTES), $shop_id));
if (PEAR::isError($res)) {die("グループ・抽出エラー:");}
while ($row = $res->fetchRow(DB_FETCHMODE_ASSOC)) {
echo "<li><a href=\"\">".htmlspecialchars($row["group_name"],ENT_QUOTES)."</a></li>";
}
echo "</ul></li>";
}
echo "</ul></nav>";


●質問者: DrArabes
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● namiheikun
●100ポイント ベストアンサー

厳密に言うとPHPの話では無いのですが
データベースハンドル$dbを一つで行ってるからです
入れ子にする場合は2カーソルで行うべきです
$db = connectDb();
$db2 = connectDb();
$res1=$db->query(...);
while ($row=$res->fetch()){
......
$res2= $db2->query(....);
while ($row2=$res2->fetch()) {
.....
}
}
こんな感じかな


DrArabesさんのコメント
早速のご返信、ありがとうございます!解決いたしました。 そのような理由だったんですね…たいへん勉強になりました!

2 ● tdoi
●50ポイント

$resの使いまわしが原因ですね。

変数を分けるか、

echo "<nav id=\"gropCntl\"><ul>";
$res1 = $db->query("SELECT * FROM category WHERE shop_id=?; ", array($shop_id));
if (PEAR::isError($res1)) {die("カテゴリー・抽出エラー:");}
while ($row = $res1->fetchRow(DB_FETCHMODE_ASSOC)) {
  echo "<li class=\"naviMenu\" onmouseover=\"this.className='naviMenu_on'\"
  onmouseout=\"this.className='naviMenu'\">
  <a href=\"\">".htmlspecialchars($row["cate_name"],ENT_QUOTES)."</a>";
  echo "<ul class=\"sub\">";
  $res2 = $db->query("SELECT * FROM m_group WHERE g_cate_id=? AND shop_id=?", 
  array(htmlspecialchars($row["cate_id"],ENT_QUOTES), $shop_id));
  if (PEAR::isError($res2)) {die("グループ・抽出エラー:");}
 while ($row = $res2->fetchRow(DB_FETCHMODE_ASSOC)) {
 echo "<li><a href=\"\">".htmlspecialchars($row["group_name"],ENT_QUOTES)."</a></li>";
 }
 echo "</ul></li>";
}
echo "</ul></nav>"; 

こんな感じで、関数とかで逃げるとか。

echo "<nav id=\"gropCntl\"><ul>";
$res = $db->query("SELECT * FROM category WHERE shop_id=?; ", array($shop_id));
if (PEAR::isError($res)) {die("カテゴリー・抽出エラー:");}
while ($row = $res->fetchRow(DB_FETCHMODE_ASSOC)) {
  echo "<li class=\"naviMenu\" onmouseover=\"this.className='naviMenu_on'\"
  onmouseout=\"this.className='naviMenu'\">
  <a href=\"\">".htmlspecialchars($row["cate_name"],ENT_QUOTES)."</a>";
 outputGroup($row['cate_id'], $shop_id);
}
echo "</ul></nav>"; 

function outputGroup($category_id, $shop_id)
{
  echo "<ul class=\"sub\">";
  $res = $db->query("SELECT * FROM m_group WHERE g_cate_id=? AND shop_id=?", 
  array(htmlspecialchars($category_id,ENT_QUOTES), $shop_id));
  if (PEAR::isError($res)) {die("グループ・抽出エラー:");}
 while ($row = $res->fetchRow(DB_FETCHMODE_ASSOC)) {
 echo "<li><a href=\"\">".htmlspecialchars($row["group_name"],ENT_QUOTES)."</a></li>";
 }
 echo "</ul></li>";
}


何かの参考になれば。


DrArabesさんのコメント
早速の返信、ありがとうございます。関数で逃げるっていう方法もあるんですね。無事に解決しました。ご教授ありがとうございます!たいへん、勉強になりました。

tdoiさんのコメント
関数で逃げるというのが正しい表現ではないですが、関数内は変数のスコープが変わるので、同名でも違う変数として扱われるために、こういった回避も可能です。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ