- ベストアンサー
データ(表示)が切り替わってしまう
- 前回の質問に基づいて、MySQLを使用して「カテゴリ一覧表示」「検索結果一覧表示」「商品詳細表示」を一つの画面で行いたい。
- 関数内に表示処理を含む方法を試しましたが、検索結果をクリックすると画面が切り替わります。
- 解決策を探しているが、同時に原因を知る方からの助言を求めています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
全文を読んでいないのと、該当部分をゆっくり読んでいないのとで、精度の低いアドバイスになるかもしれませんが、承知してください。 dispallの部分は$resをmysql_fetch_array()で回しています。どこかでSQLのクエリ文を発行してDBから得た結果を一件ずつ処理しています。 MySQLについてはある程度の知識があると仮定してすすめますが、詳細表示の遷移の際に、そのクエリ文(もしくは検索条件)を保持して、$resに値が入るようにしてあげれば良いということになります。 Webアプリを作成したいなら、こういう画面遷移は大事なので、ぜひ御自分で理解してみてください。 PHPはHTML文の中に直接記述できるのが便利ですが、逆にソースが読みにくいという欠点にもなっています。 ある程度スキルがあがったらぜひMVCについて調べてみてください。
その他の回答 (1)
- Mac10
- ベストアンサー率44% (17/38)
各機能ごとに画面表示メソッドが用意されているので、メソッドに注目して、画面遷移ごとのデータフローを追いかけていけば、仕組みは理解できると思いますよ。 とりあえず遷移ごとにPOSTされた値、COOKIE、SESSIONで保持されている値(利用しているなら)を把握してみてください。 それである程度、ゴールは見えると思いますよ。 よっぽど読みにくいソースコードで無い限り。
お礼
早速アドバイスを頂き、大変ありがとうございます。仰る通り、ソースを読み込み、大体の流れは掴みかけている気がするのですが、まだまだ不足しているのだと思います。 >遷移ごとにPOSTされた値、COOKIE、SESSIONで保持されている値 ↑セッション(最初から)を利用しているので、私もこの辺りが怪しいのではないかと思っていました。セッションと受け渡された値についてもう少し考えてみます。 手掛かりを与えてくださり、大変ありがとうございました。 ちなみに各関数の処理部分を補足のところに明記しましたので、もしもよろしければ、おかしな部分をご指摘いただければ幸いです。
補足
■function gamen_src()の詳細(あまり意味がないのかもしれませんが…)と、他の関数の内容です。 ■function gamen_src() { // フォームデータ変換 $array = cnv_formstr($_POST); extract($array, EXTR_SKIP); $array = cnv_formstr($_GET); extract($array, EXTR_SKIP); ?> <table border="0" cellspacing="5" cellpadding="5"> <tr> <td valign="top"> <table border="0"><tr> <td><?php dispprod(); ?></td> </tr></table></td> <td> <table border="0"><tr> <td><?php dispall(); ?></td> 【←これで表示されたリンクをクリックすると、この部分がそっくり消えてしまいます。(HTMLのソースを見てもなくなっています)】 </tr></table> </td> <td> <form method="post" action="<?=$_SERVER["PHP_SELF"]?>"> <table border="0"> <tr> <td>商品検索</td> </tr> <tr> <td><input type="text" name="key" value="<?= @$key ?>"><input type="submit" value="検索"></td> </form> </tr> <tr> <form method="post" action="<?=$_SERVER["PHP_SELF"]?>"> <td><input type="submit" value="かごの中身を表示"></td> </tr><input type="hidden" name="act" value="dispcart"> </form> <tr bgcolor="gold"> <td>カテゴリ検索</td></tr> <tr> <td><?php dispcate(); ?></td></tr> </table> </td> </tr> </table> ■function dispprod() { ・SQL文でデータ抽出し、↓で表示 <form method="post" action="<?=$_SERVER["PHP_SELF"]?>"> <img border="0" src="img/<?= $img ?>"><br> <?=$prodname ?><br> 価格:<?= cnv_currency($price) ?> <p><input type="submit" value="購入する"> 数量 <input type="text" name="suuryou" size="2" value="<?= $suuryou ?>"> <input type="hidden" name="act" value="dispcart"> <input type="hidden" name="prodid" value="<?=$prodid?>"> </form> ■function dispcate() { ・SQLでカテゴリデータ抽出し、↓で表示 while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) { ?> <p><a href="<?=$_SERVER["PHP_SELF"]?>?cateid=<?= $row["cateid"] ?>"> <?= cnv_dispstr($row["catename"]) ?></a> <?php } ■function dispall() { ・フォームデータ変換 ・データ抽出条件定義 ・SQL文でデータ数取得 ・表示ページ位置、データ位置取得 ・SQL文で表示データ抽出し、↓で表示 while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) { $prmprod = "?prodid=".$row["prodid"]; ?> <hr> <p><a href="<?=$_SERVER["PHP_SELF"].$prmprod ?>"> <?= cnv_dispstr($row["prodname"]) ?></a><br> 価格:<?= cnv_currency($row["price"]) ?> <?php }
お礼
お忙しいところ重ねてアドバイス頂き、本当にありがとうございます。 MySQLもPHPもそれほど(というか殆ど)知識がないもので、本や参考サイトに書いてあることは何とか理解できるのですが、応用が利かないという状態です。。。 >詳細表示の遷移の際に、そのクエリ文(もしくは検索条件)を保持して、$resに値が入るようにしてあげれば良い ↑こちらについても、なぜクエリ文(検索条件)を保持すると、詳細表示時にも一覧表示が保持されるのかが、正直、分からない状態で。 「詳細表示をする度に、一覧表示をし直す」ということなのかと考えたり…。 以来、自分なりに調べてはいるのですが、私の理想に近いようなサイトは大抵「FRAME」「IFRAME」を使っていることが殆どで、やはりフレームが適しているのかと思い始めております。(フレームにしても、また自分なりに元のサンプルスクリプトを改造しなければいけないので道は長そうですが)。 MVCやテンプレートについては、導入したいと思っているのですが、如何せん、まずはPHPやMySQLの基礎を習得してから…ということで、まだまだ先の話ではありますが、ひとまず勉強を続けたいと思います。 お礼文が長くなってしまいましたが、 ご親切にお答えいただき、大変ありがとうございました。
補足
問題解決に漕ぎ着けましたので、一応ご報告がてら記録を残させて頂きます。 1画面の中で、 dispall()<商品一覧> dispcate()<カテゴリ一覧> dispprod()<商品詳細> を表示させるためには、ご指摘頂いた通り、 上記3つのユーザー関数に、 「それぞれのクエリ結果の値を持たせてあげる(値を渡す)」 ということがやっと解りました。 それぞれの値(商品id、カテゴリid等)を受け取れば、 各関数が処理されていくので表示もされる という流れです。 今までは dispall()から dispprod()にGETで渡すパラメーターは 商品idだけでしたが、dispall()の表示条件となるカテゴリidやキーワードもdispprod()に渡せるようにすると、 dispall()<商品一覧> dispcate()<カテゴリ一覧> dispprod()<商品詳細> が常に1画面の中で表示できるようになりました。 分かり難い説明で恐縮ですが、無事希望通りの結果が得られ、 大変満足しております。 どうもありがとうございました。