🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

3回答

2332閲覧

連想配列の値をDBにinsertしたいです。

amaturePy

総合スコア131

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2019/12/04 04:54

EC2上でCSVファイルのデータをRDS(mysql)に挿入しようとしているのですが、連想配列の値をbindvalueの変数に格納できずうまくinsertクエリを実行できずにいます。
DBへの接続は完了済みです。

なんとかネットを参照にもう少し粘りたいのですが、期限があるためお力をお借頂きたいです。

CSVファイル内のデータの取得の完了はvar_dumpで確認できてます。
データの中身はこんな感じです。

[5]=> array(2) { ["line_id"]=> string(33) "*********" ["username"]=> string(12) "*********" } コード

以下のコードを実行すると以下のデータがないですよとエラー出ます。

PHP Fatal error: Uncaught PDOException: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'line_id' cannot be null in /home/ec2-user/index2.php:28 Stack trace: #0 /home/ec2-user/index2.php(28): PDOStatement->execute() #1 {main} thrown in /home/ec2-user/index2.php on line 28
<?php // DB connect $pdo = new PDO( 'mysql:host=************', '********', '*********', [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ] ); // CSV read $file = new SplFileObject('/tmp/******.csv'); $file->setFlags(SplFileObject::READ_CSV); $insert_array = []; foreach ($file as $line) { $insert_array[] = [ 'line_id' => $line[0], 'username' => $line[1], ]; } foreach($insert_array as $insert_arrays); { $stmt = $pdo->prepare("INSERT INTO users (line_id, name) VALUES (:lineid, :username)"); $stmt->bindValue(':lineid', $line_id[0], PDO::PARAM_STR); $stmt->bindValue(':username', $line_id[1], PDO::PARAM_STR); $stmt->execute(); } $pdo->commit(); ?> コード

また、調べると以下のように連想配列の出力はこのようにキーと値で
組むと説明している物もあったのですが、うまく
当てはめれず、上記同様に変数がnullと出てしまいました。

foreach($fruits as $key => $value){ }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

イメージ説明

変数名が一致していません。

投稿2019/12/04 05:00

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amaturePy

2019/12/04 06:06

ドキュメントからbindbvalueを理解仕切れてなかったです。 ですが、今回のご説明で使い方を理解することができました! ありがとうございました!
guest

0

ベストアンサー

PHP

1foreach ($file as $line) { 2 $insert_array[] = [ 3 'line_id' => $line[0], 4 'username' => $line[1], 5 ]; 6}

ここで作られる配列$insert_array ですが、↓こんな形になりませんか?

PHP

1// CSVの行が5行あるとして 2$insert_array[0]['line_id']; 3$insert_array[0]['user_name']; 4$insert_array[1]['line_id']; 5$insert_array[1]['user_name']; 6$insert_array[2]['line_id']; 7$insert_array[2]['user_name']; 8$insert_array[3]['line_id']; 9$insert_array[3]['user_name']; 10$insert_array[4]['line_id']; 11$insert_array[4]['user_name'];

$stmt->bindValueにセットしている$line_id['0']という記述ですが、「$line_id」という名前の配列の0番目の要素って意味となるので、エラーになっているのではないでしょうか。

セットするのは$insert_arrays['line_id']と$insert_arrays['user_name']かなと思います。

投稿2019/12/04 05:05

XNXSXMXR

総合スコア239

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amaturePy

2019/12/04 06:25

詳細まで解説ありがとうございます!試行錯誤の中で頭の中でごちゃごちゃとしていた物が整理できました! 配列構造はそうなっていたのですね。論理的に理解できました。 それは値がとれなくて当然でしたね。。。 また、頂いたアドバイスのコードを試したのですが、同様に$line_idに値がnullになります。。。。 foreach($insert_array as $insert_arrays); { $stmt = $pdo->prepare("INSERT INTO users (line_id, name) VALUES (:lineid, :username)"); $stmt->bindValue(':lineid', $insert_arrays['line_id'], PDO::PARAM_STR); $stmt->bindValue(':username', $insert_arrays['username'], PDO::PARAM_STR); $stmt->execute(); } $pdo->commit();
XNXSXMXR

2019/12/04 06:31

質問のコードを実際動かしたわけではないので確証がないのですが、foreach ($file as $line)で得られる$lineの中身ってどうなっていますか? 配列になっているのか、配列だけど値が空なのかもご確認ください。
amaturePy

2019/12/04 06:46 編集

はい。見た所配列には何もデータがありませんでした。 array(1) { [0]=> NULL } う〜〜ん。 $insert_arrayにはデータが入ってるが、$lineには何もない。。。ってあたり前ですよね(笑) 混乱する。
XNXSXMXR

2019/12/04 06:54

こちらの記事に、SplFileObjectを使ったCSVファイルの読み込み例がありました。 https://qiita.com/PitPat/items/3a47f57c0d357bc36940 この例のとおり、 foreach ($file as $line) { var_dump($line); } してみて、ちゃんと読み込めているか確認してみてください。 あと、CSVファイル周りで ・CSVファイルの中身がおかしい。(カンマ区切りになっていない等) ・CSVファイルの文字コードがShift_JISになっている。(EC2というか最近のサーバーって大抵UTF-8になってると思います)  ・設置しているファイルのパーミッションが厳しくて読み込めていない。 などなどあるかと思いますので、ご確認ください。
amaturePy

2019/12/04 07:07 編集

なるほど サーバーやCSVなどにも注意を払う必要がありましたか 確かにコード以外の要因で読み込めてなかったら、コードを一生見てても直らないですね。 EC2内に設置したCSVはカンマ区切りになっているのは確認したのと、$insert_arrayをデバックした際に値が とれていたのでCSVとして読み込みは成功していると思います。 ファイルの中身は問題ないかと思います。 ありがとうございます! 頂いたURLも参照して粘ってみます!
amaturePy

2019/12/04 07:16 編集

失礼しました! var_dumpをforrachの処理範囲の外に書いていたのが原因でした! こちらも勉強になりました。 修正後にきちんとデータを確認できました! array(2) { [0]=> string(33) "***********" [1]=> string(12) "****" }
guest

0

$line_idという配列が見当たりませんね
$line_id[0]を参照してもエラーになるでしょう

※エラーが拾えているならtry-catchしているはずですが
それも記載がないようです。

投稿2019/12/04 05:00

yambejp

総合スコア116661

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amaturePy

2019/12/04 06:14

なるほど。 今回はtry-catchを省いてしまいました。 今後はきちんと付けうようにします! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問