Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Improt danych z pliku csv do bazy
Forum PHP.pl > Forum > PHP
kosmic
witam ponownie....

zrobiłem mały formularz który służy do wyboru pliku z którego dane chcę importować do bazy, no i teraz mam dwie sprawy,bo chodzi o to by ten formularz mógł tylko plik csv obsługiwać, czyli jakby tylko z takiego pliku czytać...

pamiętam jak robiłem upload plików to ograniczałem sie np. do jpg gif i png, ale nie wiem jak to w przypadku csv zrobic questionmark.gif
choodzi tylko o tą dokładna formułkę questionmark.gif aby dobrze plik rozpoznawała funckja podczas sprawdzania zanim dodam do bazy questionmark.gif

a druga sprawa to taka, że w tym pliku są dane które zawieraja polskie znaki, no i jak zrobic aby z nimi zapisywał do bazy no i by potem wyświetlał poprawnie na stronie a nie jaieś krzaki questionmark.gif

questionmark.gif
Pilsener
1. Plik CSV uploadujesz jak każdy inny, ja to robię np. tak:
  1. if($_FILES['plik']['error'] == UPLOAD_ERR_OK){ //upload pliku
  2. $max_s = 1024*250; //maksymalny rozmiar pliku
  3. list($_temp,$rozsz) = explode(".",$_FILES['plik']['name']);
  4. if($rozsz<>'csv'){$post['error'][] = 'niepoprawny typ pliku';} //rozsz
  5. if($_FILES['plik']['type']<>'application/vnd.ms-excel'){$post['error'][] = 'niepoprawny typ pliku lub plik jest otwarty, zamknij wszystkie programy używaj&plusmn;ce tego pliku i spróbuj ponownie';} //mime
  6. if($_FILES['plik']['size']>$max_s){$post['error'][] = 'maks. rozmiar pliku wynosi '.($max_s/1024).'kb';}
  7. if(empty($post['error'])){ //zapisujemy plik
  8. if(!move_uploaded_file($_FILES['plik']['tmp_name'],'pliki/plik.csv')){
  9. $post['error'][] = 'nie udało się zapisać pliku na serwerze';
  10. }
  11. }
  12. }else{
  13. $post['error'][] = 'plik nie został przesłany - spróbuj ponownie';
  14. }
- pamiętaj o dodaniu odpowiednich typów MIME (ten odpowiada csv stworzonemu w ms excel) i walidacji samego pliku csv, czy zawiera poprawne dane. Warto też walidować plik już po przesłaniu na serwer:
http://pl.php.net/manual/pl/ref.fileinfo.php

2. Pamiętaj o znakach " które w pliku CSV są istotne, polecam funkcje typu:
http://pl.php.net/manual/pl/function.fgetcsv.php

3. Co do polskich znaków masz kilka wyjść:
- dodawać je w oryginalnym kodowaniu
- rozpoznawać kodowanie pliku i próbować zmienić kodowanie po stronie bazy
- rozpoznawać kodowanie pliku i próbować je zmienić po stronie PHP - polecam funkcje typu md_detect_encoding czy iconv
kosmic
no ok, coś naskrobałem, ale są problemy, otóż jak podaje plik z "reki" czyli po prostu wskazuje go bezpośrednio to wszystko działa,
ale jak poprzez formularz i tablice to nie wychwytuje pliku, a bardziej jego danych i nie działa mi aktualizacja ?

