Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP] Zapis danych z uploadowanego pliku w bazie, Wydobycie odpowiednich danych z pliku
aisha
post
Post #1





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 14.02.2017

Ostrzeżenie: (0%)
-----


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.











Go to the top of the page
+Quote Post
trzczy
post
Post #2





Grupa: Zarejestrowani
Postów: 460
Pomógł: 49
Dołączył: 5.06.2011

Ostrzeżenie: (0%)
-----


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ą.
Go to the top of the page
+Quote Post
aisha
post
Post #3





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 14.02.2017

Ostrzeżenie: (0%)
-----


Definicje umieściłam, zastosowałam, jest super. Pięknie czyści wszystko. Dziękuje !
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 05:19