- ベストアンサー
PHPのプログラムで商品情報を取得する方法とは?
- PHPを勉強していてわからない箇所があるので質問します。商品一覧画面から選択した商品の詳細情報を表示するプログラムがうまく動作しません。コピーした練習用のプログラムで、元のプログラムは「MDB2」というモジュールを使用しています。私はSQLを使用しているため、プログラムの違いや他の原因について質問したいです。
- 質問1:「該当するテーブルから該当するitem_code番号をセレクトし、$_REQUEST["code"]に格納されている商品コードを元に、商品情報をデータベースより取得」という動作を実現するために、どのようなプログラムを記述すればよいですか?
- 質問2:プログラム内で使用している「MDB2」の代替モジュールはありますか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
えっと、 >いただいたプログラムをコピーしてみたところ、サーバーエラーが発生してしまいました。 とのことですが、エラーメッセージも一緒に載せて頂けると助かります。 エラーメッセージはプログラム中のどこにどんな原因があって上手く動かないのか教えてくれているメッセージですので、 今後もし同じように質問する場合でも一緒に載せておくと回答する人が回答しやすくなりますし、 また自分で原因を探る場合でもまずエラーメッセージを読むことが大切です。 エラーメッセージについての説明、表示/非表示の切り替えについては以下のサイトが参考になるかと思います。 http://www.sound-uz.jp/php/note/errors さてさて、上手く動かないということですが、 プログラム全体が分からないので詳細なことはお答え出来ないのですが、 パッと見た感じ、詳細画面の方の下から2行目、 $res->free(); が問題ありそうです。 この命令は結果を保存している変数を、メモリ容量の確保のために「もう要りませんよ~」という宣言をして解放してあげるという命令なのですが、 私の回答したプログラムで使うのなら mysql_free_result($res); としてあげる必要があります。 ちなみに、PHPではプログラム終了時に自動的にメモリ解放を行いますので、よほど重いデータを読み込むのでない限りこの命令を使う必要はありません。 基本的なmysqlに関する関数は以下のサイトに乗っていますので、一度サクっと目を通されてみることをオススメします。 http://php.net/manual/ja/book.mysql.php #さらにさらに余計なことを言うと、ただ単純に文字列を出力する際はprintではなくechoを使った方がいいです。 理由はこちらのサイトに。 http://nyx.pu1.net/reference/extra/echo_print.html
その他の回答 (3)
- myr0326
- ベストアンサー率52% (24/46)
ん、ごめんなさい。 No.2の者ですが一箇所訂正です。 (仮定)の部分の、 >・$_REQUEST["code"]とitem_codeが一致した列を取得したい。 は、「列」でなく「行」でしたね。 すみませんでした。
補足
さきほどの補足に付け忘れましたが、いただいた前提条件で間違いないという認識です。 ご丁寧な対応、大変ありがとうございました。 もし、他に不具合の原因がわかりましたらご教授いただければと思います。
- myr0326
- ベストアンサー率52% (24/46)
DB接続は上手く出来ているとのことなので。。 詳細がよく分からないのですが、以下の仮定を前提としてMySQL用に書き直すのなら、 多分こんな感じだと思います。 (仮定) ・m_itemsテーブルに入っているデータのうち、item_codeは一件も被っていない。(ユニークな値である) ・$_REQUEST["code"]とitem_codeが一致した列を取得したい。 <?php //クエリ文を作成 $sql = 'SELECT * FROM m_items WHERE item_code = "'.$_REQUEST["code"].'"'; //クエリをmysqlに投げて、結果を取得 $res = mysql_query($sql); //もし結果が0行なら「該当無し」と表示 if (mysql_num_rows($res) == 0) { echo '該当無し'; } //結果が一行でも存在した場合 else { //取得した結果を配列として保存 $data = mysql_fetch_assoc($res); //以下処理を書いていく ~~~ } ?> 取得した値は、例えばm_itemsに「name」と「price」という列があるとしたら、それぞれ $data['name'] $data['price'] という感じで$data配列に入っています。 ちなみに文字列を記述する場合は、エスケープ文字(¥nや¥"など)を使わない限り、シングルクオテーションで記述することをお勧めします。 理由はそっちの方がエスケープ文字の処理をしなくていい分若干処理が速くなるからです。 逆にエスケープ文字を使いたい場合はダブルクオテーションで囲ってあげる必要があります。
補足
ご回答ありがとうございました。 いただいたプログラムをコピーしてみたところ、サーバーエラーが発生してしまいました。ただし、URLのところは、「www.XXXX/XXXX/item_detail.php?code=2004」という具合に該当する商品コードを【?code=2004】それぞれしっかりと取得しています。 ※コピーをした際、 $data = mysql_fetch_assoc($res); の $data のところは、以下のプログラムが後ろに続いているため、$item に変更しました。 -------------- <form name="detail_form" action="cart.php" method="get"> <input type="hidden" name="cmd" value="add_cart"/> <input type="hidden" name="code" value="<?php print( htmlspecialchars( $item["item_code"] ) ); ?>"/> <!-- メイン部分 各ページごとに作成--> <div id="mainbox" class="clearfix"> <h2>商品詳細</h2> <div class="list clearfix"> <h3><?php print( htmlspecialchars( $item["item_name"] ) ); ?></h3> <p class="photo"><img src="img/<?php print( htmlspecialchars( $item["image"] ) ); ?>" width="400" height="400"/></p> <p class="text"><?php print( htmlspecialchars( $item["detail"] ) ); ?></p> <div class="buy"> <p class="price">価格:<strong>¥<?php print( htmlspecialchars( $item["price"] ) ); ?></strong></p> 個数: <select name="num"> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> </select> <input type="submit" value="カートにいれる"/> <input type="button" value="前の画面へ戻る" onclick="history.back()"/> </div> </div> </div> </form> <!-- /メイン部分 各ページごとに作成--> <?php } $res->free(); ?> --------------------- ■ちなみに商品概要のページで、詳細画面に商品コードを受け渡している箇所は以下のような記述になっています。 -------- <dl class="products"> <dt><a href="item_detail.php?code=<?php print(htmlspecialchars( $item["item_code"] ) ); ?>"><img src="img/thumb/<?php print( $item["image"] ); ?>" alt="" /><br /> <?php print( $item["item_name"] ); ?></a></dt> <dd>¥<?php print( $item["price"] ); ?></dd> </dl> <?php } ?> -------- もし他にも何かおかしなところが思い当たりましたら、教えていただけますでしょうか。 よろしくお願いいたします。
- 1minn
- ベストアンサー率57% (52/90)
なにが「うまく動かない」のでしょうか? ソースが断片的なので明確な事は言えませんが、DBの接続が出来てないとかかな?
補足
説明不足で申し訳ありません。DB接続はできることを別途確かめています。詳細画面のURLを取得するところは実現できており、かつ一覧画面と共通のメニューなどは表示できるので、問題は、詳細情報を取得して詳細画面に表示する部分がおかしいのだと思います。 該当部分のプログラムの前と後ろに何らかの文字を入力した場合、前に記述した文字のみ表示できるので、この部分のプログラムに問題があると特定した次第です。 ちなみにSQLと書きましたが、MySQLです。多分、MySQLだとfetchRow関数が使えないのではないか、、と思っており、代わりにmysql_fetch_row とか mysql_fetch_assoc あたりを使うのではないかと推測していますが、よくわかりません・・。 よろしくお願いします。
お礼
いただいた箇所を修正しましたら、うまく作動しました!涙 ただただ感動です・・・。 また、プログラムの修正だけでなく、諸々のアドバイスまでわかりやすく情報を教えていただき本当にありがとうございました。非常に助かりました。