0

現在、CSV からデータベースに 1 行のデータを追加できましたが、次の行と次の行を追加できません。

データベースに挿入されるのは 1 行だけで、すべての行がデータベースに挿入され始めるのはなぜですか?

以下のコード:

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");

$header = array_flip(fgetcsv($handle, $length, $separator));

$values = array();

$i = 1;
while(($csvData = fgetcsv($handle, $length, $separator)) !== false){
echo $i." - You have inserted another row of data into the database.<br>";
    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) . "')"); 
 $i++;
}

fclose($handle);
4

1 に答える 1

0

$header を使用して値を $fields の順序にマップしているため、挿入には $header の順序ではなく $fields の順序でフィールドが必要です。

mysql_query("INSERT INTO csv (" . implode(',', $fields) . ") VALUES ('" . implode("','", $values) . "')");

また、適切にエスケープされるようにデータをサニタイズすることをお勧めします。

$values = array_map("mysql_real_escape_string", $values);

mysql_query 呼び出しがそれを行う前に。

また、反復ごとに $values を再初期化していないため、行 2 を挿入すると、行 1 + 行 2 のフィールドが取得されます。

そのため、 while ステートメントを開いた後、

$values = array();

再初期化します。

于 2013-07-09T15:39:50.767 に答える