Невозможно отправить данные файла csv в соответствующие поля базы данных с помощью PHP

В настоящее время я пытаюсь загрузить файл CSV и ввести каждую запись в базу данных 1 на 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++;

}

?>

person AyeTry    schedule 08.07.2013    source источник
comment
просто для записи использование функций mysql_* не рекомендуется из-за устаревания.   -  person SamHuckaby    schedule 09.07.2013
comment
Это просто обучение, оно не будет жить на веб-сайте.   -  person AyeTry    schedule 09.07.2013
comment
Все-таки полезно поучиться хорошей практике ;-)   -  person SamHuckaby    schedule 09.07.2013
comment
Да, вы правы, хотя, лол, у вас есть идеи о том, что может быть не так, учитывая предоставленный код?   -  person AyeTry    schedule 09.07.2013
comment
Как узнать в CSV-файле, в каком порядке находятся данные?   -  person    schedule 09.07.2013
comment
Это то, что я имею в виду. Поскольку я не могу полагаться на то, что пользователь всегда будет иметь столбцы CSV в правильном порядке, как мне это сделать?   -  person AyeTry    schedule 09.07.2013
comment
магия? звучит как ситуация, когда вы даете инструкции, и если пользователь их нарушает, это их проблема, а не ваша   -  person    schedule 09.07.2013
comment
Обратите внимание, что fgetcsv() возвращает только одну ROW данных. если ваш csv имеет несколько строк, вы будете игнорировать все, кроме первого. Вы также уязвимы для атак с внедрением кода SQL через этот файл.   -  person Marc B    schedule 09.07.2013
comment
Можете ли вы полагаться на то, что строка заголовка а) присутствует и б) верна? Если это так, вы можете сопоставить заголовки из первой строки со структурой вашей базы данных.   -  person    schedule 09.07.2013
comment
Что ж, я мог бы полагаться на то, что имя заголовка всегда будет правильным, но не всегда присутствует, поскольку может быть только частичная информация. Например. кто-то может указать свое имя, адрес электронной почты, а другой может включить только столбец для своего имени.   -  person AyeTry    schedule 09.07.2013


Ответы (2)


Код, который вы используете для вставки записей, здесь не работает:

$i = 0;

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

// do stuff

}
person Community    schedule 08.07.2013

Правильный файл 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-инъекций. Пожалуйста, забудьте о mysql_query и научитесь использовать PDO.

person SebiF    schedule 08.07.2013
comment
Я пробовал это, но, к сожалению, это не работает, просто показывает пустой белый экран и ничего не вставляется в базу данных. Было бы здорово, если бы вы еще раз просмотрели код, хорошо? - person AyeTry; 09.07.2013
comment
То, что вывода нет, это нормально, так как нет эха или чего-то еще. Однако я исправил небольшую ошибку, отсутствующую array_keys. Я протестировал его с помощью образца CSV и получил красивый SQL, который должен был работать. Вы можете заменить mysql_query(...) на echo ... и посмотреть, что он пытается вставить. Не забудьте вставить вышеупомянутый array_keys. - person SebiF; 09.07.2013