• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:DBから取得したデーター+配列データーの受取り)

DBからデータを取得し、買い物カゴDBにインサートする方法

このQ&Aのポイント
  • 質問文章の中で、DBからデータを取得し、買い物カゴDBにインサートする方法についての説明です。
  • 具体的なコード例を挙げながら、正しい記述を説明しています。
  • while文や配列を使用してデータを取得し、インサートする基本的な考え方も解説しています。

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

  • ベストアンサー
  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.3

>>1の補足に対しての回答は 単純に ↓ $products = mysql_fetch_array($result); while は、その括弧の中が成立している間だけ繰り返すものなので、product_id がユニークなものであるならば、単一であるはずであり、繰り返す必要はないということです。 今回の場合の、「成立している」というのはmysql_fetch_array から値が返ってきている場合という事。 mysql_fetch_arrayというのは、呼ばれるごとに $result から一行ずつレコードを取り出してきて、$products に配列として返している。 >>2に関しては、テキトーに書くので動かなかったら、ごめんなさい。 //--------------------------------- // DBから商品データ全読み込み $sql = "select * from products "; $result = mysql_query($sql) ; $DimProducts = array(); // 一応、配列の初期化 // ↑の配列に商品データ 全代入。 while($row = mysql_fetch_array($result)) { $product_id = $row["product_id"] $DimProducts[$product_id] = $row; } //--------------------------------- //--------------------------------- // んで、$product_id の商品データが必要なときに、↓のようにして呼び出す。 $DimData = $DimProducts[$product_id]; $product_cd = $DimData['product_cd']; $product_name = $DimData['product_name']; $price_intax = $DimData['price_intax']; //--------------------------------- まぁ、フィールド名と変数名が一緒だから、extract()使っても良さそうなもんだけど、この関数は用法と用量を間違うと毒になるので、お勧めはしない。 extractは、配列のキーを変数名として、展開してしまう関数。意図しないものまで変数になっちゃうときがあるから、自分で完全に把握できてない配列には使わないほうがいい。 一応、言ってみただけ。 //--------------------------------- > 商品を複数選択して<form>を送信すると、 > DBには1つの商品のみのデーターが > インサートされ、それ以外はインサートされません。 まず、原因の切り分け。 //--------------------------------- <form>から送信されてきているデータが正しいかどうか。 ↓ を コードの先頭にでも入れると、見れる。 print_r($_POST); //--------------------------------- 次に、(kaimonoKago.php)側のループが正常に行われているか確認。 これは、ループの中で、テキトーにprintでも入れて、確認してみてください。 //--------------------------------- ちなみに、俺のコードの書き方って だいぶ自己流入ってるから、あんまり真似しないほうがいいかも。 あぁ。。。長文になってしまいました。。。

hayaken73
質問者

お礼

お礼が遅くなり申し訳ございません。 指導いただいた内容で、検証を終えてからお礼を、と思ったのですが、 ど素人につき、相当消化するのに時間がかかりそうです。 先にお礼だけさせていただきます。 ありがとうございました。

その他の回答 (3)

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.4

昨日(というか早朝4時頃)に4も書いたんですが、どうやら送信し忘れたようなので、追記。 二度も同じ事を書くのが面倒なので、簡単に説明。 (ssid, product_cd)の2つを主キーとしているのでなければ、多分、原因は SSIDのあたり。 insert文のSSIDが 毎回同じ数値と思われるので、最初の一行以外は重複不可で無効になってる。 SSIDが重複可なら他に原因があるんでしょうけど。 あと insert の時でも戻り値は取っておいたほうがいい。 SQL投げるたびに、↓みたいに表示しとくとデバッグしやすい。 print "[$result] $sql<br>\n"; 更に気がついたことがあるので追記。 これってssid で誰が買い物カゴに入れたか判断してるんでしょうか? ユーザーCDみたいのがssidなんですかね。

hayaken73
質問者

お礼

