• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PHPのプログラムについて)

PHPのプログラムで商品情報を取得する方法とは?

このQ&Aのポイント
  • PHPを勉強していてわからない箇所があるので質問します。商品一覧画面から選択した商品の詳細情報を表示するプログラムがうまく動作しません。コピーした練習用のプログラムで、元のプログラムは「MDB2」というモジュールを使用しています。私はSQLを使用しているため、プログラムの違いや他の原因について質問したいです。
  • 質問1:「該当するテーブルから該当するitem_code番号をセレクトし、$_REQUEST["code"]に格納されている商品コードを元に、商品情報をデータベースより取得」という動作を実現するために、どのようなプログラムを記述すればよいですか?
  • 質問2:プログラム内で使用している「MDB2」の代替モジュールはありますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • myr0326
  • ベストアンサー率52% (24/46)
回答No.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

tanakataro2010
質問者

お礼

いただいた箇所を修正しましたら、うまく作動しました!涙 ただただ感動です・・・。 また、プログラムの修正だけでなく、諸々のアドバイスまでわかりやすく情報を教えていただき本当にありがとうございました。非常に助かりました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • myr0326
  • ベストアンサー率52% (24/46)
回答No.3

ん、ごめんなさい。 No.2の者ですが一箇所訂正です。 (仮定)の部分の、 >・$_REQUEST["code"]とitem_codeが一致した列を取得したい。 は、「列」でなく「行」でしたね。 すみませんでした。

tanakataro2010
質問者

補足

さきほどの補足に付け忘れましたが、いただいた前提条件で間違いないという認識です。 ご丁寧な対応、大変ありがとうございました。 もし、他に不具合の原因がわかりましたらご教授いただければと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • myr0326
  • ベストアンサー率52% (24/46)
回答No.2

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や¥"など)を使わない限り、シングルクオテーションで記述することをお勧めします。 理由はそっちの方がエスケープ文字の処理をしなくていい分若干処理が速くなるからです。 逆にエスケープ文字を使いたい場合はダブルクオテーションで囲ってあげる必要があります。

tanakataro2010
質問者

補足

ご回答ありがとうございました。 いただいたプログラムをコピーしてみたところ、サーバーエラーが発生してしまいました。ただし、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>&yen;<?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>&yen;<?php print( $item["price"] ); ?></dd> </dl> <?php } ?> -------- もし他にも何かおかしなところが思い当たりましたら、教えていただけますでしょうか。 よろしくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。
  • 1minn
  • ベストアンサー率57% (52/90)
回答No.1

なにが「うまく動かない」のでしょうか? ソースが断片的なので明確な事は言えませんが、DBの接続が出来てないとかかな?

tanakataro2010
質問者

補足

