PHPでページを作成してアップロードし、アップロードしたcsvファイルのデータを複数のテーブルにインポートしたいと考えています。ここで検索してみましたが、csv から複数のテーブルにインポートするものが見つからないようです。ここで何か助けていただければ幸いです。ありがとうございました。
5 に答える
上記で提案された別のバリアントとして、CSV を行ごとに読み取り、各行をフィールドに分解できます。各フィールドは 1 つの変数に対応します。
$handle = fopen("/my/file.csv", "r"); // opening CSV file for reading
if ($handle) { // if file successfully opened
while (($CSVrecord = fgets($handle, 4096)) !== false) { // iterating through each line of our CSV
list($field1, $field2, $field3, $field4) = explode(',', $CSVrecord); // exploding CSV record (line) to the variables (fields)
// and here you can easily compose SQL queries and map you data to the tables you need using simple variables
}
fclose($handle); // closing file handler
}
PHPmyadmin にアクセスできる場合は、そこに CSV をアップロードできます。次に、目的の各テーブルにコピーする
一部のデータが 1 つのテーブルに移動し、他のデータが別のテーブルに移動するというコメントに応えて、簡単な例を次に示します。
テーブル 1 には、名前、年齢、性別の 3 つのフィールドがあります。Table2 には、髪の色、靴のサイズの 2 つのフィールドがあります。したがって、CSV は次のようにレイアウトできます。
john smith,32,m,blonde,11
jane doe,29,f,red,4
anders anderson,56,m,grey,9
次のステップでは、関数fgetcsvを使用します。これにより、csv の各行が配列に分割され、それを使用して SQL ステートメントを作成できます。
if (($handle = fopen($mycsvfile, "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
// this loops through each line of your csv, putting the values into array elements
$sql1 = "INSERT INTO table1 (`name`, `age`, `sex`) values ('".$data[0]."', '".$data[1]."', '".$data[2]."')";
$sql2 = "INSERT INTO table2 (`haircolour`, `shoesize`) values ('".$data[3]."', '".$data[4]."')";
}
fclose($handle);
}
これは検証などの SQL セキュリティを考慮していないことに注意してください。ただし、基本的にはこのように動作します。
if (($handle = fopen($mycsvfile, "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
// this loops through each line of your csv, putting the values into array elements
$sql1 = "INSERT INTO table1 (`name`, `age`, `sex`) values ('".$data[0]."', '".$data[1]."', '".$data[2]."')";
$sql2 = "INSERT INTO table2 (`haircolour`, `shoesize`) values ('".$data[3]."', '".$data[4]."')";
}
fclose($handle);
}
上記のコードでは、2 つの挿入クエリを使用しています。これらのクエリをどのように実行しますか?
問題は、どのフィールドがどのテーブルに対応しているかを区別するように思えます。次のようなヘッダーを送信するとき
table.field, table.field, table.field
ヘッダーを分割すると、すべてのテーブルとフィールドが取得されます。
それは行く方法でしょうか?
ではごきげんよう
ps:あなたのコメントのために...
csv ファイルには、フィールド名を含む最初の行があります/含めることができます。csv データを複数のテーブルにコピーする必要がある場合は、回避策を使用して、どのフィールドがどのテーブルに対応しているかを調べることができます。
user.username, user.lastname, blog.comment, blog.title
"sam" , "Manson" , "this is a comment", "and I am a title"
ここで、csv データを読み取るときに、最初の行で作業し、ドットでタイトルを分割して、使用されているテーブルとフィールドを確認します。
この方法を使用すると、csv データを複数のテーブルにコピーできます。
ただし、最初にコーディングする必要があります:(
フィールド名を分割するには
// only the first line for the fieldnames
$topfields = preg_split('/,|;|\t/')
foreach( $topfields as $t => $f ) {
// t = tablename, f = field
}