みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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内の記述方法に問題があるのか・・・
と思い、色々調べて試したのですがダメでした。。。

上記の仕組みでループさせてデータベースに登録するには、どのように記述したらよろしいでしょうか?

情報に不足がございましたら、申し訳ございません。その点ご指摘いただきましたら必要な情報を再度投稿します。

何卒、お力をお貸しいただけましたら幸いでございます。
宜しくお願い致します!

投稿日時 - 2014-05-26 16:58:52

QNo.8611628

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

#2です。

今ロジックで処理しようとすると、このようになると思いますよ。
求めているものとは異なると考えます。
insert into receipt_issue ( Array ) values ( reg_id )
insert into receipt_issue ( Array ) values ( user_id )
insert into receipt_issue ( Array ) values ( namae )
insert into receipt_issue ( Array ) values ( mail )
insert into receipt_issue ( Array ) values ( money )
insert into receipt_issue ( Array ) values ( ymd )
ダブルクォーテーションの中に変数を記すと確かに展開を行いますが、
配列の中身を勝手にカンマ区切りで展開するわけではありませんよ。
カンマ区切りで展開したいなら、
implode(",", $arr)
などとしないとできません。

また、
$sql = "insert into receipt_issue ( $arr ) values ( $value )";
echo $sql;
exit;
mysql_query($sql);

とした際に「Resource id #6」と表示されるならば、そもそも変数名を誤っているなど
が原因と思われます。
Resource id #nは、例えば今回で言えばDBにクエリを発行した際に取得できる
リソースなどがそれにあたります。
つまり、格納されている内容は文字列ではありません。
http://www.php.net/manual/ja/function.mysql-query.php


また、
> mysql_query($sql);
> $result = mysql_query( $sql ) ;
となっていますが、上のmysql_query()は不要ですね。


上記の状態が解消され、正しく文字列が出力されてきたら、SQLが誤っている状態であることが
確認できるでしょう。
そしたら、前回回答しましたが、正しいループ、正しい変数値を利用してSQL文を生成するよう
修正すればいいでしょう。

投稿日時 - 2014-05-27 09:31:38

ANo.4

$sql = "insert into receipt_issue ( $arr ) values ( $value )";

<ここにecho $sql ;  を入れてください。>

mysql_query($sql);

<ここに入れたのでは無いですか?>

$result = mysql_query( $sql ) ;

投稿日時 - 2014-05-26 19:06:44

補足

ご指摘いただきましたように、

<ここにecho $sql ;  を入れてください。>

の場所にecho $sql ;を入れて表示いたしましたら、
「Resource id #6」と出力されました。
これはどういう意味なのでしょう?

理解が不足しており、申し訳ございません。

投稿日時 - 2014-05-26 19:22:44

ANo.3

>$sql = "insert into receipt_issue ( $arr ) values ( $value )";
>の下

ですよ。select が出てくることはないでしょ?

投稿日時 - 2014-05-26 18:23:03

補足

すみません、、、
直下で echo $sql ;
を入れてみたところ、「Resource id #6」と出力されました。
これはどういう意味なのでしょう?
検索して調べてみましたが「エラー」という意味でもなさそうな・・・

投稿日時 - 2014-05-26 18:40:58

ANo.2

$arrに入っているのはカラム名だけですよね?
それをループしてもカラム数分がループされて、全く意図しない動きになりますよ。

この作りだと
foreach ( $_POST["namae"] as $rowIndex => $dummy) {
 $sql = "insert into receipt_issue ($arr[1], $arr[2], $arr[3], $arr[4], $arr[5]) values ( $value[1], $value[2][$rowIndex], $value[3][$rowIndex], $value[4][$rowIndex], $value[5][$rowIndex])";

みたくしないと出来ません。

投稿日時 - 2014-05-26 17:58:04

補足

ご回答ありがとうございます。
私の記述が根本的に間違っているような気がしてきました。
もっともよいと考えれる記述方法をお教えいただけましたら大変助かります。
お手数ですが、よろしくお願い致します。

投稿日時 - 2014-05-26 18:44:30

ANo.1

$sql = "insert into receipt_issue ( $arr ) values ( $value )";

の下に

$sqlを表示してみましょう。

insert into receipt_issue ( 'reg_id', 'user_id', 'namae', 'mail', 'money', 'ymd' )
values ( 'user_id','namae','mail','money','year' . '-' . 'month' . '-' . 'day' )

であれば正解?かと思ったのですが、'reg_id'は登録時に設定されるから不要かな。

投稿日時 - 2014-05-26 17:16:34

補足

アドバイスありがとうございます。
$sqlを表示してみましたところ、
select * from ●● where ●●_user_id = '○○'
と表示されました。

なお、
> values ( 'user_id','namae','mail','money','year' . '-' . 'month' . '-' . 'day' )

といただきましたが、これでPOST送信された内容を受け取れるのでしょうか?

すみません、もう少し具体的にご説明いただきましたら大変助かります。
何卒、よろしくお願い致します。

投稿日時 - 2014-05-26 17:50:10

あなたにオススメの質問