アプリ版:「スタンプのみでお礼する」機能のリリースについて

以前「http://okwave.jp/kotaeru.php3?q=1862189」で質問させていただき、時間がなく、やっと実作業に移ったところの者です。
■目的:MySQLを使い、「カテゴリ一覧表示」「(カテゴリorキーワード)検索結果一覧表示」「商品詳細表示」を一画面の中で行う。
・前回ご回答頂いた内容では、それぞれの結果を変数に代入し、表示するということでしたが、参考にしている書籍では関数の中に表示処理も含んでいたので、そのまま利用してみました。
しかし、「カテゴリ一覧」は常に表示されるものの、「検索結果一覧表示」の中から一つの商品のリンクをクリックすると、「検索結果一覧表示」が消え、その代わりに「商品詳細表示」が現れる状態となります。
一つの画面に『検索結果一覧+カテゴリ一覧』か『商品詳細+カテゴリ一覧』がある状態です。
自分でも解決策を探し続けますが、並行して、もしも原因がお解かりになる方がおられましたら、何卒ご教示のほどよろしくお願いいたします。

// ページ内容の表示(switchで切り分け*↓一部)
switch ($act) {
default: // 商品検索画面
gamen_src();
//サブルーチン定義
■function gamen_src() {
 ・フォームデータ変換
 ・テーブルの中に下記パーツを配置。
  ・<?php dispprod(); ?>(商品詳細表示)
  ・<?php dispall(); ?>(検索結果一覧)
  ・<form>を使用し商品検索窓+ボタン
  ・<form>を使用しかごの中身を表示
  ・<?php dispcate(); ?>(カテゴリ検索(一覧表示))

※文字数制限により「■function dispprod() 」「■function dispcate()」「■function dispall()」を省略していますが、回答補足にて明記させていただきたいと思います。どうぞよろしくお願いいたします。

A 回答 (2件)

 全文を読んでいないのと、該当部分をゆっくり読んでいないのとで、精度の低いアドバイスになるかもしれませんが、承知してください。



 dispallの部分は$resをmysql_fetch_array()で回しています。どこかでSQLのクエリ文を発行してDBから得た結果を一件ずつ処理しています。

 MySQLについてはある程度の知識があると仮定してすすめますが、詳細表示の遷移の際に、そのクエリ文(もしくは検索条件)を保持して、$resに値が入るようにしてあげれば良いということになります。

 Webアプリを作成したいなら、こういう画面遷移は大事なので、ぜひ御自分で理解してみてください。

 PHPはHTML文の中に直接記述できるのが便利ですが、逆にソースが読みにくいという欠点にもなっています。
 ある程度スキルがあがったらぜひMVCについて調べてみてください。 

この回答への補足

問題解決に漕ぎ着けましたので、一応ご報告がてら記録を残させて頂きます。
1画面の中で、
dispall()<商品一覧>
dispcate()<カテゴリ一覧>
dispprod()<商品詳細>
を表示させるためには、ご指摘頂いた通り、
上記3つのユーザー関数に、
「それぞれのクエリ結果の値を持たせてあげる(値を渡す)」
ということがやっと解りました。
それぞれの値(商品id、カテゴリid等)を受け取れば、
各関数が処理されていくので表示もされる
という流れです。
今までは dispall()から dispprod()にGETで渡すパラメーターは
商品idだけでしたが、dispall()の表示条件となるカテゴリidやキーワードもdispprod()に渡せるようにすると、
dispall()<商品一覧>
dispcate()<カテゴリ一覧>
dispprod()<商品詳細>
が常に1画面の中で表示できるようになりました。

分かり難い説明で恐縮ですが、無事希望通りの結果が得られ、
大変満足しております。
どうもありがとうございました。

補足日時:2006/06/05 09:47
    • good
    • 0
この回答へのお礼

お忙しいところ重ねてアドバイス頂き、本当にありがとうございます。
MySQLもPHPもそれほど(というか殆ど)知識がないもので、本や参考サイトに書いてあることは何とか理解できるのですが、応用が利かないという状態です。。。

>詳細表示の遷移の際に、そのクエリ文(もしくは検索条件)を保持して、$resに値が入るようにしてあげれば良い
↑こちらについても、なぜクエリ文(検索条件)を保持すると、詳細表示時にも一覧表示が保持されるのかが、正直、分からない状態で。
「詳細表示をする度に、一覧表示をし直す」ということなのかと考えたり…。

以来、自分なりに調べてはいるのですが、私の理想に近いようなサイトは大抵「FRAME」「IFRAME」を使っていることが殆どで、やはりフレームが適しているのかと思い始めております。(フレームにしても、また自分なりに元のサンプルスクリプトを改造しなければいけないので道は長そうですが)。
MVCやテンプレートについては、導入したいと思っているのですが、如何せん、まずはPHPやMySQLの基礎を習得してから…ということで、まだまだ先の話ではありますが、ひとまず勉強を続けたいと思います。

お礼文が長くなってしまいましたが、
ご親切にお答えいただき、大変ありがとうございました。

お礼日時:2006/05/04 08:58

 各機能ごとに画面表示メソッドが用意されているので、メソッドに注目して、画面遷移ごとのデータフローを追いかけていけば、仕組みは理解できると思いますよ。



 とりあえず遷移ごとに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
}

補足日時:2006/05/03 17:56
    • good
    • 0
この回答へのお礼

早速アドバイスを頂き、大変ありがとうございます。仰る通り、ソースを読み込み、大体の流れは掴みかけている気がするのですが、まだまだ不足しているのだと思います。
>遷移ごとにPOSTされた値、COOKIE、SESSIONで保持されている値
↑セッション(最初から)を利用しているので、私もこの辺りが怪しいのではないかと思っていました。セッションと受け渡された値についてもう少し考えてみます。
手掛かりを与えてくださり、大変ありがとうございました。

ちなみに各関数の処理部分を補足のところに明記しましたので、もしもよろしければ、おかしな部分をご指摘いただければ幸いです。

お礼日時:2006/05/03 17:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!