0

現在、CSV ファイルをアップロードし、各レコードを 1 つずつデータベースに入力しようとしています。CSV の列は、データベースのフィールド名と同じ名前ですが、CSV 内でデータの順序が異なる場合があります。別の順序で言うと、名前のリストが常に 1 列目にあるのではなく、3 列目にある可能性があることを意味します。

本当に私が求めているのは、私が本当に立ち往生しているので、上記をどのように行うかです。

現時点ではデータベースに挿入しませんが、CSV ファイルから配列を取得します。

以下のコード:

index.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>CSV Import</title>
</head>

<body>

<form action="upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="csv"/>
    <input type="submit" name="submit" value="Save" />
</form>

</body>

</html>

config.php

<?php

/* Database Connection */

$con = mysql_connect('xxxxxxxx', 'xxxxxxxx', 'xxxxxxxx');

if(! $con )
{
  die('Could not connect: ' . mysql_error());
}

$select_db = mysql_select_db('xxxxxxxx');

?>

アップロード.php

<?php

include('config.php');

$file = "test.csv";
$separator = ",";
$length = filesize($file);

$handle = fopen($file, "r");
    $csvData = fgetcsv($handle, $length, $separator);
fclose($handle);

$i = 0;

while($i >= 1){

$title = $csvData[0];
$firstName = $csvData[1];
$secondName = $csvData[2];
$emailAddress = $csvData[3];
$houseNumber = $csvData[4];
$mobileNumber = $csvData[5];
$address1 = $csvData[6];
$address2 = $csvData[7];
$address3 = $csvData[8];
$address4 = $csvData[9];
$postcode = $csvData[10];

mysql_query("INSERT csv SET title='$title', firstName='$firstName' ,secondName='$secondName', emailAddress='$emailAddress', houseNumber='$houseNumber' ,mobileNumber='$mobileNumber', address1='$address1', address2='$address2', address3='$address3' ,address4='$address4', postcode='$postcode'")

$i++;

}

?>
4

2 に答える 2

0

列名を含むヘッダー行があると仮定すると、正しい upload.php:

<?php

include('config.php');

$file = "test.csv";
$separator = ",";
$length = 0; // size of the longest line(!), 0 = no limit
$fields = array('title', 'firstName', 'secondName', 'emailAddress', 'houseNumber', 'mobileNumber', 'address1', 'address2', 'address3', 'address4', 'postcode'); // use it as a white list

$handle = fopen($file, "r");

// get 1st line (header) and flip keys and values
// format like [title] --> 0, [firstName] --> 1, ...
$header = array_flip(fgetcsv($handle, $length, $separator));

$values = array();
// while we can read lines as csvData:
while(($csvData = fgetcsv($handle, $length, $separator)) !== false){
    foreach ($fields as $field) // put all values in an array in correct order
        $values[] = $csvData[$header[$field]];

    mysql_query("INSERT INTO csv (" . implode(',', array_keys($header)) . ") VALUES (" . implode(',', $values) . ")"); // only for demonstration - be careful with spaces and quotes in values - better switch to PDO!

}
fclose($handle);

それが役立つことを願っています! テストされていませんが、動作している可能性があります:)。

注: 誰かが値を省略し、データベースでそれらを として宣言した場合、これは失敗しますNOT NULL。このサンプルは、SQL インジェクションに対する対策を行っていないことに注意してください。PDOのことは忘れてmysql_query、使い方を学んでください。

于 2013-07-08T21:43:20.393 に答える
0

レコードを挿入するために使用しているコードは、ここで失敗します。

$i = 0;

while($i >= 1){   // $i = 0. This test will fail.

// do stuff

}
于 2013-07-08T21:19:56.850 に答える