説明不足で申し訳ありません。DB接続はできることを別途確かめています。詳細画面のURLを取得するところは実現できており、かつ一覧画面と共通のメニューなどは表示できるので、問題は、詳細情報を取得して詳細画面に表示する部分がおかしいのだと思います。 該当部分のプログラムの前と後ろに何らかの文字を入力した場合、前に記述した文字のみ表示できるので、この部分のプログラムに問題があると特定した次第です。 ちなみにSQLと書きましたが、MySQLです。多分、MySQLだとfetchRow関数が使えないのではないか、、と思っており、代わりにmysql_fetch_row とか mysql_fetch_assoc あたりを使うのではないかと推測していますが、よくわかりません・・。 よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • php pear mdb2に質問です。

    php pear mdb2に質問です。 以下の関数でエラーが出ます。 間違っているところがあれば、回答お願いします。 function product_info($id) { global $db; $res = $db->query("SELECT * FROM product WHERE id=?", array($id)); if ($res != null) { $row = $res->fetchrow(MDB2_FETCHMODE_ASSOC); return $row; } return null; }

    • ベストアンサー
    • PHP
  • PHPの書き方について

    PHPを独学で勉強中で、気になったことがあるので質問させていただきます。 最初に買った書籍とその次に買った書籍で書き方が違うところがあるので、普通はどちらでやるのか、また、使い分けがあるのかが知りたいです。 たとえば、データベースを1行ずつ取り出す処理で、1冊目では $pdo = new PDO($dnsinfo,$USER,$PW); $sql = "SELECT * FROM ○○"; $stmt = $pdo->prepare($sql); $stmt->execute(null); $res = ""; while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ $res .= $row['△△'] ."," .$row['□□'] ."<br>\n"; } ・・・というコードがあったのですが、2冊目には同じような処理が mysqli_fetch_assoc()を使って書かれていたり、 接続の仕方も1冊目では「new PDO($dnsinfo,$USER,$PW);」を使って書かれているのが、2冊目では「mysqli_connect()」になっていたり、 他にも同じような処理がよく似たコードで書かれています。 調べてみると、PHP5.5から1冊目のやり方になった・・・ような記事を見つけたのですが、どちらの本もPHP5.5と書いてあり、いまいちよくわかりません。 詳しい方いらっしゃいましたらご教示お願いいたします。

    • ベストアンサー
    • PHP
  • phpプリペアードステートメントについて質問です。

    phpの練習で、以下のようなhtmlファイルとphpファイルを作り XAMPで作業をおこなっています。 以下にあるhtml.phpファイルでのやり取りはうまくいっているのですが、 このphpをプリペアードステートメントにする所で躓いています。 いろいろ調べてやってはみたものの、どうしても%を使った あいまい検索のところがわかりません。 ---------------------------------------------------------------- 以下、プリペアードステートメントにする前の ページ内容です。こちらではうまくいっています。 html <form method="post" action="kensaku.php"> ご意見コードを入力してください。<br /> <input name="code" type="text" style="width:100px"><br /> <br /> <input type="submit" value="送信"> </form> php <?php $code=$_POST['code']; $dsn = 'mysql:dbname=phpkiso;host=localhost'; $user = 'root'; $password =''; $dbh = new PDO($dsn,$user,$password); $dbh->query('SET NAMES UTF-8'); $sql = "select * from `anketo` where `goiken` like '%{$code}%' "; $stmt = $dbh->prepare($sql); $stmt-> execute(); while(1) { $rec=$stmt->fetch(PDO::FETCH_ASSOC); if($rec==false) { break; } print $rec['code']; print $rec['nickname']; print $rec['email']; print $rec['goiken']; print '<br />'; } $dbh = null; ?> ---------------------------------------------------------------- 以上のphpの中の以下の分を $sql = "select * from `anketo` where `goiken` like '%{$code}%' "; $stmt = $dbh->prepare($sql); $stmt-> execute(); ↓ $sql ="SELECT*FROM anketo WHERE goiken like ?"; $stmt = $dbh->prepare($sql); $data[] = $code; $stmt->execute(array("%$_GET[$data]%")); こんな風に直しては見たのですが、なんだか うまくい行かずです。 よろしければ教えてください。 宜しくお願い致します。

    • 締切済み
    • PHP
  • PHP mysql の戻り値

    PHP内にて、下記の処理、上手くINSERTはされているのですが、 デバッグで埋めた print のところで res1 == Object id #6 が表示されます。 (1) Object id #6とはなんでしょうか? (2)正常、異常のときの $stmt の戻り値は何が返りますか?   (3)正常、異常のときの $res  の戻り値は何が返りますか? ~~~(一部抜粋)~~~ $sql = "insert into thread ( id, name, insert_datetime ) values (?, ? , now())"; $stmt = self::$_conn->prepare($sql); $res = $stmt->execute(array($id_mx,$this->get('name'))); print "res1 == ".$res."</br>"; die_if_dberror($res); ~~~~~~~~~~~

    • ベストアンサー
    • PHP
  • PHPとSQLをコンパクトにまとめたいです

    部分一致検索して商品が見つかった場合はその商品だけを表示して、もし検索して見つからなかったときはエラーメッセージと商品一覧を表示しています。動作上は問題ありませんが、コンパクトにまとめることは可能でしょうか? // ユーザーが検索した場合の処理 if (isset($_POST['keyword']) === TRUE && mb_strlen ($_POST['keyword']) > 0) { $keyword = trim($_POST['keyword']); try { $sql = 'SELECT product.id, name, price, img, status, stock FROM product JOIN item_stock ON product.id = item_stock.stock_id WHERE name like ?'; $stmt = $dbh->prepare($sql); $stmt->bindValue(1, $keyword, PDO::PARAM_STR); // SQLを実行 $stmt->execute(['%' . $keyword . '%']); $result = $stmt->fetchALL(); // 上記で検索した名前と部分一致する商品を探す if (count($result) > 0 ) { $msg[] = ($keyword . 'を含む商品が見つかりました!'); } else { try { // ステータスが1(公開)の販売商品のみを一覧で表示する $sql = 'SELECT product.id, name, price, img, status, stock FROM product JOIN item_stock ON product.id = item_stock.stock_id WHERE status = 1'; $stmt = $dbh->prepare($sql); $stmt->execute(); //全て取得するのでfetchALLでレコードを取得する $result = $stmt->fetchALL(); $err_msg[] = ($keyword . 'を含む商品は見つかりませんでした。'); } catch (PDOException $e) { $err_msg[] = '商品を取得できませんでした。'; } } } catch (PDOException $e) { $err_msg[] = '商品を検索できませんでした。'; } } else { try { // ステータスが1(公開)の販売商品のみを一覧で表示する。 $sql = 'SELECT product.id, name, price, img, status, stock FROM product JOIN item_stock ON product.id = item_stock.stock_id WHERE status = 1'; $stmt = $dbh->prepare($sql); $stmt->execute(); //全て取得するのでfetchALLでレコードを取得する $result = $stmt->fetchALL(); } catch (PDOException $e) { $err_msg[] = '商品を取得できませんでした。'; } }

    • ベストアンサー
    • PHP
  • PEAR MDB2 のsetFetchModeが設定がうまくいきません

    お世話になります。 Pearのmdb2を使用し始めたのですが、 setFetchMode(DB_FETCHMODE_ASSOC) の記述をしても、データが連想配列形式になりません。 (数値添え字の配列になってしまいます。) 何か問題として考えられることはありませんでしょうか。 環境は、 CentOS5 apache 2.2.3 php 5.1.6 mysql 5.0.22 (すべてRPM) です。 ソースは下記のとおりです。 $mdb2 =& MDB2::connect( $dsn, array() ); if( PEAR :: isError( $mdb2 ) ){ $errmsg .= "データベースの接続に失敗しました。<br />"; }else{ //連想配列で取り出す $mdb2->setFetchMode(DB_FETCHMODE_ASSOC); $res =& $mdb2->query('SELECT * FROM tablename'); if (PEAR::isError($res)) { $errmsg .= "SQLの実行に失敗しました。<br />"; } print("<pre>"); while ($row = $res->fetchRow()) { print_r($row); } print("</pre>"); // 接続断 $mdb2->disconnect(); } アドバイスがあればぜひよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • MDB2 [Call to undefined method MDB2

    MDB2 [Call to undefined method MDB2_Error::execute()] 以下のようなMDB2を利用したSELECT文を書きましたが、 最終行で、 Call to undefined method MDB2_Error::execute() が出ます。 どのように修正すれば良いでしょうか? ===================================================================================== require_once('/usr/share/pear/PEAR/MDB2.php'); $db=MDB2::connect('mysqli://【user】:【password】@localhost/【dbname】?charset=utf8'); if(PEAR::isError($db)){ die($db->getMessage()); } $sql = 'select * from user where name=? and password=?'; $types = array('text','text'); $stmt=$db->prepare($sql, $type, TRUE); $data = array('guest' , 'guest'); $res = $stmt->execute($data); ===================================================================================== 下から3行目の$stmtがMDB2_Errorオブジェクトなのまでは分かるのですが、 どう対処すればよいかが不明です。 宜しくお願いします。

    • ベストアンサー
    • PHP
  • phpのリストボックスについて

    よろしくお願いします。 phpを利用し、条件にあった内容を表示させる画面を作っています。 リストボックスで選択した内容を次のリストボックスの選択キーとして 別テーブルの検索条件に利用できるものでしょうか?? 以下のソースなんですが、 //------------------------------------------------------------- ソースA: print "<select name='brand' id='brand' style='width:190'>"; $sql ="select * from brand ORDER by no"; $res = mysql_query($sql); if ($res and mysql_num_rows($res)) { while($rec=mysql_fetch_array($res)){ echo "<option value='{$rec['name']}' >{$rec['name']}</option>"; } } print "</select>"; //-------------------------------------------------------------- とbrandテーブルからnameをリストボックス表示させます。 この表示し、選択した内容(仮にダイヤ)を同画面にあるもう一つの リストボックスで同じようなソースで別テーブルをselect文の検索キーに したいのです。以下のような感じ・・ //------------------------------------------------------------- ソースB: $sql ="select * from item where = 'ダイヤ'"; $res = mysql_query($sql); if ($res and mysql_num_rows($res)) { while($rec=mysql_fetch_array($res)){ echo "<option value='{$rec['itemname']}' >{$rec['itemname']}</option>"; } } print "</select>"; //-------------------------------------------------------------- の$sql ="select * from item where = 'ダイヤ'";←このダイヤを ソースAからもってきたいのですが、何かよい方法はありますか? 変数作ってやってみましたが、うまくいかずです。phpだけでは無理でしょうか?よろしくお願いします。

    • 締切済み
    • PHP
  • 【PHP】配列の値が上書きされる

    PHP初心者です。 PHPとMYSQLとHTMLでweb画面を作成しています。 ループで、SQLを複数回回し、その結果を配列に格納しようとしているのですが、 配列には毎回最後の一つの結果しか格納されません。 いろいろ調べて、試してみたのですが、どうしても分かりません。 申し訳ありませんが、お分かりの方がいたら、ご教示願えませんでしょうか。 以下にソースを記載します。 ******************************************************** <?php $checkbox = $_REQUEST["chk"]; $pdo = new PDO("mysql:host=localhost; dbname=TESTDB; charset=utf8", "hoge", "hoge", array( PDO::ATTR_EMULATE_PREPARES => false ) ); $results=array(); for($i=0; $i<sizeof($checkbox); $i++){ $sql = "select * from Item where 1 = 1 "; $sql = $sql . " and id=${checkbox[$i]} "; $statement = $pdo->prepare( $sql ); var_dump($sql);   ←★デバッグ用 $statement->execute(); $results = $statement->fetchAll(); } ?> <?php print count(sizeof($checkbox));   ←★デバッグ用 print("<pre>");   ←★デバッグ用 print_r($results);   ←★デバッグ用 print("</pre>");   ←★デバッグ用 ?> ******************************************************** $checkbox = $_REQUEST["chk"]; の部分ですが、前のページでチェックボックスに3箇所チェックを入れて、その情報を格納しています。 var_dump($sql)の結果、 string(41) "select * from Item where 1 = 1 and id=8 " string(41) "select * from Item where 1 = 1 and id=9 " string(42) "select * from Item where 1 = 1 and id=10 " と、ちゃんと3つ認識しています。 しかし、 print("<pre>"); print_r($results); print("</pre>"); の結果が、 Array ( [0] => Array ( [id] => 10 [0] => 10 [item_name] =>商品1 [1] => 商品1 [price] => 10000 [2] => 10000 [rfu1] => [3] => [rfu2] => [4] => [rfu3] => [5] => [memo] => comment [6] => comment ) ) と、最後の1つしか格納されていないのです……。

    • ベストアンサー
    • PHP
  • ResultSetインターフェイスでの next() の使い方

    データベースからSQLをつかって受注件数を取得したい時に、なぜ、下記のように next() をしなければいけないのかが分かりません。 初心者なので、出来ましたら詳しく教えてください。 お願いします。 int count = 0 ; Statement stmt = con.createStatement() ; String sql = "select count(*) from 受注" ; ResultSet res = stmt.executeQuery(sql) ; if (res.next()) { count = res.getInt(1) ; }

    • ベストアンサー
    • Java