色々やっているうちについに動きました!!! ■まずおっしゃっていたwhileを取り除きました。  ただこれだけではインサートは1つしか入りませんでした。   ■次に、DBの主キーをチェックしたら、DB「products」に主キーがなかったので設定  それでもまだうまくインサートされず ■配列部分 $kazu[$val]を変数$kazuに入れるのをやめ、直で$kazu[$val]を使用  $kazu = $kazu[$val]; $shoukei = $price_intax * $kazu;      ↓  $shoukei = $price_intax * $kazu[$val]; ---------------------- '" . mysql_real_escape_string ( $kazu ) . "',      ↓ '" . mysql_real_escape_string ( $kazu[$val] ) . "', 教えていただいた記述の仕方は、おおいに使えそうですね。 80%ぐらいしか消化していないので、これから教えていただいた 配列の処理方法を完璧にしたいと思います。 (いきづまったら、また別途質問するかもしれませんが) とりあえず、目的の配列2つの処理(DBに選択した商品のデーターを インサート)に成功しました。 本当に色々ありがとうございました。

hayaken73
質問者

補足

本当にお世話様です。 (遅くまでお付き合いいただき感謝に耐えません) >これってssid で誰が買い物カゴに入れたか判断してるんでしょうか? >ユーザーCDみたいのがssidなんですかね。 ssidについてはおっしゃる通りです。 kaimonoKagoのDBには、色々な方の買い物候補(いわゆる買い物カゴの中身)を入れて 最終的に確定した注文は、別の[注文DB]をつくろうかなと考えています。 お礼もすぐにしたいところですが、てこてこ、がんばっている最中につき、 うまくいったらお礼をさせて下さい。(すいません。m(・・)m) とにかくまだPHPがよくわからない事ばかりで、今のところうまくいっていません。 がんばってみます。 取り急ぎ報告まで

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.2

あぁ、失礼しました。 (1)でテーブルちゃんと書いてましたね。 んで、問題の解決にはつながらない事を ちょっと書き足します。 あんまり品数が多くないものという前提がありますが、以下のようなやり方もあります。 サーバーのメモリとか負荷とか気にしなければ、毎回SQLなげて一個一個商品データを取り出すより、 product_id をキーにした二次元配列に全部つっこんでから、そこからデータ取り出したほうが、俺的には頭の整理ができやすいです。 あと、数値型はシングルクォートで括る必要はないです。あっても問題ないかもしれませんが、よく分かりません。

hayaken73
質問者

お礼

>サーバーのメモリとか負荷とか気にしなければ、毎回SQLなげて一個一個商品データを取り出すより、 >product_id をキーにした二次元配列に全部つっこんでから、そこからデータ取り出したほうが、俺的には頭の整理ができやすいです。 アドバイス大変ありがたいのですが、私にはどのようにそれを記述してよいかわかりません。お手数ですが、コーディングを実際に教えていただければ、本当にありがたいのでよろしくお願いします。 お手数おかけして申し訳ないのと、お付き合いいただき本当にありがとうございます。 どうぞよろしくお願いします。

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.1

とりあえず、書き写しミスか分かりませんが、product_cd と product_id って別物ですか? あと、product_id ってユニークでなくて、複数あったりするもんですか? 商品IDだとしたら、複数あるとも思えず、複数ないのであれば、whileを使う必要もないかと。 ↓ ここね。 while($products = mysql_fetch_array($result)){ あと「うまくいかない」ってのが漠然としていて、にんともかんとも。

hayaken73
質問者

お礼

早速のご回答、本当にありがとうございます。 疑問点に対する答えは補足に書きましたので、こちらも参考にしていただければと 思います。

hayaken73
質問者

補足

ご回答ありがとうございます。 >あと、product_id ってユニークでなくて、複数あったりするもんですか? >商品IDだとしたら、複数あるとも思えず、複数ないのであれば、whileを使う必要もないか product_idはユニークなidです。 PHP歴、まだ数ヶ月の初心者なので、もしwhileを使わないとした場合には、正確にどのように記述すればよいのでしょうか?お手数をおかけしますがよろしくお願いします。 >『うまくいかない』とは・・・ 商品を複数選択して<form>を送信すると、DBには1つの商品のみのデーターが インサートされ、それ以外はインサートされません。 よろしくお願いします。

関連するQ&A

専門家に質問してみよう