Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][sql]
Forum PHP.pl > Forum > Przedszkole
kozioł
Witam ,

czy mozna zrobić tak , aby zasilic bazę SQL wskazując na plik np . txt ?

chodzi mi o to że chcę cyklicznie zasilać bazę sql , ale danę pierwotne mam w ACCESS-e , i zawsze bedzie tak że najpierw ACESS , a potem z tego muszę dane umieścić w tabeli w SQL-u.


dziękuję za pomoc



pozdrawiam
kossa
Można.

Najlepiej stwórz plik CSV, dane rozdziel średnikami i "wciągnij" taki plik do skryptu php, parsuj po średnikach (każdy rekord to nowa linia) i na podstawie danych z pliku utwórz zapytanie sql, wykonaj je i przejdź do kolejnej linii aż do uzyskania końca pliku. Poczytaj w manualu o funkcjach php dot. csv.

Łukasz
kozioł
ok ,

pokombinuję ,

a wcześniej zajrzę do manuala



dzięki za wskazówki

więc tak ,

mam taki skrypt:

  1. <?php
  2. $fieldseparator = ";";
  3. $lineseparator = "\n";
  4.  
  5. $csvfile = "csv.csv"; //jak zrobie tak to jest ok//
  6. $csvfile = $_POST['plik']; //ale to juz mi nie działa , info. nie znaleziono pliku//
  7.  
  8. $save = 1;
  9.  
  10.  
  11. if(!file_exists($csvfile)) {
  12. echo "nie znaleziono pliku.\n";
  13. }
  14.  
  15. $file = fopen($csvfile,"r");
  16.  
  17. if(!$file) {
  18. echo "nie mogę otworzyc pliku.\n";
  19. }
  20.  
  21. $size = filesize($csvfile);
  22.  
  23. if(!$size) {
  24. echo "pusty plik.\n";
  25. }
  26.  
  27. $csvcontent = fread($file,$size);
  28.  
  29. fclose($file);
  30.  
  31. $conn = mysql_connect("localhost", "root", "vertrigo") or die(mysql_error());
  32. mysql_select_db("bazy",$conn) or die ("nie mogę połączyć z bazą");
  33.  
  34. $lines = 0;
  35. $queries = "";
  36. $linearray = array();
  37.  
  38. foreach(split($lineseparator,$csvcontent) as $line) {
  39.  
  40. $lines++;
  41.  
  42. $line = trim($line,\t");
  43.  
  44. $line = str_replace("r","",$line);
  45.  
  46.  
  47. $line = str_replace("'","'",$line);
  48.  
  49.  
  50. $linearray = explode($fieldseparator,$line);
  51.  
  52. $linemysql = implode("','",$linearray);
  53.  
  54.  
  55. $query = "insert into baza values('$linemysql');";
  56.  
  57.  
  58. $queries .= $query . "\n";
  59.  
  60. mysql_query($query);
  61. }
  62.  
  63.  
  64.  
  65. echo "dopisano $lines pozycje.\n";
  66.  
  67.  
  68. ?>



i nie wiem jak zrobic tak żeby działało , żeby wbrać w formularzy plik z dowolnej lokalizacji na dysku i przesłać go POST-em do tego skryptu ,


nazwa pliku przechodzi (sprawdzałem) , inne dane z formularza też. Ale mam informację że pliku nie odnaleziono. Gdy wpiszę na stałe nazwę pliku to działa , i dane zapisują się do bazy sql.



dziękuję z apomoc



pozdrawiam
nevt
przyjacielu drogi.... wrzuć w google 'MySQL LOAD DATA INFILE" a odpowiedź na swe pytanie wnet znajdziesz...

powodzenia
kozioł
dieki za podpowiedź odnośnie tego polecenia sql ,



znalzłem ,kilka przykładów , i chyba żeczywiście tak jest najszybciej wprowadzic dane z pliku do bazy ,

ale wszędzie tam (w przykładach) , dostep do pliku jest podawany w skrypcie na stałe , a ja chcę go wskazywać przez formularz , gdzie wybieram sobie dwolny plik csv na swoim dysku w dowolnym miejscu.

mniej więcej tak:

  1. <?php
  2. <input name="plik" type="file" /><br />
  3. <input type="submit" value="Wyślij plik">
  4. ?>



jak zwykle dziękuję za pomoc
dadexix
do tego użyj tablicy $_FILES a nie $_POST
kozioł
zmodyfikowałem ten skrypt co na początku , skorzystrałem z Waszej rady i odebrałem nazwę pliku i ścięzke przez FILE_

no i dane z pliku ładnie wczytują się do bazy. Jednak jak dałem sobie sprawdzenie w skrypcie to mam taki komunikat:

  1. Wykonanie zapytania nie powiodło się: COLUMN count doesn't match value count at row 1


nie mam pojęcia co to oznacza , ale dane się zapisują.

Mam jeszcze jedna prosbę , bo razem z tym plikiem dodatkowo dopisuję inne wartości do tej bazy (są to dane ukryte) , one też się wpisują ,

ale za żadne skarby nie mogę dodać daty

robię cos takiego:
  1. <?php
  2. $query = "insert into baza(id,numer,rodzaj,wydajacy,datawyd,jednostka,hdw,uwagi) values('$linemysql','$rodzaj','$nazwisko','$data','$jednostka','$hdw','$uwagi');";
  3. ?>


a wcześniej zmienną data definiuję tak:

  1. <?php
  2. $D = date('d');
  3. $M = date('m');
  4. $R = date('Y');
  5.  
  6. $data = mktime ($M,$D,$R);
  7. ?>


w bazie pole mam ustawione na DATE , i nic sie nie wpisuje data w bazie zawsze to 0000-00-00



dzięki za pomoc
dadexix
Wykonanie zapytania nie powiodło się: Column count doesn't match value count at row 1

jak dobrze pamiętam oznacza to że próbujesz wypełnić pole o nazwie "count" którego nie ma lub nie ypełniasz go a jest to wymagane...

co do drugiego... jak byś poprostu dał pole liczbowe i w nim przechwowywał date w formacie unixowym?

lecz chyba problem polega na tym że źle podajesz datę w funkcji mktime" title="Zobacz w manualu PHP" target="_manual zobacz do manuala

Kod
$data = mktime (0,0,0,$M,$D,$R);


tak powinno śmigać... chyba:P
kozioł
ok ,

z datą już sobie poradziłem , guitar.gif

ale z tym błędem nie daję rady sciana.gif
dadexix
a jakie dajesz zapytanie i jaka jest struktura bazy?
nevt
przecież kolega kozioł podał zapytanie:
  1. INSERT INTO baza(id,numer,rodzaj,wydajacy,datawyd,jednostka,hdw,uwagi) VALUES('$linemysql','$rodzaj','$nazwisko','$data','$jednostka','$hdw','$uwagi');

I jakiś durny komunikat z COUNT w treści dostaje... - a jak policzyć - to robi INSERT na 8 POLACH podając 7 VALUES... Więc MUSI się nie zgadzać.

Podejrzewam, że pole `id` jest AUTOINCREMENT, więc wystarczy zmienić na:
  1. INSERT INTO baza (numer, rodzaj, wydajacy, datawyd, jednostka, hdw, uwagi)
  2. VALUES ('$linemysql', '$rodzaj', '$nazwisko', '$data', '$jednostka', '$hdw', '$uwagi');

Powinno pomóc, powodzenia.
kozioł
niestety nie to nie pomogło

może dlatego że w tej zmiennej '$linemysql' mam dwie kolumny , bo to są dane z pliku csv , i zawsze będzie tak że zmiennych deklarowanych bedzie mniej niż pól deklarowanychw bazie , choć nie wiem czy to jest problem ,

chyba wywale te sprawdzanie ,
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.