PHPのforeachでMysqlにINSERT

このQ&Aのポイント
  • PHPのforeach文を使ってMysqlにデータをINSERTする方法について質問があります。
  • 質問者は配列$resultをforeach文で処理し、連想配列の値をデータベースに追加しようとしています。
  • しかし、データベースに格納されるのは1行目のデータのみで、原因が分かりません。アドバイスを求めています。
回答を見る
  • ベストアンサー

PHPのforeachでMysqlにINSERT

PHPのforeach文を使いMysqlにデータをINSERTしたいです。 配列$resultは以下のような連想配列になっています。 Array ( [0] => Array ( [A] => 1 [B] => 2 [C] => 3 [D] => 4 [E] => 5 ) [1] => Array ( [A] => 2 [B] => 4 [C] => 6 [D] => 8 [E] => 10 ) ) 上記の連想配列をforeach()文で以下の処理をします。 foreach ($result as $key => $value) { /** * データベースへの追加(新規追加時だけ実行。コメント忘れずに) */ $sql = $pdo->prepare('INSERT INTO sample(a, b, c, d, e) VALUES(:a, :b, :c, :d, :e)'); $sql->execute(array(':a' => $value[A], ':b' => $value[B], ':c' => $value[C], ':d' => $value[D], ':e' => $value[E])); } その後データベースでselect * from test;とすると1行目のデータしか格納されていません。原因が不明です。 print すると期待する配列要素が表示されますので配列のデータ配置不備ではありません。 アドバイス頂きたくお願い申し上げます。

  • PHP
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • coai
  • ベストアンサー率50% (152/301)
回答No.1

むしろ、1行目が挿入されているという事の方が不可解な気が… ちゃんと見てないけど、こういうことかな。 $sql->execute(array('a' => $value[A], 'b' => $value[B], 'c' => $value[C], 'd' => $value[D], 'e' => $value[E])); あるいは『INSERT INTO sample』なのに『select * from test;』としているのがおかしいのか、それともこれは単に書き間違えなのか? なんでループ内でprepareしてるんだろうとか、なんで無意味に$keyを取得してるんだろうとか、$value[A]とかはちゃんと$value['A']と括った方がいいよねとか、DBに主キーはちゃんと設定しているのだろうかとか、エラーやワーニングは出ていないんだろうかとか、色々とあるけれど、まあそこはいいとして… aとかAとか見てらんねーよ!! テストやサンプルにしても、もうちょっとなんかあるだろう!! 見てらんねーもん作っても、あんま勉強になんかなんねーよ!! という事は、強く言っておこう。 単なる書き間違えかもしんないが、sampleやtestなんて現実的な意味をなさない名前だから、間違っていても気付かない。 aとかAも同様、だから碌に勉強にならない。 プログラムなんて、頭の中で意味をこねくり回すものだからだ。 という事。

fxlateengineer
質問者

お礼

すみません。$keyも残骸です。ありがとうございました。

fxlateengineer
質問者

補足

ご回答頂きありがとうございます。 >DBに主キー 申し訳ございません。オートインクリメントし忘れているだけでした。 ただ、execute()はマニュアルの書き方を習っているので間違いはありませんでした。またよくよく見てみると、Prepare the query onceと書いてあったのでforeachの外に出しました。 その他ご指摘頂いた件は書き間違いなだけです。もろもろ失礼致しました。 >aとかAとか見てらんねーよ!! >テストやサンプルにしても、もうちょっとなんかあるだろう!! >見てらんねーもん作っても、あんま勉強になんかなんねーよ!! 閲覧者様が読みやすいように簡単に書いたつもりが間違っていてはまるで意味がないことは反省しておりますが、それだけで勉強している訳ではありませんのでご理解頂きたく。 書き方の問題だけであって動きは同じでしょう。 ただ、解決に繋がりましたのでその点はもろもろご指摘頂けたことに感謝申し上げます。 誠にありがとうございました。

