質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

89.10%

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 178

amaturePy

score 89

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){
 }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+2

イメージ説明

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/04 15:06

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

    キャンセル

checkベストアンサー

0

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/04 15:54

    こちらの記事に、SplFileObjectを使ったCSVファイルの読み込み例がありました。
    https://qiita.com/PitPat/items/3a47f57c0d357bc36940

    この例のとおり、
    foreach ($file as $line) {
    var_dump($line);
    }

    してみて、ちゃんと読み込めているか確認してみてください。

    あと、CSVファイル周りで
    ・CSVファイルの中身がおかしい。(カンマ区切りになっていない等)
    ・CSVファイルの文字コードがShift_JISになっている。(EC2というか最近のサーバーって大抵UTF-8になってると思います) 
    ・設置しているファイルのパーミッションが厳しくて読み込めていない。

    などなどあるかと思いますので、ご確認ください。

    キャンセル

  • 2019/12/04 15:59 編集

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

    キャンセル

  • 2019/12/04 16:13 編集

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

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/04 15:14

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

    キャンセル

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

  • ただいまの回答率 89.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる