Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] i [mysql] wrzucenienie danych z txt do mysql
Forum PHP.pl > Forum > Przedszkole
gladiror
Witam!
Mam plik, który zawiera nastepujace dane:

"SZT" "AKUM. PANASONIC P-6P/4B PR R6/2100 NIMH" "0101-99017" "22" 6,74 9,50 12,000 "BAT" "SKL"
"SZT" "AKUMULATOR CAMELION R6 NC-AA800-B4" "0710-01002" "22" 2,59 3,60 16,000 "BAT" "SKL"

Każda nazwa jest od siebie oddzielona tabulatorem. Jest 9 nazw w 1 wierszu, w drugim tez 9 itd. Jak takie coś wrzucić do bazy danych zeby SZT byla w kolumnie ze SZT, nazwa wyrobu tez w jednej kolumnie itd.questionmark.gif

Chodzi mi o to, ze wklejam do textarea cala zawartosc pliku, klikam wyslij i dane zostana wrzucone do bazy danych...

Prosze o jakąś pomoc...
nasty
A czy te dane beda wklejane w odpowiednum porzadku czy skrypt ma sie domyslac co gdzie i jak ... ?
gladiror
Maja byc wklejane w odpowiednim porzadku, to znaczy:

"SZT"
"AKUM. PANASONIC P-6P/4B PR R6/2100 NIMH"
"0101-99017"
"22"
6,74
9,50
12,000
"BAT"
"SKL"

"SZT"
"AKUMULATOR CAMELION R6 NC-AA800-B4"
"0710-01002"
"22"
2,59
3,60
16,000
"BAT"
"SKL"


Po kolei kazdy wiersz ma ten sam porzadnek.
krzyszbi
uzyj explode po tabulatorze \t dostaniesz dane w tablicy a z tymchyba sobie poradzisz
Ludvik
Więc robisz to w następujący sposób. Najpierw pobierasz dane z pliku funkcją file" title="Zobacz w manualu php" target="_manual. Każdy element tablicy odpowiada jednemu wierszowi. Następnie musisz rozdzielić dane we wszystkich wierszach. Do tego służy funkcja explode" title="Zobacz w manualu php" target="_manual. Wygląda to mniej więcej tak do tej pory:
  1. <?php
  2. $elements = file('nazwa_pliku');
  3.  
  4. for ($i = 0, $rows = count($elements); $i < $rows; $i++) {
  5. $elements = explode("t", $elements);
  6. }
  7. ?>

W tej chwili każdy element tablicy $elements ma pola od 0 do 8, gdzie każde pole odpowiada kolejnym kolumnom. Wypadało by jeszcze usunąć cudzysłowy przed wstawieniem danych. Żeby nie męczyć się z każdym polem osobno, zrobimy sobie tablicę z numerami pól, w których dane są zamknięte w cudzysłowy. Nasza pętla będzie wyglądać tak:
  1. <?php
  2. $quoted = array(0, 1, 2, 3, 7, 8);
  3.  
  4. for ($i = 0, $rows = count($elements); $i < $rows; $i++) {
  5. $elements[$i] = explode("t", $elements[$i]);
  6. foreach ($quoted as $quoted_column) {
  7. $str &= $elements[$i][$quoted_column];
  8.  $str = substr($str, 1, strlen($str) - 2);
  9. }
  10. }
  11. ?>

Teraz na końcu pętli for możesz dodać zapytanie, które wstawi sobie te dane. Podglądnij sobie sytuację funkcją var_dump" title="Zobacz w manualu php" target="_manual.
nospor
Cytat
Więc robisz to w następujący sposób. Najpierw pobierasz dane z pliku funkcją file
To nie jest plik tylko textarea smile.gif Jesli to mialby byc plik to jest bardzo szybka metoda:
http://forum.php.pl/index.php?showtopic=49...=0&#entry273398
Ludvik
Też racja, ale czy MySQL usunie cudzysłowy? Za bardzo nie zajmowałem się importem w MySQL, natomiast pgsql chyba nie ujmował łańcuchów znakowych w cudzysłowy.

Nie doczytałem, że to textarea... smile.gif Wtedy zamieniasz pierwszą instrukcję na
  1. <?php
  2. $elements = explode("n", $pole_z_danymi);
  3. ?>
nospor
Cytat
Też racja, ale czy MySQL usunie cudzysłowy?
Teoretycznie ta opcja powinna pomoc:
ENCLOSED BY

ale nie testowalem ino wyczytalem w manualu smile.gif
gladiror
Nospor - zmieniłem ten kod dla własnych potrzeb, ale coś nie chce wrzucić mi danych do bazy... Nie wyskakuje żaden błąd.

Dane są zapisywane w pliku jak powyżej. Może cudzysłowy robią problem??
nospor
no jakis blad musi wyskakiwac. ty to robisz z poziomu php? a dales mysql_error() ?
gladiror
Zrobilem cos takiego:

  1. <form action="index.php">
  2. <input type="File" name="plik">
  3. <input type="submit" name="submit">
  4. </form>


  1. <?
  2. if(isset($submit))
  3. {
  4. $dbh=mysql_connect ("localhost", "bigd_t", "") or die ('I cannot connect to the database because: ' . mysql_error());
  5. mysql_select_db ("bigd_t"); 
  6.  
  7. $zapytanie = "LOAD DATA INFILE '$plik' INTO TABLE artykuly (symbol_jm,nazwa_art,symbol_art,nazwa_vat,cena1,cena2,zapas,keteg_aso,grupa_
    zam)FIELDS TERMINATED BY ' '  LINES TERMINATED BY 'n'"
    ;
  8. $wykonaj = mysql_query($zapytanie);
  9.  
  10. }
  11. ?>
nospor
no mowilem zebys dal mysql_error()...
  1. <?php
  2. $wykonaj = mysql_query($zapytanie) or die(mysql_error());
  3. ?>


pozatym zarzuc zapytanie tworzate tabele. poteszcze u siebie
edit: pozatym do pliku co uploudujesz to sie dobera inaczej. poczytaj se cos o uplodzie (najlepiej w manualu smile.gif )
gladiror
Taki błąd wyskoczył:

You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'FIELDS TERMINATED BY ' ' LINES TERMINATED BY ' '' at line 1
nospor
z tego co wyczytalem w manualu, to lista kolumn musi byc na koncu. pozaty miales pare bugow w zapytaniu
  1. LOAD DATA INFILE 'ala' INTO TABLE artykuly
  2. FIELDS TERMINATED BY ' ' LINES TERMINATED BY '\n'
  3. (symbol_jm,nazwa_art,symbol_art,nazwa_vat,cena1,cena2,zapas,keteg_aso,grupa_zam);

no i pozatym jak ci pisalem zle pobierasz plik
gladiror
Do pobierania pliku mam użyć funkcji is_uploaded_file questionmark.gif

Co oznacza 'ala' w LOAD DATA INFILE 'ala' questionmark.gifquestionmark.gif Czyżby nazwe pliku??
nospor
Cytat
Co oznacza 'ala' w LOAD DATA INFILE 'ala' questionmark.gifquestionmark.gif
no to zes mnie zagial... 'ala' to nazwa pliku. wstawilem sobie do testow. przeciez ja nie mam twojej zmiennej $plik, nieprawdaz?

Co do uploadu i dobieranie sie do plikow:
http://pl.php.net/manual/pl/features.file-upload.php
Ludvik
Nie wiem czy php obsługuje to, ale jest słowo kluczowe LOCAL, które przesyła plik do serwera z maszyny klienta. Jeżeli serwer stoi na maszynie klienta to podajesz ścieżkę bezwzględną do pliku, żeby nie było problemu. Rozdzielanie tabulatorami i znakami nowej linii jest domyślnie ustawione. Dodałem obsługę tych cudzysłowów.
  1. LOAD DATA LOCAL INFILE 'sciezka_do_pliku' INTO TABLE artykuly OPTIONALLY ENCLOSED BY '"'
  2. (symbol_jm,nazwa_art,symbol_art,nazwa_vat,cena1,cena2,zapas,keteg_aso,grupa_zam);

Sprawdź to...
gladiror
Ludvik - i to bedzie działało na serwerze w necie??
Ludvik
Szczerze mówiąc to wątpię, żeby rozszerzenie mysql w php obsługiwało słowo kluczowe LOCAL. Póki co, to nie mam gdzie sprawdzić czy to działa. Tak czy inaczej nawet z pominięciem LOCAL możesz umieścić plik na serwerze, gdzie stoi baza danych (zwykle na tej samej maszynie stoi serwer http) i podać po prostu bezwzględną ścieżkę do niego.

Musisz po prostu popróbować i poczytać manual MySQL.
gladiror
Mi nie działa to...

Nospor - jeżeli chodzi o ten upload to nie mozna dac normalnie ściezki do pliku pod zmienna? Kiedys tak robilem i bez problemu kopiowalo mi zdjęcia na serwer...
nospor
Cytat
Nospor - jeżeli chodzi o ten upload to nie mozna dac normalnie ściezki do pliku pod zmienna? Kiedys tak robilem i bez problemu kopiowalo mi zdjęcia na serwer...

No po stronie klienta tak wlasnie robisz. podajesz plik ktory chcesz uplodowac. ale po stronie serwera musisz sie do niego specjalnie dobrac tak jak w manualu jest napisane.
No ale jesli nie wierzysz to rob jak miales i powiedz czy ci sie upload zrobil i czy na serwerze widzisz pod zmienna $plik swoj plik. smile.gif
gladiror
Ale mi chodzi o to, ze plik mam u siebie na komputerze, daje ścieżke na serwrze do pliku, np: c"\asda\plik.txt". Bo chodzi o to, ze z pliku klienta ma pobierać dane (to nie musi byc zabezpieczone w zaden sposob). W tym wypadku też muszę korzystać z tego co jest napisane w manualu?

BO w tej chwili wyskakuja mi blad:

Access denied for user: 'bigd_t@localhost' (Using password: YES)
nospor
Cytat
Ale mi chodzi o to, ze plik mam u siebie na komputerze
A to ttrzeba bylo tak od razu. no ale zmylilo mnie to ze ty ten plik uplodowales.
No nie wazne. sek w tym ze chyba mysql nie pozwoli ci pobraz pliku z zewnetrznej sciezki. plik musi znajdowac sie w katalogu mysql/bazy danych. Przynajmniej mi sie inaczej nie udalo. Tak wiec to chyba konczy sprawe sad.gif
Albo ja dzis na tyle zamotany jestem ze cos przeoczylem

edit: co do errora to wyraznie ci napisalo ze user ktorego uzywasz nie ma praw
gladiror
Nadałem uzytkownikowi prawa:

bigd_usert (Privileges: ALL PRIVILEGES)

Connection Strings
Perl $dbh = DBI->connect("DBI:mysql:bigd_t:localhost","bigd_usert","<PASSWORD HERE>");
php $dbh=mysql_connect ("localhost", "bigd_usert", "<PASSWORD HERE>") or die ('I cannot connect to the database because: ' . mysql_error());
mysql_select_db ("bigd_t");

i dalej wyskakuje blad:

Access denied for user: 'bigd_usert@localhost' (Using password: YES)

Cos jest nie tak..
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.