質問編集履歴

2 コードを修正しました。foreachでCSVファイルの値を取得。

amaturePy

amaturePy score 59

2019/12/03 21:31  投稿

PHP・bindvalueに関するエラーを解決したいです。
EC2内のPHPファイルでCSVのデータをRDSに挿入するコードを書いてます。
CSVの読み取りとDBへの接続は完了済み。
ですが、いざクエリを実行すると以下のエラーが出ます
調べるとbindvalueの使い方に問題があると思うのですが、
修正箇所を見つけられないでいます。
もしエラーの原因箇所が分かる方がいらっしゃれば教えて頂きたいです。
```
エラー文
PHP Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in /home/ec2-user/index.php:35
Stack trace:
#0 /home/ec2-user/index.php(35): PDOStatement->execute()
#1 {main}
 thrown in /home/ec2-user/index.php on line 35
```
```
CSVファイル&テーブル情報
【CSVファイル】(lineidは英数字の混合なのでbindvalueの引数にはintではなくstrを置いてます)
-------------------
lineid | username |
-------------------
2222aaaa | tarou tanaka
DB(usersテーブル)
-------------------
id | line_id | name |
-------------------
```
```
実行コード
<?php
try {
   $file = new SplFileObject('/tmp/winneyuser.csv');
   $file->setFlags(SplFileObject::READ_CSV);
}catch (RuntimeException $e) {
   throw $e;
}
 
<?php
try{
   $pdo = new PDO(
       'mysql**********',
       '******',
       '********',
       [
           PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
           PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
       ]
);
} catch(PDOException $e) {
   header('Content-Type: text/plain; charset=UTF-8', true, 500);
   exit($e->getMessage());
}
header('Content-Type: text/html; charset=utf-8');
$line_id -> $file[0];
$username -> $file[1];
   
foreach($file as $files) {
$file = new SplFileObject('/tmp/winneyuser.csv');
$file->setFlags(SplFileObject::READ_CSV);
$insert_array = [];
foreach ($file as $line) {
   $insert_array[] = [
   'line_id' => $line[0],
   'username' => $line[1],
   ];
}
   $stmt = $pdo->prepare("INSERT INTO users (line_id, name) VALUES (:lineid, :username)");
   
   $stmt->bindValue(':line_id', $line_id, PDO::PARAM_STR);
   $stmt->bindValue(':lineid', $line_id, PDO::PARAM_STR);
   $stmt->bindValue(':username', $username, PDO::PARAM_STR);
 
foreach($insert_array as $insert_data) {  
   $stmt->execute();
           
}
   $pdo->commit();
}  
?>
```
  • PHP

    28126 questions

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

  • Amazon EC2

    424 questions

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

  • AWS(Amazon Web Services)

    3205 questions

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

  • SQL

    3678 questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

1 質問内容を編集

amaturePy

amaturePy score 59

2019/12/03 17:43  投稿

PHP・bindvalueに関するエラーを解決したいです。
EC2内のPHPファイルでCSVのデータをRDSに挿入するコードを書いてます。
CSVの読み取りとDBへの接続は完了済み。
ですが、いざクエリを実行すると以下のエラーが出ます
調べるとbindvalueの使い方に問題があると思うのですが、
修正箇所を見つけられないでいます。
もしエラーの原因箇所が分かる方がいらっしゃれば教えて頂きたいです。
```
エラー文
PHP Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in /home/ec2-user/index.php:35
Stack trace:
#0 /home/ec2-user/index.php(35): PDOStatement->execute()
#1 {main}
 thrown in /home/ec2-user/index.php on line 35
```
```
CSVファイル&テーブル情報
【CSVファイル】(lineidは英数字の混合なのでbindvalueの引数にはintではなくstrを置いてます)
-------------------
lineid | username |
-------------------
2222aaaa | tarou tanaka
DB(usersテーブル)
-------------------
id | line_id | name |
-------------------
```
```
実行コード
<?php
try {
   $file = new SplFileObject('/tmp/winneyuser.csv');
   $file->setFlags(SplFileObject::READ_CSV);
}catch (RuntimeException $e) {
   throw $e;
}
 
try{
   $pdo = new PDO(
       'mysql:host=database-1.cuiejdfzi0uf.ap-northeast-1.rds.amazonaws.com;dbname=hitobito_data;charset=utf8mb4',
       'admin',
       'hitobitoOwner',
       'mysql**********',
       '******',
       '********',
       [
           PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
           PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
       ]
);
} catch(PDOException $e) {
   header('Content-Type: text/plain; charset=UTF-8', true, 500);
   exit($e->getMessage());
}
header('Content-Type: text/html; charset=utf-8');
$line_id -> $file[0];
$username -> $file[1];
   
foreach($file as $files) {
   $stmt = $pdo->prepare("INSERT INTO users (line_id, name) VALUES (:lineid, :username)");
   
   $stmt->bindValue(':line_id', $line_id, PDO::PARAM_STR);
   $stmt->bindValue(':username', $username, PDO::PARAM_STR);
   $stmt->execute();
           
   $pdo->commit();
}
?>
```
  • PHP

    28126 questions

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

  • Amazon EC2

    424 questions

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

  • AWS(Amazon Web Services)

    3205 questions

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

  • SQL

    3678 questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る