ktoś może pomóc?
  1. <?
  2. $index1 = $_POST['index1']; if (!$index1) $index1 = $_GET['index1'];
  3. $s_id = session_id();
  4. $f = $_FILES['new_file']; //tak nie działa
  5. //$f = file('Zeszyt1.csv'); -tak działa wszystko jak nalezy, pomijajac formularz
  6.  
  7. if(isset($_POST['send'])) {
  8. if(empty($f['name'])) {
  9. $message .= '<br/><font color="#ffffff">Musisz wybrać plik do aktualizacji danych</font><META HTTP-EQUIV="Refresh" CONTENT="2; URL=index.php?side=up_database&PHPSESSID='.$s_id.'">';
  10. } else {
  11. if($f['type'] == 'application/vnd.ms-excel') {
  12. list($_temp, $rozsz) = explode('.', $f['name']);
  13. if($rozsz<>'csv') {
  14. $message .= '<br/><font color="#ffffff">Wybrałeś nieprawidłowy typ pliku</font><META HTTP-EQUIV="Refresh" CONTENT="2; URL=index.php?side=up_database&PHPSESSID='.$s_id.'">';
  15. } else {
  16. $sql = @mysql_connect($dbhost, $dbuser, $dbpass) or die ('Brak polaczenia z baza danych');
  17. mysql_select_db($dbname) or die ('Wystapil problem z dostepem do bazy');
  18. $query = @mysql_query("SELECT id FROM baza");
  19. $row = mysql_num_rows($query);
  20. if ($row > 0) {
  21. $del_base = @mysql_query("TRUNCATE TABLE baza");
  22. for ($i=1; $i < count($f); $i++) {
  23. list($nr, $nazwa, $d1, $d2) = explode(';', $f[$i]);
  24. echo 'jjj';
  25. echo 'INSERT INTO `baza` VALUES('.$nr.', '.$nazwa.', '.trim(str_replace(".", "", $d1)).', '.trim(str_replace(".", "", $d2)).')<br/>';
  26. $nd1 = trim(str_replace(".", "", $d1));
  27. $nd2 = trim(str_replace(".", "", $d2));
  28. $add = mysql_query("INSERT INTO baza (nr_klienta,nazwa,dane1,dane2) VALUES ('$nr','$nazwa','$nd1','$nd2')") or die ('Bląd bazy');
  29. }
  30. $message .= '<font color="#ffffff"><br/>Dane zostały zaktualizowane poprawnie</font><META HTTP-EQUIV="Refresh" CONTENT="20; URL=index.php?side=up_database&PHPSESSID='.$s_id.'"></center>';
  31. } else {
  32. for ($i=1; $i < count($f); $i++) {
  33. list($nr, $nazwa, $d1, $d2) = explode(';', $f[$i]);
  34. //echo 'INSERT INTO `tabela` VALUES('.$nr.', '.$nazwa.', '.trim(str_replace(".", "", $d1)).', '.trim(str_replace(".", "", $d2)).')<br/>';
  35. $nd1 = trim(str_replace(".", "", $d1));
  36. $nd2 = trim(str_replace(".", "", $d2));
  37. $add = mysql_query("INSERT INTO baza (nr_klienta,nazwa,dane1,dane2) VALUES ('$nr','$nazwa','$nd1','$nd2')") or die ('Bląd bazy');
  38. }
  39. $message .= '<font color="#ffffff"><br/>Dane zostały zaktualizowane poprawnie</font><META HTTP-EQUIV="Refresh" CONTENT="2; URL=index.php?side=up_database&PHPSESSID='.$s_id.'"></center>';
  40. }
  41. }
  42. } else {
  43. $message .= '<font color="#ffffff"><br/>Wybrany przez Ciebie plik nie jest odpowiednim plikiem danych.</font><META HTTP-EQUIV="Refresh" CONTENT="3; URL=index.php?side=up_database&PHPSESSID='.$s_id.'">';
  44. }
  45. }
  46. }
  47. ?>


dlaczego tak jest questionmark.gif
Pilsener
1. Używaj odpowiedniego bbcode
2. Zamiast używać file lepiej użyć while+feof, przy dużych plikach Twój sposób nie przejdzie, poza tym po co w pętle dajesz count? Po co liczyć liczbę elementów tablicy przy każdym obrocie pętli?
  1. $uchwyt = fopen($plik,rb);
  2. while(!feof($uchwyt)){
  3. $linia = fgets($uchwyt);
  4. echo $linia.'<br />';
  5. }
- o wiele wydajniejszy sposób, niż ładowanie całego pliku do pamięci
3. Zamiast dodawać każdy rekord w pliku nie prościej dodać cały plik LOAD DATA INFILE? Jeśli dane wymagają obróbki to zapisać to, co ma lecieć do bazy w oddzielnym pliku a potem dodać za jednym razem cały plik. Po co katować bazę?
4.
  1. list($nr, $nazwa, $d1, $d2) = explode(';', $f[$i]);
- a co gdy w nazwie wystąpi znak ;? Są specjalne funkcje do parsowania plików csv, plik należy też bezwzględnie walidować, bo Ci ktoś zaraz rozwali bazę (choćby przez pomyłkę używając znaków specjalnych w nazwie czegoś tam)
5.
  1. $f = $_FILES['new_file']; //tak nie działa
- bo $f nie jest tablicą
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.