Temat: Import danych do tabeli mysql z pliku
Faktycznie koleżanka nie wie co robi...
Na samym początku zastanowiłbym się co chcę osiągnąć. Piszesz o usuwaniu, dodawaniu i aktualizacji poszczególnych rekordów w tabeli którą założyłaś. Na końcu jednak zawsze kasujesz całą tabelę (DROP TABLE) i zakładasz nową o tej samej nazwie. Czy to jest twoim celem? Bo jeżeli tak to może po prostu nie baw się we wrzucanie danych do bazy tylko analizuj dane bezpośrednio z pliku.
W sumie to zastanowiłbym się czy mogę dane przetwarzać w inny sposób niż plik. Samo rozwiązanie z plikiem jest już mało eleganckim rozwiązaniem...
Proponuję:
1. Stworzyć tabelę
CREATE TABLE temptable (
`id` int(11) NOT NULL,
`name` varchar(200) NOT NULL,
`tag` varchar(200) NOT NULL,
`members` int(11) NOT NULL,
`villages` int(11) NOT NULL,
`points` int(11) NOT NULL,
`all_points` int(11) NOT NULL,
`rank` int(11) NOT NULL,
`active` boolean,
PRIMARY KEY (`id`)
);
2. Wykonać program w języku który znasz (PHP) który wrzuci dane w odpowiedni sposób
Program do wrzucania danych:
1. Weź plik o uporządkowanej strukturze tekstowej w którym jeden wiersz odpowiada jednemu wierszowi tabeli SQL a kolejne kolumny są rozdzielone jakimś znakiem przestankowym
2. Przeczytaj plik linia po linii i utwórz z niego tablicę
$array[iterator] = array( id, name, ..., rank)
Przydatna funkcja
/**
* Funkcja pobiera dane z zadanego pliku i przetwarza go do tablicy
* @param string $plik Sciezka do pliku
* @param string $separatorKolumny Znak podzialu na kolumny
* @param string $znakCytownia Znak cytowania danych w kolumnie. Jezeli nie zostanie podany to funkcja dziala bez naku cytowania
* @return array Tablica zawierajaca dane z pliku
*/
public function getFileCSV($plik, $separatorKolumny, $znakCytownia = NULL) {
$rows = array();
if (is_readable($plik) ) {
$handler = fopen($plik, 'r');
$iter = 0;
if ( isset( $znakCytownia ) ) {
while ( $stdrow = fgetcsv( $handler, NULL, $separatorKolumny, $znakCytownia) ) {
$rows[$iter] = $stdrow;
$iter += 1;
}
} else {
while ( $stdrow = fgetcsv( $handler, NULL, $separatorKolumny) ) {
$rows[$iter] = $stdrow;
$iter += 1;
}
}
}
return $rows;
}
3. Ustawiam wartość kolumny template.active na false
UPDATE template set active = false;
4. Przeglądam każdy wiersz z tablicy i sprawdzam czy wiersz o danym id istnieje w bazie danych w tabeli template
SELECT id FROM template WHERE id = {zmienna}
Jezeli nie znalazłem wiersza o podanym id to dodaję do tabeli nowy wiersz
INSERT INTO template(id, name, .., active) VALUES(1, 'test', .., TRUE);
UWAGA! Ważne aby kolumna active była ustawiona na TRUE.
Jeżeli znalazłem wiersz o podanym id to aktualizuje dane w nim zawarte danymi z pliku
UPDATE template SET kolumna = wartosc, active = TRUE WHERE id = {zmienna};
UWAGA! Ważne aby kolumna active była ustawiona na TRUE.
Na początku ustawiłem kolumnę active na false po to aby wiedzieć które rekordy zostały dodane lub zaktualizowane. template.active = false w tym momencie oznacza, że dany rekord nie znajdował się w pliku. Takie rekordy można posprzątać jeżeli jest taka potrzeba
DELETE FROM template WHERE active IS FALSE;
Ten post został edytowany przez Autora dnia 14.09.13 o godzinie 00:21