関連するQ&A

  • phpにてforeachで配列の値が取り出せない

    以下のコードで「print $value」が空っぽなのですが なにが間違っているのかがわかりません。 ---------------------- $a=1 $b=2 $c=3 $d=4 $num = array($a,$b,$c,$d); foreach($num as $value){ print $value; } ---------------------- 初歩的な質問で恐れ入りますが 間違っている箇所があれば指摘いただきたいです。 宜しくお願いします。

    • ベストアンサー
    • PHP
  • MYSQLとPHPによって取得する多次元配列

    はじめてご質問させていただきます。 現在以下のようなテーブルが3つあります。 [ tbl1 ] | tbl1Key | title | | 1 | a | | 2 | b | | 3 | c | | 4 | d | [tbl2] | tbl2Key | tbl1Key | tbl3Key | | 1 | 2 | 2 | | 2 | 3 | 1 | | 3 | 3 | 4 | | 4 | 1 | 3 | [tbl3] | tbl3Key | value | | 1 | aaa | | 2 | bbb | | 3 | ccc | | 4 | ddd | 上記のデータソースを元に以下のような結果を得たいと考えています。 array( array( 'tbl1Key'=>1, 'title'=>'a', 'values' => array( array( 'tbl3Key'=>3, value='ccc' ) ), array( 'tbl1Key'=>2, 'title'=>'b', 'values' => array( array( 'tbl3Key'=>2, value='bbb' ) ), array( 'tbl1Key'=>3, 'title'=>'c', 'values' => array( array( 'tbl3Key'=>1, value='aaa'), array( 'tbl3Key'=>4, value='ddd' ) ), array( 'tbl1Key'=>4, 'title'=>'d', 'values' = > array( array( 'tbl3Key'=> , value='' ) ) ) この場合phpによって $sql = ("select * from `tbl1`"); $res = mysql_query( $sql, $con ); $data = array(); while( $row =mysql_fetch_object( $res ) ) { $sql = ("select * from `tbl3` inner join `tbl2` on `tbl3`.`tbl3Key`=`tbl2`.`tbl3Key` where `tbl2`.`tbl1Key`={$row->tbl1Key}"); $res2 = mysql_query( $sql, $con ); $tmp = array(); while( $r = mysql_fetch_object( $res2 ) ) { $tmp[] = $r->value; } $row->values = $tmp; $data = $row; } まずtbl1のデータをすべて取り、配列dataに格納する段階で、tbl1と関連付けされたtbl3のvalueを取得し配列tblに格納、それを新しい要素として配列dataにプッシュしている状況です。 こういったテーブルでいうところの1カラムのみ配列で返すような事は、こういったループを使って以外にも可能なのでしょうか。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • PHP/mySQLでインサートができません。

    PHPとmySQLを勉強中の初心者ですが、よろしくお願いします。 PHPで簡単なインサート文を作ってそれをmySQLに保存しようとしているのですが、以下のエラーが出てしまいます。 Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource プログラムは以下の通りです。HOSTNAME,USERNAME,DBPWDは別のところで定義していますが、mysql_connect, mysql_select_dbではエラーにならないので、データベースの選択まではうまく行っていると思うのですが。 $conn = mysql_connect(HOSTNAME, USERNAME, DBPWD); if(!$conn){ die("Logon Failure to mysql Server."); } $db = mysql_select_db(DBNAME, $conn); if(!$db){ die("Cannot access to the DB"); } foreach($csv_ary as $a => $b) { $query = "INSERT INTO TEST field_a VALUES $a"; if (!mysql_query($query, $db)){ echo "更新失敗: SQL=$query<br>"; } } mysql_close($conn); field_aはvarchar(10)でPrimary_key, NOT NULLの設定です。 Foreachで展開した配列の値はちゃんと長さ10の文字列が入っています。 PHP 4.3.11は mySQL 4.0.27です。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • array値を別のテーブルへインサートしたい。

    phpとmysqlを見よう見まねでやっている 初心者です。 atableのチェックボックスよりPOSTした $sample_array(atable.indexの値が複数です。) をbtableへ移動したいと思い、以下の式を自分なりに 考えてみましたが上手くbtableへinsert されません。 atableの複数のindexは選ばれているようですが それをどうしたらbtableへ複数insertできるのか良くわかりません。 何が間違っているのか、atableからbtableへ複数insertできる式を 具体的に書いて頂くと大変助かります。 どうかご教授の程よろしくお願い致します。 $sample_array = $_POST['sample_array']; $where=""; if (isset($sample_array) and is_array($sample_array)) { $where .=" AND atable.index in ("; foreach ($sample_array as $key=>$val) { if($key>0) $where .=","; $where .="'" .mysql_real_escape_string($val) . "'"; } $where .=")"; } $sql= "select * from atable"; $sql .= " where 1"; $sql .= $where; $result = mysql_query( $sql ); while ( $row = mysql_fetch_array( $result ) ) { $sql = "insert into btable (a_no,b_no,c_no) values ('" . $row['no_a'] . "', '" . $row['no_b'] . "','" . $row['no_c'] . "')"; }

    • ベストアンサー
    • PHP
  • PHP+MySQLでの配列のinsert文について

    PHP+MySQLでの配列のinsert文について はじめまして。 POSTされた配列データのDB一括挿入方法で約2週間悩み中で非常に困っております。 私の配列の理解が不足しているため、初心者の私でもわかるように解決方法をご教示いただけましたら大変助かります!何卒、よろしくお願い致します。 行いたい処理といたしまして、 [index.php] CSVアップロード(名前・メアド・金額・年月日の4項目)→※解決しました。  ↓↓↓ [check.php] CSVデータをテーブルで入力されている行数分をループして表示→※解決しました。  ↓↓↓ [finish.php] check.phpで表示した配列データをPOSTで受け取りDBに登録する。→※未解決 となります。 ソースは下記のようになります。 ※index.phpは今回無関係と思うので省略します。 ━━━━ [check.php]ここから ━━━━ ・ ・ ・ <form action="finish.php" method="post"> <? while($arr = fgetcsv_reg($fp,1024)){ ?> <? //空行以外を処理 $num = count($arr); if(!$arr ==''){ // $namae = $arr[0]; //名前 $mail = $arr[1]; //メアド $money = $arr[2]; //金額 $year = $arr[3]; //年 $month_hen = $arr[4]; //月 $month = sprintf("%02d", $month_hen); //1~9月(1桁)の場合、前に0を付加する $day_hen = $arr[5];//日 $day = sprintf("%02d", $day_hen); //1~9日(1桁)の場合、前に0を付加する // ?> <input type="hidden" name="namae[]" value="<?php echo $namae ?>"> <input type="hidden" name="mail[]" value="<?php echo $mail ?>"> <input type="hidden" name="money[]" value="<?php echo $money ?>"> <input type="hidden" name="year[]" value="<?php echo $year ?>"> <input type="hidden" name="month[]" value="<?php echo $month ?>"> <input type="hidden" name="day[]" value="<?php echo $day ?>"> ・ ・ ・ <input type="submit" value="  一括登録する  " /> </form> ━━━━ [check.php]ここまで ━━━━ ━━━━ [finish.php]ここから ━━━━ ・ ・ ・ // DB登録部分開始 if ($_POST['submit']) { $arr = array( 'reg_id', //auto_increment 'user_id', //ユーザーID(セッションで保持) 'namae', //名前 'mail', //メアド 'money',//金額 'ymd'//年月日 ); $value = array( NULL, mysql_real_escape_string( $_SESSION['user_id'] ), mysql_real_escape_string( $_POST['namae'] ), mysql_real_escape_string( $_POST['mail'] ), mysql_real_escape_string( $_POST['money'] ), mysql_real_escape_string( $_POST['year'] . '-' . $_POST['month'] . '-' . $_POST['day'] ) ); // DB登録部分終了 //ループ処理開始 foreach ( $arr as $value ) { $sql = "insert into receipt_issue ( $arr ) values ( $value )"; mysql_query($sql); $result = mysql_query( $sql ) ; //ループ処理終了 } } ・ ・ ・ ━━━━ [finish.php]ここまで ━━━━ というソースなのですが、データベースに登録できません。 例えば「finish.php」内に、 print_r( $_POST['namae'] ); と記述すると、 Array ( [0] => ああ君 [1] => いい君 [2] => うう君 [3] => ええ君 ) とちゃんと配列は受けとれているようです。 そもそもDB接続ができていないということもありません。 ※配列でない場合のテストでちゃんと接続・登録できていました。 いろいろ調べた中で、$value = array内の記述方法に問題があるのか・・・ と思い、色々調べて試したのですがダメでした。。。 上記の仕組みでループさせてデータベースに登録するには、どのように記述したらよろしいでしょうか? 情報に不足がございましたら、申し訳ございません。その点ご指摘いただきましたら必要な情報を再度投稿します。 何卒、お力をお貸しいただけましたら幸いでございます。 宜しくお願い致します!

    • 締切済み
    • PHP
  • phpの配列の宣言を自動でしたい

    $result = sqlite_query($sql,$con); // クエリを実行 $row = sqlite_num_rows($result); // 取得したレコード件数を変数$rowに格納する $a[1]=a; $a[2]=b; ~~ $a[rowの数値まで]=z; 上のように$a[$row]=~~;と配列の受け口を作り、そこにデータベースのデータを入れたいのですが、どうすればいいのでしょうか? $array = sqlite_fetch_array($result);とは別の配列にしたいです int seiseki[$row]でもだめでした どなたかお願いします

    • ベストアンサー
    • PHP
  • 複数のforeachをまとめるには

    下記の質問と全く同じことをしたいのですが http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1332135363 回答をみても分かりませんでした。 array_mergeを使うとあったので foreach ($xmlData->Item as $itemValue) foreach ($xmlData2->Item as $itemValue2) $result = array_merge($itemValue, $itemValue2); print_r($result); としてみましたが、 Warning: array_merge() [function.array-merge]: Argument #1 is not an array とエラーが出てしまいます。 最終的には以下のようにDBに入れたいと思っているのですが その前段階としてforeachをまとめるにはどのようにしたらよいででしょうか。 $sql = "INSERT INTO teble (itemname,price) VALUES ('".$itemValue."','".$itemValue2."')";

    • ベストアンサー
    • PHP
  • INSERTできない

    お世話になります。 PHP4.3+Windows版Postgres8.0で構築中です。 ものすごく一般的なinsert文 $sql="INSERT INTO dic (id,word,mean,hi) VALUES('$id','$word','mean','$hi')"; $result=pg_exec ($dbcon, $sql); とすると、 array value must start with "{" or dimension information と怒られてしまいます。 配列は{で始めよってことなのでしょうか。 配列でのinsert方法ってよくわからないのですが、そういう方法があるのでしょうか。 pgAdminの使い方があまりわからなくて、いいかげんな設定になっているためこんなエラーが出てしまうのかとも思うのですが、どこか確認箇所等ありましたらご指摘いただければと思います。 もう半日潰してしまいました。。。(涙 コマンドラインからも同様のエラーが返ります。 #ちなみにMySQLで動いていたものをPostgresに移植中で、プログラムには間違いない・・・と思います。 よろしくお願いいたします。

  • 配列の初期化について(foreachを使う際)

    配列を、foreachの中で処理して、再び配列に入れたいです。 foreach ($a as $b) {   $tmp[]=処理($b); } ってやると、配列で取得できるのですが、 $tmp=array(); foreach ($a as $b) {   $tmp=処理($b); } ってやると、配列にならずに、 1つしかとれません。 どちらも、配列を初期化しているつもりなのですが、 $tmp=array();と、$tmp[]では、何が違うのでしょうか?

    • ベストアンサー
    • PHP
  • foreachの処理方法について

    ●やりたい事 【変更前】は抽出した顧客を一度に全て処理していた。 【変更後】は抽出した顧客を100件ごとに処理したい。 抽出後の処理をforeachでやっているので 100件処理して次の101件目からなど、どう対処してよいか わかりません。よい対処方法があれな教えてください。 ※「対象条件のデータを全件抽出する」部分は変更したくないです。 その後の処理で対応できればと考えています。 DB接続処理は省略してます。 【変更前】 //対象条件のデータを全件抽出する $sql = "select * from テーブル名"; $result=mysql_query($sql); if(!$result){ mysql_close($conn); exit; } while ($row = mysql_fetch_array($result)) { $data[] = $row; } mysql_free_result($result); foreach($data as $value){ //該当顧客を対象に処理する } 【変更後】 //対象条件のデータを全件抽出する $sql = "select * from テーブル名"; $result=mysql_query($sql); if(!$result){ mysql_close($conn); exit; } while ($row = mysql_fetch_array($result)) { $data[] = $row; } mysql_free_result($result); //ループ数の計算 $loop = ceil( count($data) / 100 ); //************************************* //ここで$dataを分割できないでしょうか? //************************************* for($i=0;i<$loop;$i++){ foreach($data as $value){ //該当100件ごと顧客を対象に処理する } }

    • ベストアンサー
    • PHP