Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Zapis danych z uploadowanego pliku w bazie
Forum PHP.pl > Forum > Przedszkole
aisha
Dzień dobry, potrzebuje pomocy, jakiejś porady, wskazówek.

Ogólnie potrzebuje wrzucić do bazy dane z pliku tekstowego, który jest wrzucany przez użytkownika.

Problem pojawia się w tym, że do bazy mają trafić dane z tym, że:
a) nie wszystkie jakie są w pliku
cool.gif dane "wyłuskane" mają trafić do różnych tabel w bazie.


Poprawny "format" pliku jaki powinien być wczytywany do bazy w środku wygląda tak i ma rozszerzenie .txt (zdjęcie 1):
Formatowanie pliku powinno wyglądać tak, że: Przed żadną z linijek nie ma spacji, po każdym i przed każdym słowem jest tylko jedna spacja. Miedzy linijkami w pliku nie ma pustych wierszy. po słowie Attrubutes nazwy nie mogą zawierać polskich znaków i spacji.

http://ifotos.pl/zobacz/wygladpli_qnpraqh.jpg


Plik jaki może się trafić może wyglądać tak(zdjęcie 2):

http://ifotos.pl/zobacz/wygad-pli_qnpraas.jpg


W ramkach zaznaczyłam dane, które powinny trafić do tabel bazy (różne kolory oznaczają różne tabele).

Zrobiłam upload gdzie plik jest odbierany tak jak być powinien.


Moim pierwszym pomysłem było zrobienie wyłuskania danych znajdujących się po "słowach kluczowych" (TABLE, ATTRIBUTES,OBJECTS itd) w ten sposób, że:
Po pliku poruszam się za pomocą wskaźnika.


  1. $wskaznik = fopen($_FILES['plik']['name'], "r");


I dalej (wiem, że mało profesjonalnie) trochę metodą na cwaniaka wyłuskuje to co mi potrzebne.

  1. $pierwsza_linijka_z_nazwa_tabeli = trim(fgets($wskaznik));
  2. $nazwa_tabeli = substr($pierwsza_linijka_z_nazwa_tabeli,6);
  3. echo "nazwa tablicy:$nazwa_tabeli "; echo "</br>";
  4. mysql_query ("INSERT INTO tabela(nazwa_tabeli,users_id_usera) VALUES ('$nazwa_tabeli','$id_usera')");
  5. $tabela_id_tabeli = mysql_insert_id();
  6.  
  7. $linijka_zawierajaca_liczbe_atrybutow = trim(fgets($wskaznik));
  8. $liczba_atrybutow = substr($linijka_zawierajaca_liczbe_atrybutow,11);
  9. echo "liczba atrybutow:$liczba_atrybutow "; echo "</br>";
  10.  
  11. for ($i = 1; $i <= $liczba_atrybutow; $i++) {
  12. $atrybut = trim(fgets($wskaznik));
  13. $nazwa_atrybutu = explode(" ", $atrybut);
  14.  
  15. mysql_query ("INSERT INTO atrybut(tabela_id_tabeli, nazwa_atrybutu, typ, nr_kolumny ) VALUES('$tabela_id_tabeli', '$nazwa_atrybutu[0]' , '$nazwa_atrybutu[1]','$i')");
  16. echo "nazwa atrybutu:$nazwa_atrybutu[0] ";
  17. echo "$nazwa_atrybutu[1] "; echo "</br>";
  18.  
  19.  
  20. if($i == $liczba_atrybutow)
  21. $linijka_zawierajaca_liczbe_obiektow = trim(fgets($wskaznik));
  22. $nazwa_obiektu = substr($linijka_zawierajaca_liczbe_obiektow,8);
  23.  
  24. }
  25. echo "liczba obektow:$nazwa_obiektu "; echo "</br>";
  26.  
  27.  
  28. //pętla wstawiająca do bazy liczby od 1 do liczby obiektów, bo obiekt musi mieć swoją nazwę
  29. for ($no = 1; $no <= $nazwa_obiektu; $no++) {
  30. mysql_query ( "INSERT INTO obiekt (tabela_id_tabeli, nazwa_obiektu) VALUES('$tabela_id_tabeli', '$no')");
  31. }
  32.  
  33. while (($wartosci = fgets($wskaznik)) !== false) {
  34. $nazwa_wartosci = explode(" ", $wartosci);
  35.  
  36. for($i = 0; $i< $liczba_atrybutow; $i ++) {
  37. mysql_query ("INSERT INTO testwar (atrybut_id_atrybutu, obiekt_id_obiektu, wartosc)
  38. SELECT atrybut.id_atrybutu, obiekt.id_obiektu, $nazwa_wartosci[$i]
  39. FROM atrybut, obiekt
  40. WHERE atrybut.tabela_id_tabeli = $tabela_id_tabeli AND obiekt.tabela_id_tabeli = $tabela_id_tabeli limit 1");
  41. }
  42.  
  43. echo "nazwa wartosci:$nazwa_wartosci[$i] "; echo "</br>";
  44.  
  45. }
  46.  
  47. }
  48.  
  49.  


Ogólnie na tą chwile wyciąganie danych jakie są mi potrzebne działa a dane są zapisywane do bazy tak jak być powinny,
ale tylko i wyłącznie wtedy kiedy plik wygląda jak na zdjęciu nr 1.

W momencie pojawienia się więcej niż jednej spacji czy entera dodawanie do bazy zaczyna się rozjeżdżać i dodają się poucinane fragmenty z pliku.

Niestety jak wiadomo jeśli użytkownik dodaje plik może okazać się, że w pliku po słowach kluczowych czy wartościach od 1 do 24 są puste linie lub więcej spacji i teraz moje pytanie brzmi jak rozwiązać taką sytuacje?

Jak wczytać dane z pliku w sposób profesjonalny ? W sposób, który uchroni mnie przed wczytaniem do bazy głupot? Jak zabezpieczyć się przed wczytaniem pliku który ma format jak na zdjęciu drugim?


Wszystkie porady i linki do pomocnych tematów mile widziane. Jeśli coś napisałam niejasno chętnie doprecyzuje to co jest niezrozumiałe.











trzczy
Po każdym swoim użyciu fgets przefiltruj stringa moją funkcją:
  1. <?php
  2. $line = ' Attribute1.2 numeric O ';
  3. function normSpace($line) {
  4. preg_match_all('/[\w\d\.]+/', $line, $line);
  5. return implode(' ', $line[0]);
  6. }
  7. var_dump(normSpace($line));//string(22) "Attribute1.2 numeric O"

https://3v4l.org/vacjP
Znaczy się definicję tej funkcji umieść na początku, a potem ją stosuj. Funkcja ta czyści linijki z dodatkowych spacji i innych znaków niebędących kropką, liczbą i cyfrą.
aisha
Definicje umieściłam, zastosowałam, jest super. Pięknie czyści wszystko. Dziękuje !
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.